当ClaimsAuthorizationManager.CheckAccess返回false时返回401

时间:2015-04-21 13:49:32

标签: asp.net asp.net-web-api asp.net-web-api2 claims-based-identity

我使用自定义ClaimsAuthorizationManager在Web API 2项目中实现授权

为此,将覆盖CheckAccess()方法以确定是否应允许当前主体访问,并返回相应的布尔值。问题是返回false会导致Exception被抛出,结果为500 Internal Server Error,而期望的结果是401 Unauthorized(或者{{1} }}?)。

是否有办法覆盖失败的声明验证的结果,以便它返回正确的" HTTP响应而不是全能500?

1 个答案:

答案 0 :(得分:2)

基于这两篇文章:

Article 1

Article 2

您可以实现自己的ExceptionFilterAttribute,类似这样的

public class SecurityExceptionFilterAttribute : System.Web.Http.Filters.ExceptionFilterAttribute 
{
    public override void OnException(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Exception is System.Security.SecurityException)
        {
            actionExecutedContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
            return;
        }

        base.OnException(actionExecutedContext);
    }
}

然后在Global.asax文件中将此过滤条件添加到HttpConfiguration

config.Filters.Add(new SecurityExceptionFilterAttribute());