2016-08-19 21 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>());