79

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

以前在 ASP.NET 4 中,可以通过 Web.config XML 文件配置提供程序,如前所述。然而 ASP.NET 5 使用新的基于代码的配置模式,并且不清楚如何配置标识。

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

4

4 回答 4

147

我实际上最终弄清楚了这一点,事实证明您需要为 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();
于 2015-01-08T01:30:48.540 回答
28

如果您使用Individual User Accountsgo to 设置了一个新的 Web 项目:

App_Start -> IdentityConfig.cs

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

manager.PasswordValidator = new PasswordValidator
{
    RequiredLength = 6,
    RequireNonLetterOrDigit = true,
    RequireDigit = true,
    RequireLowercase = true,
    RequireUppercase = true,
};
于 2017-09-27T06:40:35.297 回答
11

在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();
于 2016-10-19T04:36:52.460 回答
8

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

这不是我可以通过更改 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,
        };
        */

有关更多详细信息,请参阅我的教程

于 2017-10-29T02:29:18.770 回答