我试图在新的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
消息。这不是设置验证的正确位置吗?
答案 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
不是您必须从新模板更改验证的唯一方法。您还必须更改所有相关的视图模型。去图。