c# - 在 UserValidator 中覆盖 ValidateAsync
问题描述
从 stackoverflow阅读此链接后,我将其用作基础。尽管我已经阅读了自定义验证的多个实现,但所有可能的解决方案似乎都不会触发我的代码。
我使用的代码基于给出的链接,如下所示:
services.AddIdentity<Account, IdentityRole>(options =>
{
}).AddEntityFrameworkStores<AppDbContext>()
.AddUserManager<CustomKlantManager<Account>>();
services.AddTransient<ICustomUserValidator<Account>, CustomUserValidator<Account>>();
此实现不会启动它只是在无限循环中加载的 webapp。我试图把AddTransient
上面的AddIdentity
服务改成ICustomUserValidator
没有IUserValidator
成功。
这是 customUseManager:
public class CustomKlantManager<TUser> : UserManager<TUser>
where TUser : Account
{
public CustomKlantManager(IUserStore<TUser> store, IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<TUser> passwordHasher, IEnumerable<ICustomUserValidator<TUser>> userValidators,
IEnumerable<IPasswordValidator<TUser>> passwordValidators, ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors, IServiceProvider tokenProviders,
ILogger<UserManager<TUser>> logger)
: base(
store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors,
tokenProviders, logger)
{
}
}
CustomUserManager 继承自 UserManager,在构造函数中,而不是IUserValidator
使用自定义接口,即ICustomUserValidator
. Custom 接口没有什么特别之处,它只是 inharits IUservalidator
。
public interface ICustomUserValidator<TUser> : IUserValidator<TUser> where TUser : Account
{
}
最后一块是CustomUserValidator
自我。这个类继承自UserValidator
,其余的都是基于真实UserValidator
代码的代码,但有一些调整。
public class CustomUserValidator<TUser> : UserValidator<TUser>, ICustomUserValidator<TUser>
where TUser : Account
{
public bool RequireUniqueEmail { get; set; } = true;
public bool AllowOnlyAlphanumericUserNames { get; set; } = true;
private CustomKlantManager<TUser> Manager { get; set; }
public CustomUserValidator(CustomKlantManager<TUser> manager)
{
if (manager == null)
{
throw new ArgumentNullException("manager");
}
System.Diagnostics.Debug.WriteLine("Werkt");
AllowOnlyAlphanumericUserNames = true;
Manager = manager;
}
public virtual async Task<IdentityResult> ValidateAsync(UserManager<TUser> manager, TUser user)
{
if (manager == null)
{
throw new ArgumentNullException(nameof(manager));
}
if (user == null)
{
throw new ArgumentNullException(nameof(user));
}
var errors = new List<IdentityError>();
await ValidateUserName(manager, user, errors);
if (manager.Options.User.RequireUniqueEmail)
{
await ValidateEmail(manager, user, errors);
}
return errors.Count > 0 ? IdentityResult.Failed(errors.ToArray()) : IdentityResult.Success;
}
private async Task ValidateUserName(UserManager<TUser> manager, TUser user, ICollection<IdentityError> errors)
{
var userName = await manager.GetUserNameAsync(user);
if (string.IsNullOrWhiteSpace(userName))
{
errors.Add(Describer.InvalidUserName(userName));
}
else if (AllowOnlyAlphanumericUserNames && !Regex.IsMatch(user.UserName, @"^[A-Za-z0-9-]+$"))
{
errors.Add(Describer.InvalidUserName(userName));
}
}
// make sure email is not empty, valid, and unique
private async Task ValidateEmail(UserManager<TUser> manager, TUser user, List<IdentityError> errors)
{
var email = await manager.GetEmailAsync(user);
if (string.IsNullOrWhiteSpace(email))
{
errors.Add(Describer.InvalidEmail(email));
return;
}
if (!new EmailAddressAttribute().IsValid(email))
{
errors.Add(Describer.InvalidEmail(email));
return;
}
var owner = await manager.FindByEmailAsync(email);
if (owner != null &&
!string.Equals(await manager.GetUserIdAsync(owner), await manager.GetUserIdAsync(user)))
{
errors.Add(Describer.DuplicateEmail(email));
}
}
}
我希望有人可以帮助我为什么在创建帐户时没有触发此自定义验证代码?提前致谢
解决方案
推荐阅读
- ios - 为什么“打开方式...”对话框中没有建议我的 iOS 应用程序?
- c++ - 如何在 Windows 的命令行中编译 cpp 文件?
- javascript - 如何使用 react-firebaseui 使会话过期?
- amazon-web-services - AWS Fifo 在 Lambda Throttle 上停止
- archlinux - 尝试在 Arch Linux 中卸载 JDK
- android - 在多个应用程序之间共享相同的应用程序内产品 (Android)
- pandas - Pandas groupby 时间和 ID 和聚合
- python - numpy:在方阵中查找不重叠的块
- arrays - Groovy - FindAll - 唯一记录 - 字段声明的条件
- cryptography - 在 Windows 中的 Linux 终端上运行 outguess 时出错