Identity Core 的密码历史记录

Gay*_*yan 6 password-encryption asp.net-identity asp.net-core

密码历史记录有默认实现吗?我正在尝试在我的项目中使用身份来实现该功能,因此我添加了包含密码哈希值的密码历史表。当用户更改密码时,usermanager 会生成密码的哈希值。

var passwordHash = _userManager.PasswordHasher.HashPassword(user, newPassword);

如果此哈希未插入密码历史表中,则允许更改密码,否则返回错误

但问题是每次为特定密码生成哈希值时,它都会生成随机哈希值,这些随机哈希值也无法比较

var passwordHash = _userManager.PasswordHasher.HashPassword(user, newPassword);

哈希值不同于

_userManager.ResetPasswordAsync(user, request.Token, password);

生成的密码哈希。

可能是我试图以错误的方式做到这一点。我在实现密码历史记录时犯了什么错误?

谢谢

小智 8

每次都有不同的哈希值 - 这就是默认实现的工作原理IPasswordHasher。有关更多详细信息,请参阅此答案:/sf/answers/1443569991/。

因此,对于您的实施密码历史记录,您可以IPasswordHasher使用方法实施或仅使用所有存储的密码哈希值验证新密码

PasswordVerificationResult VerifyHashedPassword(TUser user, string hashedPassword, string providedPassword);
Run Code Online (Sandbox Code Playgroud)

仅举个例子:

var passAlreadyExist = user.UserHistory
                .Select(h => h.PasswordHash)
                .Distinct()
                .Any(hash =>
                {
                    var res = manager.PasswordHasher.VerifyHashedPassword(user, hash, password);
                    return res == PasswordVerificationResult.Success;
                });
Run Code Online (Sandbox Code Playgroud)

其中UserHistory- 它是自定义表,其中包含一些用户信息,例如密码、电子邮件、姓名......