如何创建返回禁止结果的筛选器

本文关键字:结果 禁止 筛选 返回 何创建 创建 | 更新日期: 2023-09-27 18:22:28

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

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

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

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

filterContext.Result = new RedirectTo...

但我如何将状态代码更改为403,然后返回一个字符串,停止执行并停止处理其他筛选器和控制器操作

如何创建返回禁止结果的筛选器

看起来发布的答案与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);

如果不想抛出异常,可以返回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");
}

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

throw new HttpException(403, "Forbidden");

或者查看创建ErrorResponse的WebAPI方法中的ReturningHTTP403。

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

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

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

或者您可以返回:

filterContext.Result = new ForbidResult();

您可以抛出HttpException:

 throw new HttpException(403, "Forbidden");

欲了解更多详情,请访问;http://msdn.microsoft.com/fr-fr/library/system.web.httpexception(v=vs.110).aspx