【问题标题】:Custom AuthorizeAttribute Failing to Authorize自定义 AuthorizeAttribute 授权失败
【发布时间】:2016-02-01 18:09:37
【问题描述】:

除了控制器方法上的 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 的新手。我错过了什么?如何根据我的自定义条件使此授权生效?

提前致谢。

【问题讨论】:

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


    【解决方案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());
            }
    

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多