使用 ServiceStack 存储和比较多个密码
Storing and comparing multiple passwords with ServiceStack
我正在尝试在我的应用程序中创建密码过期功能。已经设置了密码以及身份验证和更改密码。现在我想提示用户在 x 时间后更改密码。
当用户更改密码并且我的 Angular 前端发出该请求时,我希望我的 C# 服务堆栈 API 将给定的新密码与当前密码和之前的密码进行比较检查重复。
我不担心细微的差异。例如,如果用户提交相同的密码但多了一个字符,那没问题。我想做一个尽可能简单的开始。
密码存储在 MS SQL 服务器的两列中 Salt varchar(8000)
和 PasswordHash varchar(8000)
。我已经设置好所有内容我只是对如何将散列密码与用户提供的字符串进行比较感到非常困惑。然后将旧密码保存在新的散列列中。我已经在网上和 SOF 上搜索了三天,但我什么也没找到。任何指导将不胜感激。
根据@Fildor 的评论,您需要创建包含现有密码哈希值的密码更改审核历史记录。从 ServiceStack v5+ ServiceStack 切换到使用相同的 PBKDF2 密码哈希算法 ASP.NET Identity v3 使用它将密码哈希 + salt + 迭代 + 算法版本存储在单个 PasswordHash UserAuth
table 上的字段,因此您的密码审核历史记录 table 只需要一个列来存储现有密码哈希值。
密码哈希算法可从 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();
}
我正在尝试在我的应用程序中创建密码过期功能。已经设置了密码以及身份验证和更改密码。现在我想提示用户在 x 时间后更改密码。
当用户更改密码并且我的 Angular 前端发出该请求时,我希望我的 C# 服务堆栈 API 将给定的新密码与当前密码和之前的密码进行比较检查重复。
我不担心细微的差异。例如,如果用户提交相同的密码但多了一个字符,那没问题。我想做一个尽可能简单的开始。
密码存储在 MS SQL 服务器的两列中 Salt varchar(8000)
和 PasswordHash varchar(8000)
。我已经设置好所有内容我只是对如何将散列密码与用户提供的字符串进行比较感到非常困惑。然后将旧密码保存在新的散列列中。我已经在网上和 SOF 上搜索了三天,但我什么也没找到。任何指导将不胜感激。
根据@Fildor 的评论,您需要创建包含现有密码哈希值的密码更改审核历史记录。从 ServiceStack v5+ ServiceStack 切换到使用相同的 PBKDF2 密码哈希算法 ASP.NET Identity v3 使用它将密码哈希 + salt + 迭代 + 算法版本存储在单个 PasswordHash UserAuth
table 上的字段,因此您的密码审核历史记录 table 只需要一个列来存储现有密码哈希值。
密码哈希算法可从 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();
}