我要求强制用户在90天后更改密码。这可以通过以下方式正常工作:
if (memberUser.LastPasswordChangedDate.Date.AddDays(90) < DateTime.Now.Date)
{
return RedirectToAction("MyChangePasswordMethod", "MyController");
}
然而,我的另一个要求是用户使用的最后5个密码不能重复 - asp.net是否内置了这样的内容?我无法在aspnet数据库表中看到存储最后一个密码的任何内容。将我最后的密码值存储在我自己的数据库表中,然后根据我自己的自定义数据库表中的用户值输入的新密码字段进行比较,这是一个问题吗?
答案 0 :(得分:13)
正如您所发现的那样,没有任何内置内容,因此您必须为用户存储以前的密码并检查该列表以确保它们不会重复使用。
我会存储以前的所有密码。这意味着当他们点击5次更改时,您不必清除表中的旧数据,如果需求更改为不重复使用最后10或15次更改,您将获得数据。
您可以存储散列/加密密码并对其进行检查,这样就无法从系统中获取纯文本版本。
我有一张“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。