Как определить правила пароля для идентификации в ASP.NET 5 MVC 6 (vNext)?


поставщик удостоверений по умолчанию, предоставленный в ASP.NET 5 имеет очень строгие правила пароля по умолчанию, требующие нижнего регистра, верхнего регистра, не буквенно-цифрового символа и числа. Я ищу способ изменить требования к паролю для провайдера.

ранее в ASP.NET 4, поставщик может быть настроен через Интернет.конфигурационный XML-файл, как и ранее ответил. Однако ASP.NET 5 использует новый шаблон конфигурации на основе кода, и это неясно как настроить удостоверение.

Как я могу изменить пароль для моего приложения?

4 60

4 ответа:

Я на самом деле закончил выяснять это, оказывается, вам нужно предоставить AddDefaultIdentity с подходящим лямбда-выражением, которое настраивает IdentityOptions, которые он предоставляет. Это делается внутри метода ConfigureServices в классе Startup, например:

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();

Если вы создали новый веб-проект с Individual User Accounts на:

App_Start -> IdentityConfig.cs

там вы можете изменить следующие значения по умолчанию:

manager.PasswordValidator = new PasswordValidator
{
    RequiredLength = 6,
    RequireNonLetterOrDigit = true,
    RequireDigit = true,
    RequireLowercase = true,
    RequireUppercase = true,
};

в автозагрузку.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();

что я хотел сделать, так это настроить правило пароля, чтобы оно содержало символы из по крайней мере 2 из следующих групп: нижний регистр, верхний регистр, цифры и специальные символы.

Это не то, что я мог бы сделать, просто изменив параметры PasswordValidator:

manager.PasswordValidator = new PasswordValidator
{
    RequiredLength = 6,
    RequireNonLetterOrDigit = false,
    RequireDigit = false,
    RequireLowercase = false,
    RequireUppercase = false,
 };

поэтому вместо этого я создал пользовательский валидатор, расширив IIdentityValidator...

сначала создайте новый файл 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(
                String.Format("Password should be at least {0} characters", RequiredLength)));
        }

        int counter = 0;
        List<string> patterns = new List<string>();
        patterns.Add(@"[a-z]");                                          // lowercase
        patterns.Add(@"[A-Z]");                                          // uppercase
        patterns.Add(@"[0-9]");                                          // digits
        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(6 /*min length*/);
        /*
        // You don't need this anymore
        manager.PasswordValidator = new PasswordValidator
        {
            RequiredLength = 6,
            RequireNonLetterOrDigit = true,
            RequireDigit = true,
            RequireLowercase = true,
            RequireUppercase = true,
        };
        */