Як визначити правила пароля для ідентифікації в ASP.NET 5 MVC 6 (vNext)?


76

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

Раніше в ASP.NET 4 постачальника можна було налаштувати за допомогою XML-файлу Web.config, як відповіли раніше . Однак ASP.NET 5 використовує новий шаблон конфігурації на основі коду, і незрозуміло, як налаштувати ідентичність.

Як я можу змінити вимоги до пароля для моєї програми?


2
Якщо ви хочете глибоко заглибитися у вимоги до пароля (а ви, мабуть, повинні), NIST (стандартна дошка) нещодавно вийшов з новими рекомендаціями щодо паролів. Дивіться підсумкову статтю тут: passwordping.com/surprising-new-password-guidelines-nist І повну публікацію стандарту NIST тут. Див. Розділ 5.1.1.2: pages.nist.gov/800-63-3/sp800-63b.html#sec3
Франсіско д'Анконія,

Відповіді:


138

Я насправді зрозумів це, виявляється, вам потрібно надати 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:

Вище було вірно в бета1 версіях фреймворку, в останньому 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();

4
Так, або ви можете просто зателефонувати до служб. ConfigureIdentity (o => {});
Хао Кунг

2
Приємно! Ви вважаєте, що це можливо через config.jsonфайл?
Дейв Ван ден Ейнде

@DaveVandenEynde Я щойно спробував. Не працює. json нижче. "Identity": {"Password": {"RequireDigit": "false", "RequireLowercase": "false", "RequiredLength": "5", "RequireUppercase": "false", "RequireNonLetterOrDigit": "false"} }
nVentimiglia

З того, що я дізнався про MVC 6, я думаю, що програмісту залишається зробити думку мислимо налаштовуваним, прочитавши її явно з конфігурації під час запуску програми.
Дейв Ван ден Ейнде

1
Також подивіться на це рішення для встановлення параметрів після ініціалізації: stackoverflow.com/a/30942723/1507481
Jannik Arndt

27

Якщо ви створили новий веб-проект, Individual User Accountsперейдіть до:

App_Start -> IdentityConfig.cs

Там ви можете редагувати такі за замовчуванням:

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

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

Це відповідь для Core 2.0. Дякую.
вершник1210

8

Що я хотів зробити, це налаштувати правило пароля таким чином, щоб воно містило символи принаймні 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
        // 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,
        };
        */

Докладніше див. У моєму посібнику .


2
Я вважаю, що це найкраще рішення для користувача. Це забезпечує розумний рівень безпеки, надаючи користувачеві гнучкість. Замість того, щоб вмикати або вимикати певні обмеження, це дозволяє користувачеві вибрати те, що вони хочуть за допомогою свого пароля.
Франсіско д'Анконія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.