Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何禁用400错误请求';生产环境中Asp.Net核心web API中的消息体?_C#_Asp.net Core_Error Handling_Asp.net Core Webapi_Bad Request - Fatal编程技术网

C# 如何禁用400错误请求';生产环境中Asp.Net核心web API中的消息体?

C# 如何禁用400错误请求';生产环境中Asp.Net核心web API中的消息体?,c#,asp.net-core,error-handling,asp.net-core-webapi,bad-request,C#,Asp.net Core,Error Handling,Asp.net Core Webapi,Bad Request,我有一个Web API项目,在asp.net核心中有许多控制器、验证器、服务和存储库 由于安全原因,我将在生产模式上禁用所有400个错误请求消息体(验证模型中的属性或…) 如何在asp.net core 2.2中做到这一点?正如其他人在评论中指出的那样,这可能不是一个好主意,如果错误消息设计正确,则不太可能提高安全性 但是,如果您希望这样做,一种方法是实现MVC操作过滤器: public class BadRequestEmptyBodyFilter : IActionFilter, IOrde

我有一个Web API项目,在asp.net核心中有许多控制器、验证器、服务和存储库

由于安全原因,我将在生产模式上禁用所有400个错误请求消息体(验证模型中的属性或…)


如何在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;
}
然后在
启动
中注册。此外,您还应将apibhavioroptions.SuppressModelStateInvalidFilter设置为true以禁用默认的错误请求筛选器:

services.AddMvc(options =>
    {
        options.Filters.Add<BadRequestEmptyBodyFilter>();
    })
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressModelStateInvalidFilter = true;
    });
services.AddMvc(选项=>
{
options.Filters.Add();
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.ConfigureApiBehaviorOptions(选项=>
{
options.SuppressModelStateInvalidFilter=true;
});

这很容易做到,但是如果无效输入不是HTTP400,您将返回什么?这是一种非常普遍的现象,我认为改变它绝对不会带来安全方面的好处相信我,这根本不会对安全产生积极的影响。这只会让任何试图在你的实时服务器上复制bug的人感到恼火。让你看起来像一个不知道自己对将来接手这个项目的人做了什么的人。@camiloterivento感谢你的回应。事实上,我是第一个反对这个想法的人,但他们给了我这个任务,我必须去做。我多次警告他们,让web API更安全一点也不好。只是一个错误的请求,消息体:有问题。“你能帮我做这件事吗?”弗兰兹·格雷克曼感谢你的回答。我相信你,你是对的。几年前我也处在同一个阶段,和你提到的问题一样。在混乱的状态下。。。