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

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

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

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

【问题讨论】:

标签: c# asp.net asp.net-mvc asp.net-identity asp.net-core-mvc


【解决方案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 的了解,我认为程序员可以通过在应用启动时从配置中显式读取它来使认为可配置。
  • 还可以看看这个在初始化后设置选项的解决方案:stackoverflow.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

    【讨论】:

    • 我觉得这对用户来说是最好的解决方案。这允许合理级别的安全性并赋予用户灵活性。这允许用户使用密码选择他们想要的内容,而不是打开或关闭某些限制。
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多