Валидация пользователя в ASP.NET Identity

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

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

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

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

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

manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
    AllowOnlyAlphanumericUserNames = false,
    RequireUniqueEmail = true
};

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

  • AllowOnlyAlphanumericUserNames: если равно true, то юзернейм должен содержать только алфавитно-цифровые символы

  • RequireUniqueEmail: если равно true, то email пользователя должен быть уникальным

Возможности встроенного валидатора довольно ограничены, но мы можем переопределить его поведения. Для этого нам надо унаследовать класс от UserValidator<ApplicationUser>. Итак, создадим следующий класс:

public class CustomUserValidator : UserValidator<ApplicationUser>
{
    public CustomUserValidator(ApplicationUserManager mgr)
        : base(mgr)
    {
        AllowOnlyAlphanumericUserNames = false;
    }
    public override async Task<IdentityResult> ValidateAsync(ApplicationUser user)
    {
        IdentityResult result = await base.ValidateAsync(user);
        if (user.Email.ToLower().EndsWith("@spam.com"))
        {
            var errors = result.Errors.ToList();
            errors.Add("Данный домен находится в спам-базе. Выберите другой почтовый сервис");
            result = new IdentityResult(errors);
        }
        if(user.UserName.Contains("admin"))
        {
            var errors = result.Errors.ToList();
            errors.Add("Ник пользователя не должен содержать слово 'admin'");
            result = new IdentityResult(errors);
        }
        return result;
    }
}

В валидаторе мы можем использовать те же свойства AllowOnlyAlphanumericUserNames и RequireUniqueEmail. В частности, в конструкторе устанавливается AllowOnlyAlphanumericUserNames = false

Чтобы написать свою логику валидации, надо переопределить метод ValidateAsync. В нашем случае он проверяет значения полей UserName и Email и устанавливает сообщения об ошибках, если эти значения не удовлетворяют некоторым условиям. Результатом работы метода является объект IdentityResult, который сожержит все возникшие ошибки.

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

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

Для целей тестирования я определил дополнительное свойство Name в модели регистрации и добавил поле для его ввода в представление регистрации. А в контроллере AccountController при создании нового пользователя применяется это свойство для UserName:

public async Task<ActionResult> Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { UserName = model.Name, Email = model.Email };
//........................................................

И теперь, если я введу некорректные значения, приложение отобразит мне ошибки:

Валидация пользователя в ASP.NET Identity
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850