C# 如何创建返回禁止结果的筛选器
我想创建一个web api过滤器,用于检查请求头是否具有正确的api密钥 如果没有,我想返回403响应代码并停止执行(禁止操作) 使用filterContext,我知道我可以执行以下操作:C# 如何创建返回禁止结果的筛选器,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我想创建一个web api过滤器,用于检查请求头是否具有正确的api密钥 如果没有,我想返回403响应代码并停止执行(禁止操作) 使用filterContext,我知道我可以执行以下操作: filterContext.Result = new RedirectTo... 但是我如何才能将状态代码更改为403,然后返回一个字符串并停止执行并停止处理其他筛选器和控制器操作呢?您可以抛出一个允许您传递任何HTTP代码并停止执行(因为这是一个异常) 或者看看哪个会产生错误响应 您可能还想考虑将此移动到
filterContext.Result = new RedirectTo...
但是我如何才能将状态代码更改为403,然后返回一个字符串并停止执行并停止处理其他筛选器和控制器操作呢?您可以抛出一个允许您传递任何HTTP代码并停止执行(因为这是一个异常)
或者看看哪个会产生错误响应
您可能还想考虑将此移动到AudiiStudio FieltAtter属性,因为您正在检查用户的API密钥以授权它们执行该操作。
< p>您可以抛出HtpExpExt:< /P> throw new HttpException(403, "Forbidden");
详情请浏览: 如果不想抛出异常,可以返回
httpstatuscodesult
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");
}
看起来发布的答案与Asp.Net Core 2.1不兼容。在核心部分,你可以做类似的事情
filterContext.Result = new ObjectResult(actionContext.ModelState)
{
Value = null,
StatusCode = StatusCodes.Status403Forbidden
};
或者,创建像BadRequest这样的类可能会很方便,但对于403代码
public class ForbiddenObjectResult : ObjectResult
{
public ForbiddenObjectResult(object value)
: base(value)
{
StatusCode = StatusCodes.Status403Forbidden;
}
}
...
filterContext.Result = new ForbiddenObjectResult(filterContext.ModelState);
或者您可以返回:
filterContext.Result = new ForbidResult();
在.NET core(我使用的是3.0)中,您可以通过在操作筛选器中使用以下命令来确保代码不会随后到达控制器操作:
filterContext.Result = new StatusCodeResult(StatusCodes.Status403Forbidden);
在这种情况下,抛出异常似乎并不正确。使用异常处理控制流是一种反模式,因此不应建议这样做!你有没有想过?我还觉得抛出异常是错误的。@JasonBray请看我的回答这最好是作为注释,而不是答案。如果未设置某些身份验证方案,这会尝试重定向并返回错误的请求(400)。我找不到HttpStatusCodeResult。我改用StatusCodeResult。这个答案适用于ASP.NET MVC,即(System.Web.MVC)。是的,它看起来像是
Microsoft.AspNetCore.Mvc.StatusCodeResult
是为ASP.NET Core做这件事的一种方法ControllerBase
提供了一种方法作为创建其中一个的快捷方式。我还看到了一个有趣的类,它不是从StatusCodeResult
继承的。我很好奇这是什么原因。使用异常处理控制流是一个反物质,所以不应该建议它!
filterContext.Result = new ForbidResult();
filterContext.Result = new StatusCodeResult(StatusCodes.Status403Forbidden);