ASP.NET Identity - настройка UserValidator ничего не делает
Я пытаюсь установить UserValidator
по умолчанию ApplicationUserManager
в новом проекте ASP.NET MVC 5 (с использованием ASP.NET Identity 2). Я создал очень простой UserValidator:
public class SimpleUserValidator<TUser, TKey> : IIdentityValidator<TUser> where TUser: class, IUser<TKey> where TKey : IEquatable<TKey> {
private readonly UserManager<TUser, TKey> _manager;
public SimpleUserValidator(UserManager<TUser, TKey> manager) {
_manager = manager;
}
public async Task<IdentityResult> ValidateAsync(TUser item) {
var errors = new List<string>();
if (string.IsNullOrWhiteSpace(item.UserName))
errors.Add("Username is required");
if (_manager != null) {
var otherAccount = await _manager.FindByNameAsync(item.UserName);
if (otherAccount != null && !otherAccount.Id.Equals(item.Id))
errors.Add("Select a different username. An account has already been created with this username.");
}
return errors.Any()
? IdentityResult.Failed(errors.ToArray())
: IdentityResult.Success;
}
}
Я установил это, позвонив:
manager.UserValidator = new SimpleUserValidator<ApplicationUser, int>(manager);
в пределах ApplicationUserManager.Create()
метод.
Проблема в том, что это не меняет поведение. Я все еще получаю дефолт The Email field is not a valid e-mail address
сообщение. Разве это не правильное место для установки этой проверки?
2 ответа
У меня была похожая проблема с этим вопросом, и ответ здесь не совсем правильный, поэтому я добавляю свой здесь, чтобы поделиться.
Проблема была вызвана настройкой UserValidator
внутри функции Создать. Так как я создавал экземпляр ApplicationUserManager
валидатор по умолчанию использовался. Перемещение настройки проверки приложения в конструктор решило проблему. Функция "Создать" должна иметь только определенные параметры, я думаю.
public class ApplicationUserManager : UserManager<ApplicationUser, string>
{
/// <summary>
/// Initializes a new instance of the <see cref="ApplicationUserManager"/> class.
/// </summary>
/// <param name="store"></param>
public ApplicationUserManager(IUserStore<ApplicationUser, string> store)
: base(store)
{
// Configure validation logic for usernames
UserValidator = new ApplicationUserValidator<ApplicationUser>(this)
{
AllowOnlyAlphanumericUserNames = true,
RequireUniqueEmail = false
};
// Configure validation logic for passwords
PasswordValidator = new PasswordValidator
{
RequiredLength = 8,
RequireNonLetterOrDigit = false,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true
};
}
/// <summary>
/// Creates the specified options.
/// </summary>
/// <param name="options">The options.</param>
/// <param name="context">The context.</param>
/// <returns></returns>
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new ApplicationUserStore(context.Get<MyContext>()));
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
}
}
В качестве альтернативы вы можете удалить все экземпляры new ApplicationUserManager
и вместо этого вызовите Create. Но это трудно навязать другим, использующим ваш код, не делая конструктор закрытым
Закрытие конструктора сделало бы затруднительным заполнение пользовательской таблицы, потому что IOwinContext
недоступно в функции посева. Кроме того, вы не сможете провести модульное тестирование своего ApplicationUserManager
мимо проходного магазина во время строительства.
Я нашел это. И это должно было быть очевидно.
UserValidator
это не единственное, что вы должны изменить для проверки из нового шаблона. Вы также должны изменить все соответствующие модели представления. Пойди разберись.