Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.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
Asp.net 基于角色,某些用户需要更强大的密码_Asp.net_Asp.net Mvc 3_Security_Asp.net Membership_Authorization - Fatal编程技术网

Asp.net 基于角色,某些用户需要更强大的密码

Asp.net 基于角色,某些用户需要更强大的密码,asp.net,asp.net-mvc-3,security,asp.net-membership,authorization,Asp.net,Asp.net Mvc 3,Security,Asp.net Membership,Authorization,我有一个MVC3应用程序。关于安全问题,主要有两个区域。第一个主要是防止公众访问,但不是真正的敏感信息。密码强度可能很弱,因为这两种方法都没有太大危害 第二个区域(区域)受到限制。用户必须申请访问权限。如果用户获得访问权限,它将获得特定角色。因此,每个控制器方法都基于该角色自动调整用户 我希望这些用户在下次登录时必须将密码更改为强密码,然后才能进一步访问受限制的内容 示例: 用户A申请访问。 允许访问。的密码策略 只要该用户具有访问权限,它就会被更改。他们必须 在下次登录时更改密码,他们将无法更

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

第二个区域(区域)受到限制。用户必须申请访问权限。如果用户获得访问权限,它将获得特定角色。因此,每个控制器方法都基于该角色自动调整用户

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

示例:

用户A申请访问。 允许访问。的密码策略 只要该用户具有访问权限,它就会被更改。他们必须 在下次登录时更改密码,他们将无法更改回密码 只要他们具有该角色,就可以使用较弱的密码

是否有任何安全的方法可以使用ASP.NET实现此功能

更新

事实上,我使用了Chris提出的解决方案,它是有效的,但为了处理密码本身的验证,我实际上也从Micah提出的解决方案中得到了一些灵感。然而,事实证明,重写MembershipProvider.OnValidatingPassword确实意味着还必须实现10多个抽象方法,我真的不需要解决这个问题

在我看来,一个更好的解决方案是挂接Membership.ValidatingPassword事件。我做这个inn应用程序启动,然后在事件处理程序中实现我自己的密码验证,这就解决了我的问题

为了与大家分享解决方案,我在这里介绍了它,与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);
            }
        }
    }

可能更简单的方法是在用户尝试输入新密码时,在客户端检查密码的强度。使用JQuery查看一些示例


关于升级和重置密码的事务,这是您的代码可以处理的,即用户表中的一个标志,用于将用户重定向到新的注册页面。但是,当他们设置密码(可能与相应的强度相匹配)时,就可以提交了…

您需要覆盖MembershipProvider.OnValidatingPassword


您可以编写自己的Authorize属性以适应这两种情况。您只需在应用程序的相关部分使用它:

例如:

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()
{
 ...
}

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

您是否在.NET中阅读或搜索过任何与此相关的内容?如何在设置角色之前请求强密码?现在,在“更改密码”中,您可以执行该程序,但之前不能这样做。@belexandre是的,我已经读了很多关于它的内容,但我还没有看到有关这方面的信息。我已经对上述问题进行了搜索,但除了基于角色的身份验证之外,没有找到其他信息。这不是我的问题,问题是你可能对你认为是机密的东西有很强的密码要求,但对其他内容有很强甚至很弱的密码要求。但我并没有看过所有的视频。你的意思是在上面的视频链接中有关于这方面的信息吗?@Aristos,如果我没听错的话:当你申请时,管理员用户会在你的用户身上设置角色。然后你得到那个角色。下次您获得授权(通过登录或尝试访问受限制的内容)时,您应该被重定向以升级密码。您在此处描述的所有这些步骤都必须由您按语法完成。密码的复杂性应该在服务器端进行验证,以确保安全。我认为使用jQuery很容易被绕过。它必须以某种方式在服务器端完成,jQuery可以帮助您查看它是否满足要求。您需要源代码来创建新的提供程序,还是足以覆盖OnValidatePassword?您应该能够从MembershipProvider继承并覆盖OnValidatingPassword。我在想你应该用你给的那个。更多地看一看可能不是这样的情况,我将不得不对此进行研究,但对于未来的维护来说,覆盖一个方法可能比构建一个自定义提供程序要好……嗯,这让我明白了一些事情。我已经有一个基本授权的整个网站的全球过滤器。如果我添加逻辑来检查用户角色,并且它处于特殊角色中,则应用某些规则-如上所述。ASP.NET成员资格中是否有检查密码强度的功能。它不是以纯文本形式存储的,因此实际获取用户密码并不容易。不幸的是,一旦设置了密码,就无法获取密码,但是如果您强制用户更改密码(如上所述),您可以在用户提交密码时进行检查。然后在数据库中存储一个标志,如果用户安全地设置了它。谢谢,这可能是一个可行的方法。试着想想安全问题。我唯一能想到的是,在数据库中存储未加密的标志可能是一个问题。。。另一方面,没有人可以改变这个标志。。。我必须在这方面做一些工作,谢谢。我现在已经制定了一个解决方案,它在我的测试中按照计划工作。所以谢谢,这让我朝着正确的方向前进。但是,您是否认为随着用户表的增长,每次请求都会对数据库造成很大的性能影响?