繁体   English   中英

如何检查输入的密码是否等于存储的密码?

[英]How to check if entered password is equal to stored password?

假设我已经实现了一种在用户面板中更改密码的方法。 在进行更改之前,我要求用户输入当前密码,而我实际上创建了此方法:

[HttpPost]
[ValidateAntiForgeryToken]
public bool CheckCurrentPassword(string username, string password)
{
    var originalUser = _userManager.Users.FirstOrDefault(c => c.UserName == username);
    var hash = _userManager.PasswordHasher.HashPassword(originalUser, password);

    if (hash == originalUser.PasswordHash)
        return true;

    return false;
}

本质上,我向该方法发送的username是唯一字段,并且我可以检索要求更改密码的用户。 我还获得了新密码的哈希值,然后将该哈希值与数据库中存储的哈希值进行比较。

问题在于哈希是不同的。 我不知道为什么,但是使用相同的密码,我有两个不同的哈希值(一个存储在数据库中),另一个由该方法动态生成。

也许还有另一种方法来检查当前密码是否等于输入的密码?

这正是UserManager<TUser>.CheckPasswordAsync(TUser, String)的用途:

if (await _userManager.CheckPasswordAsync(originalUser, password))
{
    // Yes, it's the current password.
}

进行此操作时,最好使用UserManager.FindByNameAsync(String)来获取originalUser 整个功能可能变为:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<bool> CheckCurrentPassword(string username, string password)
{
    var originalUser = await _userManager.FindByNameAsync(username);

    // originalUser might be null (as in your example), so check for that accordingly.

    return await _userManager.CheckPasswordAsync(originalUser, password);
}

使用Async方法需要您的调用代码使用async/await ,我已将其折叠到上面的示例中。 动作支持开箱即用; 处理Task<T>的返回类型。

如果您对CheckPasswordAsync函数的实现方式感兴趣,可以在源代码中自己查看,这可以帮助您确定自己的版本为何不起作用。

如果哈希值不同,则用于在将密码输入数据库之前对密码进行哈希处理的方法必须不同于_userManager.PasswordHasher.HashPassword 真的想不出任何其他解释。 查看您是否能够匹配两种哈希方式。

我也遇到了这个问题,这是由于在MVC项目中进行的哈希处理被SQL数据库以某种方式操纵的,所以这种方式(以下)是我设法解决匹配丢失问题的方法。比较输入的密码并与SQL数据库中的现有密码进行比较时,使用哈希密码。

您可以尝试将输入的密码与现有密码进行比较的稍微不同的方法。

public ActionResult Login(UserLogin login)
{

  var v = dc.Users.Where(a => a.UserEmailAddress == login.UserEmailAddress).FirstOrDefault();

  if(string.Compare(Crypto.Hash(login.UserPassword), v.UserPassword) == 0)
  {
     //do login here
  }
}

因此,如果您已将控制器设置为接受来自表单的登录详细信息,则可以使用“登录”在您尝试登录的数据库中找到该用户。在查询中找到该用户,然后您可以继续执行“ string.Compare”

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM