C# ASP.NET Core 2.2如何从自定义UserManager调用自定义UserValidator

C# ASP.NET Core 2.2如何从自定义UserManager调用自定义UserValidator,c#,asp.net-core,.net-core,asp.net-core-mvc,C#,Asp.net Core,.net Core,Asp.net Core Mvc,这是我的CustomUserManager类 public class CustomUserManager : UserManager<User> { public string TenantId { get; set; } private readonly ManagementStudioDbContext dbContext; private IEnumerable<ICustomUserValidator<User>> userV

这是我的CustomUserManager类

public class CustomUserManager : UserManager<User>
{
    public string TenantId { get; set; }
    private readonly ManagementStudioDbContext dbContext;
    private IEnumerable<ICustomUserValidator<User>> userValidators;
    public CustomUserManager(ICustomUserStore<User> store, IOptions<IdentityOptions> optionsAccessor,
    IPasswordHasher<User> passwordHasher, IEnumerable<ICustomUserValidator<User>> userValidators,
    IEnumerable<IPasswordValidator<User>> passwordValidators, ILookupNormalizer keyNormalizer,
    IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<User>> logger, ManagementStudioDbContext dbContext) : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
    {
        this.dbContext = dbContext;
        this.userValidators = userValidators;
    }


    public override async Task<IdentityResult> CreateAsync(User user, string Password)
    {
        ThrowIfDisposed();
        var result = await userValidators.
    }

}
公共类CustomUserManager:UserManager { 公共字符串TenantId{get;set;} 私有只读管理studiodbcontext dbContext; 私有IEnumerable用户验证程序; 公共CustomUserManager(ICustomUserStore存储、IOOptions访问器、, IPasswordHasher密码hasher,IEnumerable用户验证程序, IEnumerable PasswordValidator、ILookupNormalizer、keyNormalizer、, IdentityErrorDescriber错误、IServiceProvider服务、ILogger记录器、ManagementStudioDbContext dbContext):基本(存储、选项访问器、密码哈希器、用户验证器、密码验证器、密钥规范化器、错误、服务、记录器) { this.dbContext=dbContext; this.userValidators=userValidators; } 公共重写异步任务CreateAsync(用户,字符串密码) { ThrowIfDisposed(); var result=等待用户验证程序。 } } 我已成功创建了自定义UserValidator和自定义UserStore类:

public class CustomUserStore<TUser> : UserStore<TUser> where TUser:IdentityUser<string>,new()
{
    private ManagementStudioDbContext dbContext;
    public CustomUserStore(ManagementStudioDbContext dbContext, IdentityErrorDescriber describer = null) : base(dbContext, describer)
    {
        this.dbContext = dbContext;
    }

    public virtual async Task CreateAsync(TUser user)
    {
        await base.CreateAsync(user);
    }
}

public class CustomUserValidator<TUser> : UserValidator<TUser>, ICustomUserValidator<TUser>
where TUser : User
{
    public override 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, List<IdentityError> errors)
    {
        var userName = await manager.GetUserNameAsync(user);
        var securityStamp = await manager.UpdateSecurityStampAsync(user);
        if (string.IsNullOrWhiteSpace(userName))
        {
            errors.Add(Describer.InvalidUserName(userName));
        }
        else if (!string.IsNullOrEmpty(manager.Options.User.AllowedUserNameCharacters) &&
            userName.Any(c => !manager.Options.User.AllowedUserNameCharacters.Contains(c)))
        {
            errors.Add(Describer.InvalidUserName(userName));
        }
        else
        {
            var owner = manager.Users.Where(x => x.TenantId == user.TenantId && x.UserName.ToUpper() == userName.ToUpper()).FirstOrDefault();
            if (owner != null)
            {
                errors.Add(Describer.DuplicateUserName(userName));
            }
        }
    }

}
公共类CustomUserStore:UserStore,其中TUser:IdentityUser,new() { private ManagementStudioDbContext数据库上下文; 公共CustomUserStore(ManagementStudioDbContext dbContext,IdentityErrorDescriber describer=null):基本(dbContext,describer) { this.dbContext=dbContext; } 公共虚拟异步任务CreateAsync(TUser用户) { wait base.CreateAsync(用户); } } 公共类CustomUserValidator:UserValidator、ICustomUserValidator 其中TUser:User { 公共覆盖异步任务ValidateAsync(UserManager,TUser用户) { if(manager==null) { 抛出新的ArgumentNullException(nameof(manager)); } if(user==null) { 抛出新ArgumentNullException(nameof(user)); } var errors=新列表(); 等待ValidateUserName(经理、用户、错误); if(manager.Options.User.RequireUniqueEmail) { //等待ValidateEmail(经理、用户、错误); } 返回errors.Count>0?IdentityResult.Failed(errors.ToArray()):IdentityResult.Success; } 专用异步任务ValidateUserName(UserManager、TUser用户、列表错误) { var userName=await manager.GetUserNameAsync(用户); var securityStamp=wait manager.UpdateSecurityStampAsync(用户); if(string.IsNullOrWhiteSpace(用户名)) { 添加(descripber.InvalidUserName(用户名)); } 如果(!string.IsNullOrEmpty(manager.Options.User.AllowedUserNameCharacters),则为else&& userName.Any(c=>!manager.Options.User.AllowedUserNameCharacters.Contains(c))) { 添加(descripber.InvalidUserName(用户名)); } 其他的 { var owner=manager.Users.Where(x=>x.TenantId==user.TenantId&&x.UserName.ToUpper()==UserName.ToUpper()).FirstOrDefault(); 如果(所有者!=null) { 添加(descripber.DuplicateUserName(用户名)); } } } } 但是,我不确定如何在UserManager类中使用这些创建的类。我尝试调用UserValidator,但因为它是Ienumerable,所以无法调用ValidateAsync函数。我也不能调用我的自定义UserStore.CreateAync,因为它请求取消令牌

如何将这些类连接在一起以创建用户

编辑:如果可能的话,我认为不需要自定义用户存储。但是,我仍然需要使用userstore来创建异步