使用postsharp OnMethodBoundaryAspect返回未经授权的结果

时间:2016-07-04 18:02:33

标签: asp.net-web-api postsharp

我有一些api操作,我在OnMethodBoundaryAspect中包含了一个方面, 我对请求中发送的令牌进行验证,如下所示。

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Instance)]
public class TokenCallHandler : OnMethodBoundaryAspect
{
    /// <summary>
    /// Methodo responsável por validar o token enviado pelo usuário
    /// </summary>
    /// <param name="args"></param>
    public override void OnEntry(MethodExecutionArgs args)
    {
        ApiController apiController = (ApiController)args.Instance;
        var context = apiController.ControllerContext;
        HttpRequestHeaders headers = context.Request.Headers;
        bool validToken = false;
        if (headers.Contains("X-Authorization"))
        {
            var authorization = headers.GetValues("X-Authorization");
            var token = authorization.ToList().FirstOrDefault();
            if (token == null)
                token = "invalid";

            validToken = TokenUtil.ValidateToken(token);

        }

        if (!validToken)
            args.ReturnValue = new UnauthorizedAccessException();



    }

}

但它继续执行api中的方法,我只想返回401异常。

如果我确实抛出了新的UnauthorizedException,它返回500(内部服务器错误)未经授权的内部,但我需要401.

如何在wep.api动作中捕获返回的方面?

1 个答案:

答案 0 :(得分:0)

ASP.NET Web API : Correct way to return a 401/unauthorised response所述,

  

您应该从API方法中抛出HttpResponseException

通过设置args.ReturnValue,您将更改由您的方面增强的方法的返回值,但您应该抛出异常。

所以最后一行应该是

  

throw new HttpResponseException(HttpStatusCode.Unauthorized);

     

或者,如果您想提供自定义消息:

     

var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "Oops!!!" }; throw new HttpResponseException(msg);

您也可以考虑使用MethodInterceptionAspecthttp://doc.postsharp.net/method-interception),因为您没有包装方法执行,但是您正在拦截它。