【发布时间】:2012-03-13 22:08:57
【问题描述】:
我有一个 MVC 3 应用程序。关于安全主要有两个区域。第一个主要是防止公共访问,但不是真正的敏感信息。密码强度可能很弱,因为也没有太大的危害。
第二区域(区域)受到限制。用户必须申请访问。如果用户获得访问权限,它将获得某个角色。因此,每个控制器方法都会根据该角色对用户进行自动化。
我希望这些用户在下次登录时必须将密码更改为强密码,然后才能进一步访问受限内容。
示例:
用户 A 申请访问。 授予访问权限。密码策略 只要该用户具有访问权限,该用户就会被更改。他们一定 下次登录时更改密码,并且无法改回 只要他们具有该角色,就可以使用较弱的密码。
有没有使用 ASP.NET 实现此功能的安全方法?
更新
我实际上使用了 Chris 提出的解决方案并且它有效,但是为了处理密码本身的验证,我实际上也从 Micah 提出的解决方案中获得了一些灵感。然而,事实证明,重写 MembershipProvider.OnValidatingPassword 确实意味着还必须实现 10 多个我真的不需要解决这个问题的抽象方法。
在我看来,一个更好的解决方案是连接到 Membership.ValidatingPassword 事件。我在 App_Start 中执行此操作,然后在事件处理程序中实现自己的密码验证,这解决了我的问题。
只是为了与您分享解决方案,我在这里介绍它,与 Chris 解决方案一起解决了我的问题,并希望也适用于其他人:
void App_Start()
{
//To do custom validation on certain passwords set new event handler
Membership.ValidatingPassword += Membership_ValidatingPassword;
}
private void Membership_ValidatingPassword(object sender, ValidatePasswordEventArgs e)
{
//If the user is a new user, we let registration happen without strong password
if (e.IsNewUser) return;
MembershipUser membershipUser = Membership.GetUser(e.UserName);
Guid userId = Guid.Parse(membershipUser.ProviderUserKey.ToString());
//First check if the pwd is strong enough to be flagged, if so we flag it
//using regex to validate the password (20 char, 2 uppercase so on)
if (MyValidationClass.IsStrongPassword(e.Password, 20, 2, 4, 1))
{
//if the user does not already have a flag we set one
MyValidationClass.SetStrongPasswordFlag(userId);
}
else
{
//If the user needs strong pwd, we cancel the operation and throw exception
if (MyValidationClass.NeedsStrongPassword(e.UserName))
{
e.FailureInformation =
new MembershipPasswordException("Password does not satisfy reqirements!");
e.Cancel = true;
}
else
{
MyValidationClass.RemoveStrongPasswordFlag(userId);
}
}
}
【问题讨论】:
-
您是否曾经在 .NET 中阅读或搜索过有关 Membership and Roles 的任何内容?
-
如何在角色设置之前请求强密码?现在在更改密码时,您可以通过编程方式执行此操作,但之前不行。
-
@belexandre 是的,我已经阅读了很多关于它的内容,但我还没有看到有关此的信息。我已经对上述问题进行了搜索,但没有找到除基于角色的身份验证之外的信息。这不是我的问题,问题是您可能对您认为机密的内容有非常强的密码要求,但对于其他内容来说是正常的强密码甚至弱密码。虽然我没有看过所有的视频。你的意思是上面的视频链接里有这方面的信息?
-
@Aristos 如果我理解正确:当您申请时,管理员用户会为您的用户设置角色。然后你得到那个角色。下次您获得授权(通过登录或尝试访问受限内容)时,您应该被重定向以升级您的密码。
-
您在此处描述的所有这些步骤都必须由您以编程方式完成。它们并非万事俱备。
标签: asp.net asp.net-mvc-3 security asp.net-membership authorization