asp.net - 从 Owin WebApi2 返回描述性 401 消息

标签 asp.net asp.net-web-api asp.net-web-api2 owin authorize-attribute

我有一个使用 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.HandleUnauthorizedRequestHttpActionContext 中确定请求未经授权的原因。例如,当我在本地调试并使用过期 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/

相关文章:

c# - OData V4 无法正确序列化包含 System.Object 属性的 POCO(?)s 列表

c# - FileUpload 控件在第二次单击时起作用,但不是第一次尝试保存发布的文件?

c# - "Another object on this page already uses ID ' XXXXXXX'

c# - 检查列表中的所有属性

c# - HttpRequestMessage.CreateErrorResponse() 不存在

c# - 如何将 REST API 中发布的文件上传到 Azure 存储

c# - 您可以在同一个 Web API Controller 中使用 2 个具有不同参数类型的 GET 方法吗?

asp.net - 在 IHTTPHandler 中以编程方式创建 System.Web.UI.Page

c# - Linq2Sql : Manage DataContext

c# - 几次成功请求后,Web API 突然返回 403 forbidden