7

我有一個使用owin運行的asp.net 4.5 web api。每當一個未經授權的請求時,它返回一個401以下響應預期:返回描述性401來自Owin的消息WebApi2

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

我想更多細節添加到這個響應(過期的令牌,無效的角色,等...),並實現了自定義[AuthorizeAttribute]基於此SO post

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
     var response = actionContext.Request.CreateResponse<MyError> 
      (new MyError() { Description = "This is why you're unauthorized" }); 
     response.StatusCode = HttpStatusCode.Unauthorized; 
     actionContext.Response = response; 
    } 
} 

,然後用它在我的控制器是這樣的:

[MyAuthorizeAttribute(Roles = "Foo")] 
public class MyController : ApiController 
{ 
    ... 
} 

與預期以下響應返回401:

{"Description": "This is why you're unauthorized"} 

不過,我看不出如何確定請求未被授權的原因來自HttpActionContext傳遞給MyAuthorizeAttribute.HandleUnauthorizedRequest。例如,當我在本地調試並使用過期令牌發出請求時,它會拋出一個SecurityTokenExpiredException解釋IDX10223: Lifetime validation failed. The token is expired. ValidTo: '...' Current time: '...'.或帶有無效的觀衆,它會拋出SecurityTokenInvalidAudienceException解釋Message=IDX10214: Audience validation failed. Audiences: '...'. Did not match: validationParameters.ValidAudience: 'null' or validationParameters.ValidAudiences: '...'.我在Startup.cs中設置了幾個斷點,但一直無法捕捉這些異常之一在被拋出之前。

如何使用owin中間件確定請求未授權的具體原因?

回答

0

還沒有想出如何識別過期或無效的受衆等,但我最終使用這個至少返回403 s的基礎上的角色。

您可以使用上述問題中的示例自定義消息(「您必須擁有角色X才能訪問此操作...」)。

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
     base.HandleUnauthorizedRequest(actionContext); 

     if (actionContext.RequestContext.Principal != null && 
      actionContext.RequestContext.Principal.Identity.IsAuthenticated && 
      Roles != null) 
     { 
      if (!Roles.Split(',').Any(x => 
       actionContext.RequestContext.Principal.IsInRole(x.Trim()))) 
      { 
       actionContext.Response.StatusCode = HttpStatusCode.Forbidden; 
      } 
     } 
    } 
} 
+0

嘿@Greg任何機會還沒有處理這個使用OWIN? –