SignInManager PasswordSignInAsync 返回 False
Posted
技术标签:
【中文标题】SignInManager PasswordSignInAsync 返回 False【英文标题】:SignInManager PasswordSignInAsync is returning False 【发布时间】:2022-01-18 06:35:50 【问题描述】:ASP .Net Core 5.0 数据库优先 EF 我正在使用身份(Assembly Microsoft.Extensions.Identity.Stores,Version=5.0.0.0,Culture=neutral,PublicKeyToken=adb9793829ddae60)
我正在使用以下课程
public class ApplicationUser : IdentityUser
public override string Id get; set;
public override string UserName get; set; = "";
public string? Organization get; set;
public override string Email get; set; = "";
public override string PasswordHash get; set; = "";
public DateTime LastUpdateDate get; set;
public override bool EmailConfirmed get; set;
public byte[] UserAvatar get; set;
public override string NormalizedUserName get; set;
public override string NormalizedEmail get; set;
public override bool LockoutEnabled get; set;
public override int AccessFailedCount get; set;
public override string? PhoneNumber get; set;
public override string? ConcurrencyStamp get; set;
public override string? SecurityStamp get; set;
public override DateTimeOffset? LockoutEnd get; set;
public override bool TwoFactorEnabled get; set;
public override bool PhoneNumberConfirmed get; set;
//public SimpleUser ThisUser get; set; = new SimpleUser();
我的启动代码在这里:
services.AddDefaultIdentity<ApplicationUser>(options =>
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedAccount = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
).AddEntityFrameworkStores<TwisterDBContext>().AddDefaultTokenProviders();
我的 OnPostAsync 代码(使用支架创建)
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
returnUrl ??= Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
if (ModelState.IsValid)
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
ApplicationUser thisUser = await GetThisUserById(Input.Email);
string hashPassword = EncryptPassword.HashPassword(Input.Password, thisUser.SecurityStamp);
var result = await _signInManager.PasswordSignInAsync(thisUser, hashPassword, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
if (result.RequiresTwoFactor)
return RedirectToPage("./LoginWith2fa", new ReturnUrl = returnUrl, RememberMe = Input.RememberMe );
if (result.IsLockedOut)
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
else
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
// If we got this far, something failed, redisplay form
return Page();
我使用电子邮件 ID 作为用户名。 确保在 GetThisUserById 函数中正确设置规范化用户名和电子邮件(我的自定义函数从数据库获取记录) 我确认哈希密码都匹配。 EmailConfirmed 在数据库中设置为 true,并在 ThisUser 记录中设置为 true。
然而,我不断获得成功 = 假。我绝对确定我不会在某处设置一些标志...
最后是 Watch 窗口的截图。
【问题讨论】:
PasswordSignInAsync
应该使用默认的PasswordHasher<TUser>
处理密码本身的散列。您正在对密码进行预哈希处理,然后再次对其进行哈希处理,因此您会遇到登录失败。尝试只传递“Input.Password”。
我在哈希+加盐之后存储密码。我可以指定 SignInManager 使用我的哈希函数吗?
您可以通过覆盖 IPasswordHasher<TUser>
并配置 Identity 来使用它,但您不需要这样做。只需用户PasswordHasher.HashPassword()
生成要存储的密码哈希。默认实现使用 1k 迭代 Pbkdf2 散列和随机盐,该盐存储在返回的散列中。当您将密码尝试传递给PasswordSignInAsync
时,它会自动从存储的 PW 中提取盐,然后重新散列提供的字符串以进行比较。
【参考方案1】:
覆盖 SigninManager 和 UserManager 需要做很多工作。要让它发挥作用,有很多事情需要实现。
我收起尾巴,回到默认调用,并在 AspNet*** 表就位后,我得到了数据的种子,登录就像一个魅力。
【讨论】:
以上是关于SignInManager PasswordSignInAsync 返回 False的主要内容,如果未能解决你的问题,请参考以下文章
_signInManager.GetExternalLoginInfoAsync() 为 Apple 登录返回 null
Identity 3 SignInManager.PasswordSignInAsync() 不返回任何结果
SignInManager.PasswordSignInAsync() 成功,但 User.Identity.IsAuthenticated 为 false
ASP.Net Core SignInManager lockoutOnFailure