26

我正在使用 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();
        }
    } 

目前我只是抛出一个不是我想要的错误,我宁愿返回System.Net.HttpStatusCode.Unauthorized,但我对我覆盖的方法有点恼火,我并不完全理解它。

我将如何返回该值?

4

2 回答 2

35

您可能最好坚持一个异常,但使用 HttpResponseException 也会返回一个 Http 状态代码。

throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized));

关于这个的好问题

ps

实施起来可能更简单/更干净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);
    }

}

于 2012-12-14T18:38:20.853 回答
7

您可以设置状态代码,而不是抛出异常

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);
    }
}
于 2019-02-08T04:46:06.150 回答