返回描述性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;
}
}
}
}
嘿@Greg任何机会还没有处理这个使用OWIN? –