11

我要求强制用户在 90 天后更改密码。这适用于以下内容:

if (memberUser.LastPasswordChangedDate.Date.AddDays(90) < DateTime.Now.Date)
{
     return RedirectToAction("MyChangePasswordMethod", "MyController");
}

然而,我的另一个要求是用户使用的最后 5 个密码不能重复 - asp.net 是否内置了类似的东西?我在存储上次密码的 aspnet db 表中看不到任何内容。我是否将最后一个密码值存储在我自己的数据库表中,然后将输入的新密码字段与我自己的自定义数据库表中的用户值进行比较?

4

1 回答 1

18

正如您发现的那样,没有内置任何内容,因此您必须为用户存储以前的密码 - 确保它们经过散列或加密 - 并检查该列表以确保它们没有重复使用。确保您使用相同的盐进行散列/加密,否则您将永远无法匹配相同的密码。

我会存储他们以前的所有密码。这意味着当它们发生 5 次更改时,您不必从表中清除旧数据,并且如果要求更改为不重用最后 10 或 15 次更改,您将拥有数据。如果您还存储了密码更改的日期,您可以建立一个检查来说明过去 12 个月内没有重复使用。

当您存储散列/加密密码并检查是否有可能从系统中获取纯文本版本时。

我有一个“UserId”、“Password”和“DateChanged”的表。然后,您可以找到该用户的最后 N 个密码,并将新密码的散列/加密版本与此列表进行比较:

var encryptedPassword = MembershipProvider.EncryptPassword(password);
int numberOfReuse = 5;  // or configurable
var historiesQuery = (from histories in dataContext.GetTable<PasswordHistory>()
                      where histories.UserId == userId
                      orderby histories.PasswordDate descending
                      select histories.Password).Take<string>(numberOfReuse);

return historiesQuery.Contains<string>(enycryptedPassword);

如果密码已被使用,则返回 true。

要进行基于日期的检查:

var encryptedPassword = MembershipProvider.EncryptPassword(password);
DateTime testDate = DateTime.Now.AddMonths(-12);  // configurable
var historiesQuery = (from histories in dataContext.GetTable<PasswordHistory>()
                      where histories.UserId == userId
                      and histories.PasswordDate >= testDate
                      orderby histories.PasswordDate descending
                      select histories.Password);

return historiesQuery.Contains<string>(enycryptedPassword);
于 2013-02-25T11:04:24.830 回答