我试图在我的应用程序中创建一个密码过期功能。已经设置了密码以及身份验证和更改密码。现在,我想提示用户在x时间后更改密码。

当用户更改密码时,我的Angular前端发出了该请求,我希望C#服务堆栈API将给定的新密码与当前密码和之前的密码进行比较,以检查是否重复。

我不担心会有细微的变化。如果用户提交了相同的密码,但又添加了一个额外的字符,那很好。我想成为一个简单的开始。

密码存储在MS SQL Server中的两列Salt varchar(8000)PasswordHash varchar(8000)中。我已经完成了所有设置,只是对如何将哈希密码与用户提供的字符串进行比较感到非常困惑。然后将旧密码保存在新的哈希列中。我已经在Web和SOF上搜索了三天,但没有发现任何东西。任何指导将不胜感激。

最佳答案

在@Fildor注释之后,您需要创建一个密码更改的审核历史记录,其中包含现有密码的哈希值。从ServiceStack v5+服务栈切换为使用相同的PBKDF2密码哈希算法,ASP.NET Identity v3使用它将密码哈希+盐+迭代+算法版本存储在UserAuth表的单个PasswordHash字段中,因此仅使用密码审核历史记录表需要单个列来存储现有的密码哈希。

密码哈希算法可从IPasswordHasher依赖项获得,您可以在Service实现中使用它,例如:

public IPasswordHasher PasswordHasher { get; set; }

public object Any(AllowPassword request)
{
    var passwordHashes = MyRepo.GetExistingUserPasswords(GetSession().UserAuthId);
    foreach (var passwordHash in passwordHashes)
    {
        if (PasswordHasher.VerifyPassword(passwordHash, request.Password, out var neeedsRehash)
            throw new ArgumentException("Can't use existing password", nameof(request.Password));
    }

    return new AllowPasswordResponse();
}

关于c# - 使用ServiceStack存储和比较多个密码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57807033/

10-14 10:35
查看更多