身份2.0登录尝试无效
本文关键字:无效 登录 身份 | 更新日期: 2023-09-27 18:02:51
由于某种原因,我还没有发现,但在成功注册和激活后,我无法登录电子邮件地址,而是得到一个错误"无效登录尝试"。
ASP。. NET Identity 2.0已经改进了使用电子邮件登录,我已经修改了注册表单,以实际存储一个真正的用户名,因为现有的注册似乎只是通过存储用户名和电子邮件地址来复制。
请参阅Install-Package Microsoft.AspNet.Identity.Samples -Pre'
在创建空ASP后附带的标准代码。. NET Web Application (MVC)项目:
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
我现在的功能如下:
var user = new ApplicationUser { TitleId = model.TitleId, SexId = model.SexId, Forename = model.Forename, Surname = model.Surname, UserName = model.UserName, Email = model.Email, JoinDate = System.DateTime.Now };
如您所见,UserName现在从表单接收一个值。这一切都很好,除了现在我不能登录后注册和激活。唯一的工作是通过将Email字段的值放入UserName字段来修改记录,这看起来很愚蠢。
谁能告诉我我可能错过了什么?您必须修改SignInHelper.PasswordSignIn
方法。默认情况下,它使用FindByNameAsync
来检查给定名称的用户是否存在:
public async Task<SignInStatus> PasswordSignIn(string userName, string password, bool isPersistent, bool shouldLockout)
{
var user = await UserManager.FindByNameAsync(userName);
// (...)
将其改为使用FindByEmailAsync
:
var user = await UserManager.FindByEmailAsync(userName);
您可以在*AppCode'IdentityConfig.cs文件中找到SignInHelper
类
在类AccountController.cs中,方法:public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
。修改:
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
:
try
{
var user = db.Users.Where(u => u.Email.Equals(model.Email)).Single(); // where db is ApplicationDbContext instance
var result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, shouldLockout: false);
}
catch (InvalidOperationException)
{
// the user is not exist
}
原因是UserName
和UserEmail
有不同的值,但PasswordSignInAsync
方法只使用UserName
来检查登录
我也有同样的问题,但我发现解决方案是将Marcin的公认答案和Hai的答案结合起来。在AccountController.cs
中,您需要使用FindByEmailAsync()
而不是FindByNameAsync()
,然后使用SignInManager.PasswordSignInAsync()
,但使用user.UserName
的值作为第一个参数(只要user
不为空),而不是model.Email
。因此,根据当前的锅炉板代码,完整的答案应该是这样的:
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
// (...) ModelState.IsValid, etc
string user_name = ""; // in case 'user' is null (user not found)
var user = await UserManager.FindByEmailAsync(model.Email);
if (user != null)
{
user_name = user.UserName;
if (!await UserManager.IsEmailConfirmedAsync(user.Id))
{
// (...) Require the user to have a confirmed email before they can log on, etc
}
}
// don't use model.Email below, use the value from user.UserName (if user not null)
var result = await SignInManager.PasswordSignInAsync(user_name, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
// (...)
您可以尝试在项目中更改Startup.cs文件中的bool值。"真正→false"在这一行中,services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)
尝试编辑RequireConfirmedAccount"选项来自"true"在程序课上,它对我起作用了。
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)
.AddEntityFrameworkStores<ApplicationDbContext>();
如果您使用默认的身份验证代码生成,在启动文件中您可能会看到以下代码:
services.AddDefaultIdentity<addition>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
代码强制你使用电子邮件确认,如果你没有这样做,你会得到"Invalid login attempt"误差