繁体   English   中英

自定义AuthorizeAttribute不由MVC框架调用

[英]Custom AuthorizeAttribute Not Called by MVC Framework

我一直在互联网上试图找出为什么我的自定义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]属性修饰的操作发出请求,就会触发我的授权代码。 如果授权失败,我还希望能够返回更具描述性的auth失败消息。 不只是:

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

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

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

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

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

好的,我最终解决了它,这是如何:

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则Request将继续执行目标操作 - 即。 它被视为已被此过滤器授权。

希望能帮助其他人处于这个位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM