返回描述性401来自Owin的消息WebApi2

问题描述:

我有一个使用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中间件确定请求未授权的具体原因?

还没有想出如何识别过期或无效的受众等,但我最终使用这个至少返回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? –