2016-07-06 3 views
3

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

Я пытался смотреть на подобные вопросы внедряющих UserValidator как How can customize Asp.net Identity 2 username already taken validation message? и этот ASP.NET Identity - setting UserValidator does nothing, но не могу заставить его работать.

/// <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) 
    { 
    } 
} 

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

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

ответ

3

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

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

public ApplicationRoleManager(IRoleStore<ApplicationRole, string> store) : base(store) 
{ 
    RoleValidator = new ApplicationRoleValidator<ApplicationRole>(this); 
} 
Смежные вопросы