我有一个 Web API 项目,其中包含许多 ASP.NET Core 中的控制器、验证器、服务和存储库
出于安全考虑,我将在生产模式下禁用所有 400 Bad requests 消息体(验证模型中的属性或...)
我如何在 asp.net core 2.2 中做到这一点?
正如其他人在评论中指出的那样,这可能不是一个好主意,如果错误消息设计正确,则不太可能提高安全性。
但如果您仍然想要这样做,一种方法是实现 MVC 操作过滤器:
public class BadRequestEmptyBodyFilter : IActionFilter, IOrderedFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
if (context.Result == null && !context.ModelState.IsValid)
{
context.Result = new ObjectResult(null)
{
StatusCode = StatusCodes.Status400BadRequest
};
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
if (context.Exception != null || context.Result == null)
{
return;
}
var statusCodeResult = context.Result as IStatusCodeActionResult;
if (statusCodeResult?.StatusCode == StatusCodes.Status400BadRequest)
{
context.Result = new ObjectResult(null)
{
StatusCode = StatusCodes.Status400BadRequest
};
}
}
// Set this to a large negative number so it runs early in the pipeline
public int Order => -1000000;
}
然后在
Startup
中注册。另外,您应该将 ApiBehaviorOptions.SuppressModelStateInvalidFilter
设置为 true 以禁用默认的错误请求过滤器:
services.AddMvc(options =>
{
options.Filters.Add<BadRequestEmptyBodyFilter>();
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.ConfigureApiBehaviorOptions(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
在Asp.Net 8、7和6中,您可以在program.cs中重写SuppressModelStateInvalidFilter。
只需将此命令添加到您的program.cs文件中:
builder.Services.AddControllers()
.ConfigureApiBehaviorOptions(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
此外,如果您使用的是旧版本,则必须将其添加到您的startup.cs文件中,如下所示:
services.AddControllers()
.ConfigureApiBehaviorOptions(options =>
{
options.SuppressModelStateInvalidFilter = true;
});