如何在 ASP.NET 5 MVC 6 (vNext) 中定义 Identity 的密码规则?

Posted

技术标签:

【中文标题】如何在 ASP.NET 5 MVC 6 (vNext) 中定义 Identity 的密码规则?【英文标题】:How do I define the password rules for Identity in ASP.NET 5 MVC 6 (vNext)? 【发布时间】:2015-03-06 01:32:33 【问题描述】:

ASP.NET 5 中提供的默认身份提供程序默认有非常严格的密码规则,需要一个小写字符、一个大写字符、一个非字母数字字符和一个数字。我正在寻找一种方法来更改提供商的密码要求。

以前在 ASP.NET 4 中,可以通过 Web.config XML 文件将提供程序配置为 previously answered。但是 ASP.NET 5 使用新的基于代码的配置模式,不清楚如何配置身份。

如何更改我的应用程序的密码要求?

【问题讨论】:

如果您想深入了解密码要求(您可能应该这样做),NIST(一个标准委员会)最近推出了新的密码指南。在此处查看摘要文章:passwordping.com/surprising-new-password-guidelines-nist 以及此处的完整 NIST 标准出版物。参考5.1.1.2小节:pages.nist.gov/800-63-3/sp800-63b.html#sec3 【参考方案1】:

我实际上最终弄清楚了这一点,事实证明您需要为 AddDefaultIdentity 提供一个合适的 lambda 表达式来配​​置它提供的 IdentityOptions。这是在 Startup 类的 ConfigureServices 方法中完成的,如下所示:

public class Startup 
    public void ConfigureServices(IServiceCollection services) 

        // Add Identity services to the services container.
        services.AddDefaultIdentity<ApplicationIdentityDbContext, ApplicationUser, IdentityRole>(Configuration,
            o => 
                o.Password.RequireDigit = false;
                o.Password.RequireLowercase = false;
                o.Password.RequireUppercase = false;
                o.Password.RequireNonLetterOrDigit = false;
                o.Password.RequiredLength = 7;
            );
    

更新 2:

上述在框架的 beta1 版本中是正确的,在最新的 rc1 beta5 中它略微更改为:

services.AddIdentity<ApplicationUser, IdentityRole>(o => 
    // configure identity options
    o.Password.RequireDigit = false;
    o.Password.RequireLowercase = false;
    o.Password.RequireUppercase = false;
    o.Password.RequireNonAlphanumeric = false;
    o.Password.RequiredLength = 6;
)
.AddEntityFrameworkStores<ApplicationIdentityDbContext>()
.AddDefaultTokenProviders();

【讨论】:

是的,或者你可以直接调用 services.ConfigureIdentity(o => ); 不错!您认为可以通过config.json 文件实现吗? @DaveVandenEynde 我刚试过。不工作。 json 下面。 “身份”:“密码”:“RequireDigit”:“false”,“RequireLowercase”:“false”,“RequiredLength”:“5”,“RequireUppercase”:“false”,“RequireNonLetterOrDigit”:“false” 根据我对 MVC 6 的了解,我认为程序员可以通过在应用启动时从配置中显式读取它来使认为可配置。 还可以看看这个在初始化后设置选项的解决方案:***.com/a/30942723/1507481【参考方案2】:

如果您使用Individual User Accounts 设置了一个新的 Web 项目,请转到:

App_Start -> IdentityConfig.cs

您可以在此处编辑以下默认值:

manager.PasswordValidator = new PasswordValidator

    RequiredLength = 6,
    RequireNonLetterOrDigit = true,
    RequireDigit = true,
    RequireLowercase = true,
    RequireUppercase = true,
;

【讨论】:

【参考方案3】:

在startup.cs中:

   services.AddIdentity<ApplicationUser, IdentityRole>(x =>
        
            x.Password.RequiredLength = 6;
            x.Password.RequireUppercase = false;
            x.Password.RequireLowercase = false;
            x.Password.RequireNonAlphanumeric = false;
        ).AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();

【讨论】:

这是 Core 2.0 的答案。谢谢。 禁用这些东西似乎很麻烦。反正有没有一次完全禁用验证?我的意思是,我不想强​​制执行任何操作,让用户自己选择密码。如果他因为选择了“1234”这样的哑密码而被黑,那就是他的问题了。【参考方案4】:

我想做的是自定义密码规则,使其包含以下至少 2 个组中的字符:小写、大写、数字和特殊符号

这不是我可以通过更改 PasswordValidator 选项来完成的:

manager.PasswordValidator = new PasswordValidator

    RequiredLength = 6,
    RequireNonLetterOrDigit = false,
    RequireDigit = false,
    RequireLowercase = false,
    RequireUppercase = false,
 ;

因此,我通过扩展 IIdentityValidator 创建了一个自定义验证器...

首先,在您的 Extensions 文件夹中创建一个新文件 CustomPasswordValidator.cs:

public class CustomPasswordValidator : IIdentityValidator<string>

    public int RequiredLength  get; set; 
    public CustomPasswordValidator(int length) 
        RequiredLength = length;
    

    /* 
     * logic to validate password: I am using regex to count how many 
     * types of characters exists in the password
     */
    public Task<IdentityResult> ValidateAsync(string password) 
        if (String.IsNullOrEmpty(password) || password.Length < RequiredLength)
        
            return Task.FromResult(IdentityResult.Failed(
                $"Password should be at least RequiredLength characters"));
        

        int counter = 0;
        List<string> patterns = new List<string>();
        patterns.Add(@"[a-z]");                                          // lowercase
        patterns.Add(@"[A-Z]");                                          // uppercase
        patterns.Add(@"[0-9]");                                          // digits
        // don't forget to include white space in special symbols
        patterns.Add(@"[!@#$%^&*\(\)_\+\-\=<>,\.\|""'~`:;\\?\/\[\] ]"); // special symbols

        // count type of different chars in password
        foreach (string p in patterns)
        
            if (Regex.IsMatch(password, p))
            
                counter++;
            
        

        if (counter < 2)
        
            return Task.FromResult(IdentityResult.Failed(
                "Please use characters from at least two of these groups: lowercase, uppercase, digits, special symbols"));
        

        return Task.FromResult(IdentityResult.Success);
    

然后进入IdentityConfig.cs,在Create方法中初始化:

manager.PasswordValidator = new CustomPasswordValidator(8 /*min length*/);
        /*
        // You don't need this anymore
        manager.PasswordValidator = new PasswordValidator
        
            RequiredLength = 6,
            RequireNonLetterOrDigit = true,
            RequireDigit = true,
            RequireLowercase = true,
            RequireUppercase = true,
        ;
        */

更多详情请见my tutorial。

【讨论】:

我觉得这对用户来说是最好的解决方案。这允许合理级别的安全性并赋予用户灵活性。这允许用户使用密码选择他们想要的内容,而不是打开或关闭某些限制。

以上是关于如何在 ASP.NET 5 MVC 6 (vNext) 中定义 Identity 的密码规则?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ASP.NET 5 MVC 6 保护 Web API

ASP.Net 5 MVC 6,如何使用共享 Error.cshtml 作为默认错误响应

如何使用 mvc 6、asp.net 5 注册全局过滤器

如何在 ASP.NET MVC 5、Entity Framework 6 中使用流利的 API 映射表?

在 ASP.NET 5 (vNext) MVC 6 中实现自定义路由器

使用 MVC 6 在 ASP.NET 5 中显示从 WebRequest 获取的 JSON 数据