ASP.NET身份提供程序SignInManager保持返回失败

我对MVC5的标准ASP身份提供程序有疑问。 我一登录方法:

await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 

不断回来失败。 所以我开始调试,通过使用:

 UserManager.FindByEmail(model.Email); 

这将为我的用户尝试登录返回有效的UserID。然后我使用:

 SignInManager.UserManager.CheckPassword(UserIDObtainedFromFind, model.Password); 

这返回true,这意味着我提供的密码是有效的….

签到失败

关于我如何跟踪,调试SignInManager.PasswordSignInAsync方法以查看它失败的地方的任何想法?

SignInManager.PasswordSignIn使用用户名,您应该仔细检查用户名是否与您传入的电子邮件相同。

如果username != email

 ApplicationUser signedUser = UserManager.FindByEmail(model.Email); var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false); 

对我来说,我发现使用SQL事件探查器查看PasswordSignInAsync正在调用的查询很有帮助。 在我的情况下 – 我注意到它试图找到一个将Discriminator设置为“UserContext”的用户。 这当然不适合我,因为我从ASP.NET成员服务升级,并且此Discriminator设置为User。 由于新代码使用entity framework,因此该值似乎是从您为用户使用的类派生的。 快速更新声明修复了该问题。

 UPDATE AspNetUsers SET Discriminator = 'UserContext' WHERE Discriminator = 'User' 

这对我有用

 ApplicationUser signedUser = UserManager.FindByEmail(model.Email); var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false); 
 ApplicationUser signedUser = UserManager.FindByEmail(model.Email); var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false); 

这对我有用因为我的用户名不等于我的电子邮件。 您的电子邮件和用户名应该相同。

现在有点老了,但这是我在这个问题上的问题。

我在实用程序中进行了一些静态数据创建,以确保Identity数据库中存在一些标准内容(角色和管理员帐户)。

我正在创建实体并直接与上下文对话以创建任何缺少的角色或该用户。 我遇到的问题是我没有设置NormalizedUserNameNormalizedEmail字段。 我只是设置EmailUserName

我使用的最终代码(使用EF Core 2.x)类似于:

  if (!_context.Users.Any(_ => _.Id.Equals(Users.AdministratorId))) { var user = new ApplicationUser { Id = Users.AdministratorId, UserName = Users.AdministratorEmail, Email = Users.AdministratorEmail, EmailConfirmed = true, NormalizedEmail = Users.AdministratorEmail.ToUpper(), NormalizedUserName = Users.AdministratorEmail.ToUpper(), SecurityStamp = Guid.NewGuid().ToString() }; var hasher = new PasswordHasher(); user.PasswordHash = hasher.HashPassword(user, "our_password"); _context.Users.Add(user); } 

在您的启动检查中:

 options.SignIn.RequireConfirmedEmail = false; options.SignIn.RequireConfirmedPhoneNumber = false; 

如果这些设置为true,则需要先确认电子邮件或电话号码,然后才能登录。

如果以上都不是导致问题的原因(在我的情况下,问题是我自己的IUserStore实现中的复制粘贴错误)并回答您的问题“ 关于如何跟踪或调试SignInManager的任何想法。 PasswordSignInAsync方法,以查看它失败的位置? “,调试它的一种方法是将方法SignInManager.PasswordSignInAsync的内容复制到您自己的派生类(ApplicationSignInManager)中。

如果你使用MVC5及更低版本,你可以在这里或这里找到源代码。