Настройка валидации пароля в ASP.NET Identity

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

При использовании системы аутентификации и авторизации ASP.NET Identity мы можем столкнуться со следующей проблемой: при вводе пароля срабатывает встроенная логика валидации - длина пароля не может быть меньше 6 символов, и мы эту логику никак не можем изменить, используя стандартный механим атрибутов валидации. Но что, если нам надо установить другую минимальную длину пароля? Или что если мы хотим, чтобы в пароле могли бы использоваться только цифровые или только алфавитные символы?

И несмотря на то, что встроенная логика валидации скрыта от наших глаз, мы ее можем переопределить. За механизм валидации отвечает свойство PasswordValidator класса UserManager. Оно хранит объект валидации, который мы можем изменить.

Если мы перейдем в файл IdentityConfig.cs в папке App_Start, то в определении класса ApplicationUserManager мы можем увидеть применение валидатора пароля:

var manager = new ApplicationUserManager
					(new UserStore<ApplicationUser>
						(context.Get<ApplicationDbContext>()));

//..........................

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

Для определения валидации пароля здесь применяется встроенный класс PasswordValidator, который имеет следующие свойства:

  • RequiredLength: минимальная длина пароля

  • RequireNonLetterOrDigit: если равно true, то пароль должен будет иметь как минимум один символ, который не является алфавитно-цифровым

  • RequireDigit: если равно true, то пароль должен будет иметь как минимум одну цифру

  • RequireLowercase: если равно true, то пароль должен будет иметь как минимум один символ в нижнем регистре

  • RequireUppercase: если равно true, то пароль должен будет иметь как минимум один символ в верхнем регистре

Для большинства случаев данного функционала вполне хватит, мы можем настроить минимальную длину пароля, ввод алфавитных, цифровых или неалфавитно-цифровых символов. Однако если нам потребуется более сложая логика валидации, то придется определять свой класс валидатора.

Объект валидатора представляет объект интерфейса IIdentityValidator. В данном случае в качестве такого объекта используется экземпляр класса PasswordValidator, который устанавливает минимальную длину пароля и ряд других правил. Однако больше ничего с этим валидатором мы сделать не можем. Поэтому для создания более изощренной логики валидации нам надо создать отдельный класс.

Итак, создадим следующий класс:

public class CustomPasswordValidator : IIdentityValidator<string>
{
    public int RequiredLength { get; set; } // минимальная длина
    public CustomPasswordValidator(int length)
    {
        RequiredLength = length;
    }
    public Task<IdentityResult> ValidateAsync(string item)
    {
        if (String.IsNullOrEmpty(item) || item.Length < RequiredLength)
        {
            return Task.FromResult(IdentityResult.Failed(
							String.Format("Минимальная длина пароля равна {0}", RequiredLength)));
        }
        string pattern = "^[0-9]+$";

        if (!Regex.IsMatch(item, pattern))
        {
            return Task.FromResult(IdentityResult.Failed("Пароль должен состоять только из цифр"));
        }

        return Task.FromResult(IdentityResult.Success);
    }
}

Класс валидатора реализует интерфейс IIdentityValidator, который имеет один метод ValidateAsync. Этот метод принимает строковый параметр, на место которого затем в программе будет передаваться строка валидируемого пароля.

Кроме проверки количества символов пароль здесь также проверяется на соответствие регулярному выражению, которое говорит о том, что все символы должны представлять цифры (string pattern = "^[0-9]+$"). Таким образом, мы можем определить в методе различные способы проверок.

И затем также в определении класса ApplicationUserManager мы можем его использовать:

var manager = new ApplicationUserManager
					(new UserStore<ApplicationUser>
						(context.Get<ApplicationDbContext>()));
//..............................
manager.PasswordValidator = new CustomPasswordValidator(5);
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850