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

pub*_*tic 9 c# asp.net-mvc asp.net-web-api

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

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

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

        }
}
Run Code Online (Sandbox Code Playgroud)

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

filterContext.Result = new RedirectTo...
Run Code Online (Sandbox Code Playgroud)

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

Pil*_*iis 9

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

filterContext.Result = new  ObjectResult(actionContext.ModelState)
{
    Value = null,
    StatusCode = StatusCodes.Status403Forbidden
};
Run Code Online (Sandbox Code Playgroud)

或者也许创建像 BadRequest 这样的类会很方便,但对于 403 代码。

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

...

filterContext.Result = new ForbiddenObjectResult(filterContext.ModelState);
Run Code Online (Sandbox Code Playgroud)


xr2*_*0xr 8

如果您不想抛出异常,则可以返回 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");
}
Run Code Online (Sandbox Code Playgroud)

  • 我找不到 HttpStatusCodeResult。我使用 StatusCodeResult 代替。 (2认同)

Rhu*_*orl 2

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

throw new HttpException(403, "Forbidden");
Run Code Online (Sandbox Code Playgroud)

或者查看在创建 ErrorResponse 的WebAPI 方法中返回 HTTP 403 。

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

  • 在这种情况下抛出异常似乎并不正确。 (4认同)