我有一個使用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中間件確定請求未授權的具體原因?
嘿@Greg任何機會還沒有處理這個使用OWIN? –