2016-07-04 85 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),因爲你沒有包裝方法執行,但你在引導它。

相關問題