Can you return an HTTP response from an AuthorizeAttribute without throwing an exception?

后端 未结 2 1261
逝去的感伤
逝去的感伤 2021-02-19 05:14

I\'m using an AuthorizeAttribute on various controllers which may need to return 403 or 429 (too many requests) based on certain attributes of the request itself. I implemented

2条回答
  •  庸人自扰
    2021-02-19 06:07

    As you have discovered, throwing exceptions is expensive. The trick in this case is to override the response in the attribute. As MVC and WebAPI are different (at least prior to MVC6) there are two distinct methods.

    MVC

    Setting the AuthorizationContext.Result allows you to effectively override what action is being performed. Setting this value will prevent the action it is attached to from running at all:

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if(Throw403)
        {
            filterContext.Result = new HttpStatusCodeResult(403);
        }
    }
    

    WebAPI

    Very similar but you must instead set the HttpActionContext.Response property. One handy feature of this, is that you get a nice enum for the HTTP status code:

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if(Throw403)
        {
            actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
        }
    }
    

提交回复
热议问题