2016-08-19 2 views
2

Есть ли способ зарегистрировать фильтр для определенной области?Зарегистрировать фильтр для области

В приведенном ниже примере кода регистра авторизации Фильтр глобально (сила для аутентификации):

services.AddMvc(config => 
{ 
    var policy = new AuthorizationPolicyBuilder() 
        .RequireAuthenticatedUser() 
        .Build(); 
    config.Filters.Add(new AuthorizeFilter(policy)); 
}); 

Я хочу это, но только для некоторых областей.

ответ

1

Вы можете написать обычай IFilterProvider, который может создавать фильтр динамически.

Пример:

public class CustomFilterProvider : IFilterProvider 
{ 
    public int Order 
    { 
     get 
     { 
      // This value is fine. The `DefaultFilterProvider` has an order of `-1000` and so is run before this provider. 
      return 0; 
     } 
    } 

    public void OnProvidersExecuted(FilterProviderContext context) 
    { 
    } 

    public void OnProvidersExecuting(FilterProviderContext context) 
    { 
     var controllerActionDescriptor = context.ActionContext.ActionDescriptor as ControllerActionDescriptor; 
     var controllerType = controllerActionDescriptor.ControllerTypeInfo; 

     var areaAttribute = controllerType.GetCustomAttribute<AreaAttribute>(); 
     if(areaAttribute != null && areaAttribute.RouteValue == "Admin") 
     { 
      var filter = new TestAuthorizationFilter(); 
      context.Results.Add(new FilterItem(new FilterDescriptor(filter, FilterScope.Global), filter)); 
     } 
    } 
} 

Регистрация поставщика в DI:

services.TryAddEnumerable(ServiceDescriptor.Singleton<IFilterProvider, CustomFilterProvider>()); 
Смежные вопросы