ASP.NET身份验证:如何将用户输入的密码与哈希密码进行比较?

4
我创建了一个名为PasswordHistory的表。每当用户更改密码时,当前密码应被复制到PasswordHistory表中。策略是以下两者中最严格的之一:
  1. 用户不能使用最近8个密码中的任何一个
  2. 或者过去2年内使用过的密码
我想知道如何将新输入的密码与已经哈希过的密码进行比较?
这是我的代码:
var _limitDate = DateTime.Now.AddYears(-2);
int n = db.PasswordsHistory.Where(pwd => pwd.UserId == userId &&  pwd.ChangeDate > _limitDate).Count();

var pwdList = new List<PasswordHistory>();
if(n >= 8)
{
   pwdList = db.PasswordsHistory
       .Where(pwd => pwd.ChangeDate > _limitDate)
       .ToList();
}
else
{
   pwdList = db.PasswordsHistory
      .OrderByDescending(pwd => pwd.ChangeDate)
      .Take(8)
      .ToList();
}

if (pwdList.Count == 0)
{
   return false;
}
else
{
   foreach (var pwd in pwdList)
   {
      //compare the password entered by the user with the password stored in the PasswordHistory table
   }
}

感谢您的帮助。

1
PasswordsHistory表存储旧的passwordHashes吗? - tmg
2个回答

9
请只在历史记录中存储密码哈希值。您可以使用 PasswordHasher.VerifyHashedPassword(string hashedPassword, string providedPassword) 与提供的密码比较旧的哈希值 - 这是 Identity 的一部分。

2
完整语法为 PasswordVerificationResult passresult = _userManager.PasswordHasher.VerifyHashedPassword(user, user.PasswordHash, model.OldPassword); - topcool
@trailmax,如何识别密码是否相同?一个方法的返回类型是什么? - Roxy'Pro
@Roxy'Pro 你是在比较哈希和密码吗? - trailmax

2

检查密码正确性的方法与生成哈希值的方法相同——使用相同的算法进行哈希(如果使用了盐,则也要使用),并比较两个哈希结果。

你知道最初用于哈希它们的算法是什么吗?

同样将旧密码保存为哈希值。尽力避免在任何地方明文存储密码...


+1 以避免明文密码存储。Identity 有一个“PasswordHasher”类,应该用于历史密码。 - trailmax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接