2016-07-04 82 views
0

我有一些api操作,包括OnMethodBoundaryAspect方面的一个方面, 我对请求发送的令牌进行了验证,就像这样。使用postharp返回未经授权的结果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动作捕捉方面退换吗?

回答

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),因为你没有包装方法执行,但你在引导它。

相关问题