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

我有一个使用owin运行的asp.net 4.5 web api.无论何时发出未经授权的请求,它都会按预期返回401以及以下响应:
{"Message":"Authorization has been denied for this request."}

我想为此响应添加其他详细信息(过期令牌,无效角色等),并基于此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;
    }
}

然后在我的控制器上使用它,如下所示:

[MyAuthorizeAttribute(Roles = "Foo")]
public class MyController : ApiController
{
    ...
}

返回401,并按预期返回以下响应:

{"Description": "This is why you're unauthorized"}

但是,我没有看到如何从传递给MyAuthorizeAttribute.HandleUnauthorizedRequest的HttpActionContext中确定请求未经授权的原因.例如,当我在本地调试并使用过期令牌发出请求时,它会抛出一个解释IDX10223的SecurityTokenExpiredException:Lifetime验证失败.令牌已过期.有效期:’…’当前时间:’…’.或者对于无效的受众,它会抛出SecurityTokenInvalidAudienceException,解释Message = IDX10214:受众验证失败.观众:’……’.不匹配:validationParameters.ValidAudience:’null’或validationParameters.ValidAudiences:’…’.我已经在我的Startup.cs中设置了几个断点,但在它们被抛出之前甚至无法捕获其中一个异常.

如何使用owin中间件确定请求未经授权的具体原因?

解决方法

还没有弄清楚如何识别过期和无效的受众等等,但我最终使用它来至少根据角色返回403s.

您可以使用上面问题中的示例自定义消息(“您必须具有角色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;
            }
        }
    }
}

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....