2017-02-08 2 views
0

Я создал пользовательский Авторизируйтесь, которое игнорируется, когда действие имеет [Authorize]:Override Global Авторизовать в контроллере вместо действий

public class MyGlobalAuthorizeAttribute: AuthorizeAttribute 
{ 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     // check if action is decorated with an Authorize... 
     var action = filterContext.ActionDescriptor 
     if (action.IsDefined(typeof(AuthorizeAttribute), true)) 
      return; 

     base.OnAuthorization(filterContext); 
    } 

} 

... Затем я настроил его в глобальных фильтров, позволяя только админам по умолчанию:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new MyGlobalAuthorizeAttribute() { Roles = "Admin" }); 
    } 
} 

Если я декорировать действие, как это:

public class MyController: Controller 
{ 
    [Authorize] // non-admins can access this action.. 
    public ActionResult Index() 
    { 
    } 
} 

... он отлично работает. Однако, если я поставлю [Authorize] в контроллер, MyGlobalAuthorizeAttribute не обнаружит его.

Я нашел много примеров переопределения, но все из них около действий переопределения контроллера или глобальных Авторизируйтесь, но не является контроллер переопределения глобального Авторизовать.

Можно ли достичь этого?

ответ

3

Кроме того, необходимо проверить ControllerDescriptor:

var action = filterContext.ActionDescriptor; 
if (action.IsDefined(typeof(AuthorizeAttribute), true)) 
    return; 

if (action.ControllerDescriptor.IsDefined(typeof(AuthorizeAttribute), true)) 
    return; 

Documentation for ControllerDescriptor.IsDefined(...)

+0

Я искал в '' filterContext.Controller' и filterContext.Controller.ControllerContext', когда он был только в моих глазах , внутри 'action'. Большое спасибо!!! – Alisson

Смежные вопросы