asp.net - 根据角色要求某些用户提供更强的密码

原文 标签 asp.net asp.net-mvc-3 security asp.net-membership authorization

我有一个MVC 3应用程序。关于安全性,主要有两个区域。第一个主要是为了防止公众访问,但并不是真正的敏感信息。密码强度可能很弱,因为两者都没有太大危害。

第二区(区域)受到限制。用户必须申请访问权限。如果用户获得访问权限,它将获得特定角色。因此,每种控制器方法都会根据该角色来使用户自动化。

我希望这些用户在下次登录时必须将密码更改为强密码,然后他们才能进一步访问受限内容。

例:


用户A申请访问。
授予访问权限。的密码政策
只要该用户具有访问权限,便会对其进行更改。他们一定
在下次登录时更改其密码,并且他们无法更改回
只要他们具有该角色,就可以使用较弱的密码。


有没有使用ASP.NET来实现此目的的安全方法?

更新资料

我实际上已经使用了Chris提出的解决方案,并且可以使用,但是为了处理密码本身的验证,我实际上也从Micah提出的解决方案中得到了一些启发。但是,事实证明,重写MembershipProvider.OnValidatingPassword确实意味着还必须实现10种抽象方法,而我实际上并不需要解决这些问题。

在我眼中,更好的解决方案是使用Membership.ValidatingPassword EVENT。我在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);
            }
        }
    }

最佳答案

您可以编写自己的Authorize Attribute来容纳两者。您只需要在应用程序的相关部分中使用它即可:

例如:

public class HasChangedPasswordAttribute : AuthorizeAttribute
{      
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        UserRepository repo = new UserRepository();
        var user = repo.GetCurrentUser();
        bool hasSecurelyChangedPassword = user.HasSecurelyChangedPassword;
        return hasSecurelyChangedPassword;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectResult("/Account/ChangePassword");
    }
}


以上内容将检查用户是否已安全更改了密码。如果不是,它将把他们重定向到一个新页面,在其中更改密码。一旦他们更改它,将标志设置为更改。

然后,您可以像这样使用它:

[HasChangedPassword]
[Authorize(Roles="SuperRole")]
public ActionResult MySecureAction()
{
 ...
}


您显然可以将这两个属性集成为一个,但是为了显示示例,在上面将它们分开。

相关文章:

asp.net-mvc-3 - 在ASP.NET MVC 3中预填充Html.TextBoxFor

asp.net-mvc - 复杂类型列表的EditorTemplate返回null,而其元素的EditorTemplate正常工作

javascript - 如果用户不接受Cookie,则禁用HTTP严格传输安全性(HSTS)

javascript - ASP.Net MVC3 RawUrl检查

c# - 查询字符串唯一字符串生成器?

php - 在Apache2 / Linux(LAMP)上为PHP网站设置文件权限的最佳实践是什么?

c# - 在ASP.net后面打开一个新的窗口代码

c# - dropdownlist中的第一项根本不会触发SelectedIndexChanged

asp.net - RavenDB ASP.NET会话提供程序?

asp.net - 在Asp.Net中大量邮寄HTML通讯