Asp.net mvc 4 返回WebAPI中自定义IActionFilter的未授权状态代码

Asp.net mvc 4 返回WebAPI中自定义IActionFilter的未授权状态代码,asp.net-mvc-4,asp.net-web-api,action-filter,Asp.net Mvc 4,Asp.net Web Api,Action Filter,我正在使用asp.net WebAPI,我需要创建一个自定义的ActionFilter,它可以快速检查请求URI的用户是否能够实际获取数据 他们已经被授权通过基本身份验证使用web服务,并且他们的角色已经通过自定义角色提供程序验证 我需要做的最后一件事是检查他们是否有权限使用URI中的参数查看他们请求的数据 这是我的密码: public class AccessActionFilter : FilterAttribute, IActionFilter { public

我正在使用asp.net WebAPI,我需要创建一个自定义的ActionFilter,它可以快速检查请求URI的用户是否能够实际获取数据

他们已经被授权通过基本身份验证使用web服务,并且他们的角色已经通过自定义角色提供程序验证

我需要做的最后一件事是检查他们是否有权限使用URI中的参数查看他们请求的数据

这是我的密码:

public class AccessActionFilter : FilterAttribute, IActionFilter
    {

        public System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken, Func<System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>> continuation)
        {

            var result = //code to see if they have permission returns either 0 or 1

            if (result==0) {
               throw new ArgumentException("You do not have access to this resource");
            }
            return continuation();
        }
    } 
公共类AccessActionFilter:FilterAttribute,IActionFilter
{
public System.Threading.Tasks.Task ExecuteActionFilterAsync(HttpActionContext actionContext,System.Threading.CancellationToken CancellationToken,Func continuation)
{
var result=//查看它们是否具有权限的代码返回0或1
如果(结果==0){
抛出新ArgumentException(“您无权访问此资源”);
}
返回continuation();
}
} 
目前,我只是抛出了一个错误,这不是我想要的,我宁愿返回
System.Net.HttpStatusCode.Unauthorized
,但我对覆盖的方法有点恼火,我并不完全理解它


如何返回该值?

您可能最好坚持使用异常,但使用HttpResponseException,它也将返回Http状态代码

throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized));
这个问题问得好

p、 美国

实现
ActionFilterAttribute

public class AccessActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var result = //code to see if they have permission returns either 0 or 1

        if (result==0) 
        {
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized));
        }
        base.OnActionExecuting(actionContext);
    }

}

您可以设置状态代码,而不是引发异常

public class ExecutionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var result = 0;//code to see if they have permission returns either 0 or 1

        if (result == 0)
        {
            actionContext.Response = new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.Unauthorized,
                Content = new StringContent("Unauthorized User")
            };
        }
        base.OnActionExecuting(actionContext);
    }
}

这违反了HTTP1.1。它说a必须提供一个
WWW-Authenticate
来表示一个可接受的方案<代码>ApiController.Unauthorized具有此参数。幸运的是,403 Probled没有问题。抛出异常代价很高,因此,通过发送许多无效的尝试并从抛出的HttpResponseExceptions的开销中在服务器上进行加载,这难道不更容易攻击服务器吗?或者多个请求的带宽是瓶颈,因此不会产生重大影响?@BornToCode所有类似的异常都将在HttpControllerDispatcher()中捕获在一个相当简单的try-catch中,专门寻找HttpResponseException——我不确定它们到底有多贵——正如我一贯建议的那样,我建议在一个线束中测试它并进行测量——如果差异会成为一个问题,我会感到惊讶——也可以看看异常是否真的“昂贵”由于不仅缺少授权,而且还提供了一个标识,但用户没有访问权限,因此正确的HTTP响应是403禁止的。