我有一个使用 owin 运行的 asp.net 4.5 Web api。每当发出未经授权的请求时,它都会返回 401,并按预期返回以下响应:
{"Message":"Authorization has been denied for this request."}
我想为此响应添加其他详细信息(过期 token 、无效角色等),并基于此 SO post 实现自定义 [AuthorizeAttribute]
.
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;
}
}
然后在我的 Controller 上使用它,如下所示:
[MyAuthorizeAttribute(Roles = "Foo")]
public class MyController : ApiController
{
...
}
它会返回 401,并按预期返回以下响应:
{"Description": "This is why you're unauthorized"}
但是,我不知道如何从传递给 MyAuthorizeAttribute.HandleUnauthorizedRequest
的 HttpActionContext
中确定请求未经授权的原因。例如,当我在本地调试并使用过期 token 发出请求时,它会抛出 SecurityTokenExpiredException
解释 IDX10223:生命周期验证失败。 token 已过期。 ValidTo: '...' 当前时间:'...'。
或者如果受众无效,它会抛出 SecurityTokenInvalidAudienceException
解释 Message=IDX10214:受众验证失败。观众:‘……’。不匹配:validationParameters.ValidAudience:'null'或validationParameters.ValidAudiences:'...'。
我已经在我的Startup.cs
中设置了几个断点,但甚至无法在抛出这些异常之前捕获它们之一。
如何使用 owin 中间件确定请求未经授权的具体原因?
最佳答案
还没弄清楚如何识别过期或无效受众等,但我最终使用它至少根据角色返回 403
。
您可以使用我上面问题中的示例自定义消息(“您必须具有角色 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;
}
}
}
}
关于asp.net - 从 Owin WebApi2 返回描述性 401 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33550424/