如何创建返回禁止结果的过滤器

时间:2014-09-17 21:11:29

标签: c# asp.net-mvc asp.net-web-api

我想创建一个web api过滤器,用于检查请求标头是否具有正确的Api密钥。

如果没有,我想返回403响应代码并暂停执行(禁止操作)

public class ApiPermission : ActionFilterAttribute
{
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {

        }
}

使用filterContext我知道我可以做类似的事情:

filterContext.Result = new RedirectTo...

但是如何将状态代码更改为403并返回一个字符串并停止执行并停止处理其他过滤器和控制器操作?

6 个答案:

答案 0 :(得分:6)

如果您不想抛出异常,则可以返回HttpStatusCodeResult

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.Result != null) return;   //Another filter has already returned a result so pass it on

    //Do your filtering

    filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden, "Forbidden");
}

答案 1 :(得分:2)

看起来发布的答案不兼容Asp.Net Core 2.1。在核心你可以做类似的事情

filterContext.Result = new  ObjectResult(actionContext.ModelState)
{
    Value = null,
    StatusCode = StatusCodes.Status403Forbidden
};

或许它可以方便地创建像BadRequest这样的类,但对于403 Code。

public class ForbiddenObjectResult : ObjectResult
{
    public ForbiddenObjectResult(object value)
            : base(value)
    {
        StatusCode = StatusCodes.Status403Forbidden;
    }
}

...

filterContext.Result = new ForbiddenObjectResult(filterContext.ModelState);

答案 2 :(得分:1)

您可以抛出一个HttpException,它允许您传递任何HTTP代码并停止执行(因为它是一个例外)

throw new HttpException(403, "Forbidden");

或者查看创建ErrorResponse的Returning HTTP 403 in a WebAPI method

您可能还需要考虑将其移至AuthorizationFilterAttribute中,因为您正在检查用户的API密钥以授权他们执行操作。

答案 3 :(得分:1)

你可以抛出HttpException:

 throw new HttpException(403, "Forbidden");

有关详细信息,请访问; http://msdn.microsoft.com/fr-fr/library/system.web.httpexception(v=vs.110).aspx

答案 4 :(得分:1)

或者您可以返回:

filterContext.Result = new ForbidResult();

答案 5 :(得分:0)

在.NET core(我使用的是3.0)中,您可以通过在动作过滤器中使用以下命令来确保代码随后不会到达控制器动作:

 filterContext.Result = new StatusCodeResult(StatusCodes.Status403Forbidden);