ASP.NET标识 - 设置UserValidator什么都不做

时间:2014-08-26 15:01:18

标签: c# asp.net asp.net-mvc asp.net-identity-2

我试图在新的ASP.NET MVC 5项目(使用ASP.NET Identity 2)中为默认UserValidator设置ApplicationUserManager。我创建了一个非常简单的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 个答案:

答案 0 :(得分:1)

我对这个问题有类似的问题,这里的答案不太对,所以我在这里加上我的分享。

问题是由在Create函数中设置UserValidator引起的。由于我正在使用ApplicationUserManager的新实例,因此正在使用默认验证器。将应用程序验证设置移动到构造函数可以解决问题。 Create函数应该只有我认为的选项特定设置。

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进行单元测试。

答案 1 :(得分:0)

我找到了。它应该是显而易见的。

UserValidator不是您必须从新模板更改验证的唯一方法。您还必须更改所有相关的视图模型。去图。