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&lt;TUser&gt; 处理密码本身的散列。您正在对密码进行预哈希处理,然后再次对其进行哈希处理,因此您会遇到登录失败。尝试只传递“Input.Password”。 我在哈希+加盐之后存储密码。我可以指定 SignInManager 使用我的哈希函数吗? 您可以通过覆盖 IPasswordHasher&lt;TUser&gt; 并配置 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

是否必须在 SignInManager 中使用 IdentityUser?

对 signInManager.PasswordSignInAsync 进行故障排除 [重复]