繁体   English   中英

使用 ServiceStack 存储和比较多个密码

[英]Storing and comparing multiple passwords with ServiceStack

我正在尝试在我的应用程序中创建密码过期功能。 已设置密码以及身份验证和更改密码。 现在我想提示用户在 x 时间后更改他们的密码。

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

我不担心细微的变化。 例如,如果用户提交相同的密码但多了一个字符,那就没问题了。 我想从一个尽可能简单的开始。

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

在@Fildor 评论之后,您需要创建密码更改的审计历史记录,其中包含现有密码的哈希值。 ServiceStack v5+ ServiceStack 切换到使用与 ASP.NET Identity v3 相同的 PBKDF2 密码哈希算法,该算法将密码哈希 + salt + 迭代 + 算法版本存储在UserAuth表上的单个PasswordHash字段中,因此您的密码审计历史表只需要一个用于存储现有密码哈希的列。

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

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();
}

暂无
暂无

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

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