C# ASP.NET Core 2.2如何从自定义UserManager调用自定义UserValidator
这是我的CustomUserManager类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
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来创建异步