Identity 2.0无效的登录尝试

时间:2014-05-12 16:23:04

标签: c# asp.net-mvc-5 asp.net-identity-2

出于某种原因,我还没有发现,但在注册和激活成功后,我无法使用电子邮件地址登录,而是收到“无效登录尝试”错误。

由于使用电子邮件登录改进了ASP.NET Identity 2.0,我已经修改了注册表单以实际存储真实用户名,因为现有注册似乎通过将用户名与电子邮件地址一起存储来复制。

在创建空的ASP.NET Web应用程序(MVC)项目之后,请参阅下面Install-Package Microsoft.AspNet.Identity.Samples -Pre'附带的标准代码:

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现在从表单接收值。这一切都很好,除了现在我注册和激活后无法登录。唯一的工作是通过将电子邮件字段中的值放入UserName字段来修改记录,这个字段似乎很愚蠢。

有人可以告诉我可能错过了什么吗?

4 个答案:

答案 0 :(得分:9)

您必须修改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类。

答案 1 :(得分:4)

在课程 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
}

原因是UserNameUserEmail具有不同的值,但方法PasswordSignInAsync仅使用UserName来检查登录。

答案 2 :(得分:3)

我有同样的问题,但发现解决方案是Marcin接受的答案和Hai的答案的组合。在AccountController.cs中,您需要使用FindByEmailAsync()而不是FindByNameAsync(),然后使用SignInManager.PasswordSignInAsync(),但使用user.UserName的值作为第一个参数(只要{ {1}}不是null),而不是user。因此,基于当前锅炉板代码的完整答案将是这样的:

model.Email

答案 3 :(得分:0)

您可以尝试在项目的Startup.cs文件中更改为bool值。 “真->假” 在这一行中,services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)