如何在生产环境中禁用Asp.Net Core Web API中的400 Bad request消息体?

问题描述 投票:0回答:2

我有一个 Web API 项目,其中包含许多 ASP.NET Core 中的控制器、验证器、服务和存储库

出于安全考虑,我将在生产模式下禁用所有 400 Bad requests 消息体(验证模型中的属性或...)

我如何在 asp.net core 2.2 中做到这一点?

c# asp.net-core error-handling asp.net-core-webapi bad-request
2个回答
0
投票

正如其他人在评论中指出的那样,这可能不是一个好主意,如果错误消息设计正确,则不太可能提高安全性。

但如果您仍然想要这样做,一种方法是实现 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;
    });

0
投票

在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;
     });
© www.soinside.com 2019 - 2024. All rights reserved.