gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:56:03 25 4
gpt4 key购买 nike

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

[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;
}

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

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

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

最佳答案

这正是 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如何感兴趣功能实现了,可以在source code中亲自查看,这可能会帮助您确定您自己的版本无法运行的原因。

关于c# - 如何检查输入的密码是否等于存储的密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52824143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com