Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Кроме валидации пароля в 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 }; //........................................................
И теперь, если я введу некорректные значения, приложение отобразит мне ошибки: