首页 > 解决方案 > 在 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));
        }
    }
}

我希望有人可以帮助我为什么在创建帐户时没有触发此自定义验证代码?提前致谢

标签: c#asp.net-coreweb-applicationsasp.net-identity

解决方案


推荐阅读