ASP.NET标识-设置UserValidator不起任何作用

本文关键字:任何 作用 UserValidator 设置 NET 标识 ASP | 更新日期: 2023-09-27 18:19:38

我正在尝试为新的ASP.NET MVC 5项目中的默认ApplicationUserManager设置UserValidator(使用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);

在CCD_ 3方法内。

问题是,这并不能改变行为。我仍然得到默认的The Email field is not a valid e-mail address消息。这不是设置验证的正确位置吗?

ASP.NET标识-设置UserValidator不起任何作用

我有一个与这个问题类似的问题,这里的答案不太正确,所以我在这里添加我的答案来分享。

该问题是由在Create函数中设置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并不是从新模板进行验证所必须更改的唯一内容。您还必须更改所有相关的视图模型。转到图。