【问题标题】:Custom AuthorizeAttribute Not Called by MVC FrameworkMVC 框架未调用自定义 AuthorizeAttribute
【发布时间】:2013-03-20 17:45:02
【问题描述】:

我一直在互联网上试图找出为什么我的自定义 AuthorizeAttribute 在我的 MVC WebApi 中不起作用。我看到有人在 SO 上询问这种事情,但没有任何东西可以帮助我解决我的问题:

 [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, 
                 Inherited = false)]
    public sealed class CustomAuthorization : AuthorizeAttribute
    {

        //...

         protected override bool AuthorizeCore(HttpContextBase httpContext)
        { 
           // custom auth logic, returns true if authorized, false otherwise
        }
    }

我从System.Web.Mvc 扩展,而不是System.Web.Http。但是,我的 AuthorizeCore(HttpContextBase httpContext) 永远不会被调用。

我的CustomAuthorization 类中有一个构造函数,它采用params string[],这是特定操作所需的自定义权限的名称,例如:

[CustomAuthorization("Some Permission")]
[System.Web.Http.HttpGet]
public CustomResponse SomeAction()
{
   //...
}

我希望实现的是,每当对带有[CustomAuthorization] 属性的操作发出请求时,都会触发我的授权代码。如果授权失败,我还希望能够返回更具描述性的身份验证失败消息。不只是:

{"Message":"Authorization has been denied for this request."} 

我相信这涉及覆盖HandleUnauthorizedRequest,但我怎样才能提供我自己的对象,JSON 响应将序列化?

总而言之,即使我使用[CustomAuthorization] 属性装饰操作,框架也不会调用我的授权代码。它只是直接执行动作中的代码。

其次,如何实现未经授权的响应来序列化自定义 JSON 对象?

提前感谢您的帮助,非常感谢!

【问题讨论】:

  • 基于我的 cmets 如何实现自定义授权属性...首先,我认为您想要覆盖 OnAuthorization,而不是 AuthorizeCore。另外,我不确定你是否需要密封你的班级。

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api authorize-attribute


【解决方案1】:

好的,我最终解决了,方法如下:

public override void OnAuthorization(HttpActionContext actionContext) {

    ....

    if (!authorized) {

       actionContext.Response =    
                  actionContext.Request.CreateResponse(
                                   HttpStatusCode.Unauthorized, 
                                   new  Dictionary<string, string> { 
                                                { "hello", "world" } 
                                   }
                  );

    }

}

产生结果:

{"hello":"world"}

Dictionary 对象是任意的,它只是说明一个类型将被成功序列化为 Response。

如果您不设置actionContext.Response,则请求将继续执行目标操作 - 即。它被认为是被这个过滤器授权的。

希望能帮助这个职位的其他人。

【讨论】:

  • 找到如此简单的解决方案真是一种解脱!感谢您的努力,非常感谢。很高兴现在一切正常!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多