首页 文章

覆盖 Controller 中的全局授权而不是 Action

提问于
浏览
0

我创建了一个自定义授权,当一个动作有[Authorize]时会被忽略:

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);
    }

}

...then 我在全局过滤器中配置了它,默认只允许管理员:

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

...it 工作正常。但是,如果我将[Authorize]放在控制器中,MyGlobalAuthorizeAttribute将无法检测到它。

我找到了许多覆盖的例子,但所有这些都是关于动作覆盖控制器全局授权,但不是覆盖全局授权的控制器。

是否有可能实现这一目标?

1 回答

  • 3

    您还需要检查 ControllerDescriptor:

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

    ControllerDescriptor.IsDefined(...)的文档

相关问题