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 это не единственное, что вы должны изменить для проверки из нового шаблона. Вы также должны изменить все соответствующие модели представления. Пойди разберись.

Другие вопросы по тегам