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
消息。这不是设置验证的正确位置吗?
我有一个与这个问题类似的问题,这里的答案不太正确,所以我在这里添加我的答案来分享。
该问题是由在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
并不是从新模板进行验证所必须更改的唯一内容。您还必须更改所有相关的视图模型。转到图。