Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否阻止用户使用最后5个密码?_C#_Asp.net Mvc 3 - Fatal编程技术网

C# 是否阻止用户使用最后5个密码?

C# 是否阻止用户使用最后5个密码?,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我有一个要求,强制用户在90天后更改密码。这在以下情况下运行良好: if (memberUser.LastPasswordChangedDate.Date.AddDays(90) < DateTime.Now.Date) { return RedirectToAction("MyChangePasswordMethod", "MyController"); } if(memberUser.LastPasswordChangedDate.Date.AddDays(90)

我有一个要求,强制用户在90天后更改密码。这在以下情况下运行良好:

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

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

因为您发现没有内置密码,所以您必须存储以前的密码,确保它们是散列或加密的用户并检查该列表,以确保他们没有重复使用该列表。确保使用相同的salt进行哈希/加密,否则将永远无法获得相同密码的匹配项

我会保存他们以前的密码。这意味着您不必在遇到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);
var encryptedPassword=MembershipProvider.EncryptPassword(密码);
int numberOfReuse=5;//或可配置
var historiesQuery=(来自dataContext.GetTable()中的历史)
其中histories.UserId==UserId
orderby histories.PasswordDate降序
选择历史记录。密码)。取(numberOfReuse);
返回historiesQuery.Contains(enycryptedPassword);

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

非常感谢您的编辑-不知道MembershipProvider.Encrypt方法-如果我将密码与salt一起使用作为我的格式,此方法是否有效?(即,我在asp.net db中的成员资格表中的密码格式为1)@KOL-我只是在为自己仔细检查:)不,asp.net成员资格没有此功能。你必须实施它。但是不要存储密码,存储散列。是的,您必须自己存储,但不需要创建任何自定义DB表来存储旧密码/散列,只需使用配置文件属性(其中您将旧密码/散列存储在逗号分隔的列表中)。