ASP.NET Identity - Пользовательская проверка роли не вызывается

Я пытаюсь создать кастом RoleValidator объект для проверки моего обычая IdentityRole, Я создал ApplicaitonRoleValidator класс, который наследуется от RoleValidator и установите это как RoleValidator в моем ApplicationRoleManager учебный класс. Но когда я создаю новую роль, функция проверки ValidateAsync никогда не называется.

Я пытался смотреть на аналогичные вопросы реализации UserValidator Как можно настроить Asp.net Identity 2 для имени пользователя уже принятого сообщения проверки? и эта идентификация ASP.NET - установка UserValidator ничего не делает, но не может заставить его работать.

/// <summary>
/// Custom role validator, used to validate new instances of ApplicationRole that are added to the system.
/// </summary>
/// <typeparam name="TRole">The type of the role.</typeparam>
public class ApplicationRoleValidator<TRole> : RoleValidator<TRole> where TRole : ApplicationRole
{
    private RoleManager<TRole, string> Manager { get; set; }

    /// <summary>
    /// Initializes a new instance of the <see cref="ApplicationRoleValidator" /> class.
    /// </summary>
    /// <param name="manager">The manager.</param>
    public ApplicationRoleValidator(RoleManager<TRole, string> manager) : base(manager)
    {
        Manager = manager;
    }

    /// <summary>
    /// Validates a role before saving.
    /// </summary>
    /// <param name="item"></param>
    /// <returns></returns>
    /// <exception cref="System.ArgumentNullException">item</exception>
    public override async Task<IdentityResult> ValidateAsync(TRole item)
    {
        if (item == null)//<= break point here never reached.
        {
            throw new ArgumentNullException(nameof(item));
        }

        var rslt = base.ValidateAsync(item);
        if (rslt.Result.Errors.Any())
        {//return error if found
            return IdentityResult.Failed(rslt.Result.Errors.ToArray());
        }

        var errors = new List<string>();
        //validate the min num of members
        if (role.MinimumNumberOfMembers < 0)
        {
            errors.Add(string.Format(CultureInfo.CurrentCulture, "最小数は0以上でなければなりません。"));
        }

        return errors.Count > 0 ? IdentityResult.Failed(errors.ToArray()) : IdentityResult.Success;
    }
}

ApplicationRoleManager где обычай RoleValidator устанавливается во время создания. Я могу нарушить эту линию, чтобы я знал, что это называется.

public class ApplicationRoleManager : RoleManager<ApplicationRole, string>
{
    /// <summary>
    /// Initializes a new instance of the <see cref="ApplicationRoleManager"/> class.
    /// </summary>
    /// <param name="store"></param>
    public ApplicationRoleManager(IRoleStore<ApplicationRole, string> store)
        : base(store)
    {
    }
    /// <summary>
    /// Creates the specified options.
    /// </summary>
    /// <param name="options">The options.</param>
    /// <param name="context">The context.</param>
    /// <returns></returns>
    public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
    {
        var manager = new ApplicationRoleManager(new ApplicationRoleStore(context.Get<MyContext>()));
        manager.RoleValidator = new ApplicationRoleValidator<ApplicationRole>(manager);
        return manager;
    }
}
public class ApplicationRole : IdentityRole<string, ApplicationUserRole>
{
    public bool IsSystemGroup { get; set; }
    public string Description { get; set; } = "";
    public int MinimumNumberOfMembers { get; set; }
}

public class ApplicationRoleStore : RoleStore<ApplicationRole, string, ApplicationUserRole>
{
    public ApplicationRoleStore(MyContext context)
        : base(context)
    {
    }
}

Роль создается вызовом Create в ApplicationRoleManager

var store = new ApplicationRoleStore(new MyContext());
var manager = new ApplicationRoleManager(store);
manager.Create(group);

1 ответ

Решение

Вы устанавливаете ApplicationRoleValidator в качестве RoleValidator для ApplicationRoleManager в методе Create для ApplicationRoleManager. В последних 3 строках кода, которые вы опубликовали, вы обновляете экземпляр ApplicationRoleManager. Этот экземпляр ApplicationRoleManager получает RoleValidator по умолчанию.

Если вы хотите создать новый экземпляр ApplicationRoleManager, вы должны поместить эту логику в конструктор

public ApplicationRoleManager(IRoleStore<ApplicationRole, string> store) : base(store)
{
     RoleValidator = new ApplicationRoleValidator<ApplicationRole>(this);
}
Другие вопросы по тегам