#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;
});