自定义AuthorizeAttribute无法授权

时间:2016-02-01 18:09:38

标签: c# asp.net asp.net-mvc-5 authorization

我无法使自定义授权属性返回除控制器方法未授权的401之外的任何内容。

我已经设置了一个非常基本的自定义授权属性:

 public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new AuthorizeAttribute());
        filters.Add(new CustomAuthorizationAttribute());  //<---Custom 
    }

班级本身:

public class CustomAuthorizationAttribute : System.Web.Mvc.AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return true;
    }

    protected override HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext)
    {
        return base.OnCacheAuthorization(httpContext);
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);
    }


    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
    }

}

我用CustomAuthorizationAttribute:

装饰了我的控制器动作
  [HttpPost]
    [CustomAuthorization]
    public ActionResult UploadFile(FormCollection fileUpload)
    {...

显然,我必须遗漏一些简单的东西,因为这段代码总是导致401未经授权的响应。

AuthorizeCore方法断点不会被命中,但偶尔会有OnAuthorization方法。

我是MVC5的新手。我错过了什么?如何根据自定义条件进行此授权?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您的授权属性似乎存在三重冗余。您已为单个控制器操作添加了三个授权过滤器。两个在这里:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new AuthorizeAttribute());
        filters.Add(new CustomAuthorizationAttribute());  //<---Custom 
    }

......还有一个:

  [HttpPost]
    [CustomAuthorization]
    public ActionResult UploadFile(FormCollection fileUpload)

我猜测首先应用第一个AuthorizeAttribute(vanilla),命中它自己的AuthorizeCore(),返回false并将你的上下文发送到401-ville。

尝试删除全局过滤器注册,然后查看控制器操作是否按预期运行。

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
            filters.Add(new HandleErrorAttribute());
        }