如何在 Asp.Net identity 2 中手动检查密码?

Posted

技术标签:

【中文标题】如何在 Asp.Net identity 2 中手动检查密码?【英文标题】:How to check password manually in Asp.Net identity 2? 【发布时间】:2016-03-30 08:52:11 【问题描述】:

这实际上可能更像是一个概念性问题。在 Asp.Net Identity 中,PasswordHasher 每次为同一个字符串生成不同的哈希:

new PasswordHasher.HashPassword("myString");

现在,如果出于某种原因我需要手动比较用户的输入与保存在数据库中的密码,当我对用户输入的密码进行哈希处理时,我很可能会得到一个与存储在数据库中的字符串不同的字符串。

有人可以向我解释一下吗?不应该对相同的字符串进行哈希处理会产生相同的哈希值,如果不是,Identity 本身如何意识到两个不同的哈希值实际上是相同的?

【问题讨论】:

【参考方案1】:

PasswordHasher 每次生成不同的哈希值,因为它使用了salting 技术。这种技术可以保护散列密码免受字典攻击。顺便说一句,您可以使用以下代码手动验证密码:

if(PasswordHasher.VerifyHashedPassword("hashedPassword", "password") 
    != PasswordVerificationResult.Failed)

    // password is correct 

【讨论】:

盐在哪里传递到方法中?为了正确“散列”密码,它必须使用与原始密码散列相同的盐。 @webworm salt 包含在hashedPassword 中。所以通过传递hashedPassword,盐也传递给了方法。【参考方案2】:
var user = _userManager.Users.SingleOrDefault(p => p.PhoneNumber == model.PhoneNumber);
            if (user == null)
            
                return RedirectToAction(nameof(Login));
            

            var result1 = _userManager.PasswordHasher.VerifyHashedPassword(user, user.PasswordHash, model.Password);
            if (result1 != PasswordVerificationResult.Success)
            
                ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                return View(model);
            

【讨论】:

以上是关于如何在 Asp.Net identity 2 中手动检查密码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在现有数据库中实现 ASP.NET Identity 2.0?

如何以编程方式登录到 ASP.NET Identity 2?

Asp.Net core MVC6如何在Identity 3中初始添加角色

ASP.Net Identity 2 使用短信重置密码

如何在不影响密码更改行为的情况下正确防止 ASP.NET Identity 2.2.1 中的多个活动会话?

如何在 ASP.NET 5 Identity 中设置 PasswordHasherCompatibilityMode.IdentityV3?