как отключить тело сообщения 400 Bad request в Asp.Net Основной веб-API в рабочей среде?

#c# #asp.net-core #error-handling #asp.net-core-webapi #bad-request

#c# #asp.net-core #обработка ошибок #asp.net-core-webapi #bad-request

Вопрос:

У меня есть проект Web API с множеством контроллеров, валидаторов, служб и репозиториев в asp.net ядро

Я собираюсь отключить все тела сообщений 400 Bad requests (проверка свойства из модели или …) в рабочем режиме из-за безопасности

как я могу это сделать в asp.net ядро 2.2?

Комментарии:

1. Это можно легко сделать, но что вы собираетесь возвращать, если не HTTP400 для недопустимых входных данных? Это что-то чрезвычайно распространенное, и я бы не увидел абсолютно никакой выгоды для безопасности в его изменении

2. поверьте мне, это никоим мыслимым образом положительно не влияет на безопасность вообще. это просто доведет до белого каления любого, кто когда-либо пытался воспроизвести ошибку на ваших live-серверах. и выставить вас похожим на человека, который понятия не имеет, что они делают с кем-либо, кто возьмет на себя управление проектом в будущем.

3. @CamiloTerevinto спасибо вам за ваш ответ . на самом деле я был первым, кто выступил против этой идеи, но они дали мне эту задачу, и я должен ее выполнить. Я несколько раз предупреждал их, что это вообще не очень хорошая идея для создания веб-API с большей безопасностью. просто плохой запрос с телом сообщения: что-то не так! . можете ли вы помочь в этом?

4. @Franz Gleichmann спасибо за ваш ответ. Я верю в вас, и вы правы. Я был на том же этапе несколько лет назад и с теми же проблемами, о которых вы упомянули. в запутанном состоянии…

Ответ №1:

Как указывали другие в комментариях, это, вероятно, не очень хорошая идея, и вряд ли это улучшит безопасность, если ваши сообщения об ошибках будут оформлены должным образом.

Но на случай, если вы все же захотите этого, один из способов сделать это — реализовать фильтр действий MVC:

 public class BadRequestEmptyBodyFilter : IActionFilter, IOrderedFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        if (context.Result == null amp;amp; !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 IStatusCodeActionResu<
        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, чтобы отключить фильтр bad request по умолчанию:

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