Запрещение HTTP-глаголов: System.Web.HttpMethodNotAllowedHandler никогда не вызывается - PullRequest
0 голосов
/ 22 мая 2019

На моем сайте я хочу запретить HTTP HEAD запросы и получить на них ответ с кодом состояния 405 (Method not allowed).Для этого в моем файле web.config есть следующее:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <remove name="TelemetryCorrelationHttpModule" />
    <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" preCondition="integratedMode,managedHandler" />
    <remove name="ApplicationInsightsWebTracking" />
    <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
  </modules>
  <handlers>
    <clear />
    <add name="DenyHead" path="*" verb="HEAD" type="System.Web.HttpMethodNotAllowedHandler" />
    <add name="DebugAttachHandler" path="DebugAttach.aspx" verb="DEBUG" type="System.Web.HttpDebugHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    <add name="StaticFile" path="*" verb="*" modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
  <security>
    <requestFiltering allowDoubleEscaping="true">
      <verbs allowUnlisted="false">
        <add verb="GET" allowed="true" />
        <add verb="POST" allowed="true" />
        <add verb="HEAD" allowed="true" />
        <add verb="DEBUG" allowed="true" />
      </verbs>
    </requestFiltering>
  </security>
</system.webServer>

К сожалению, это не сработает - вместо этого я получаю 404-стандартные болота.

Включение неудачного запросатрассировка приводит к следующему:

20  HANDLER_CHANGED OldHandlerName
                    NewHandlerName DenyHead
                    NewHandlerType System.Web.HttpMethodNotAllowedHandler

...

61  AspNetPipelineEnter Data1 <Application_BeginRequest in my ASP.NET application>

...

135 HANDLER_CHANGED OldHandlerName System.Web.HttpMethodNotAllowedHandler
                    NewHandlerName System.Web.Mvc.MvcHandler

...

169 MODULE_SET_RESPONSE_ERROR_STATUS Notification EXECUTE_REQUEST_HANDLER
                                     HttpStatus   404

Это, кажется, показывает, что обработчик DenyHead каким-то образом заменен / переопределен моим MVC-приложением, но в моем приложении нет кода, который бы делал что-либо подобное.

Я пробовал альтернативные рекомендации , такие как ответы здесь , но они дают тот же результат.

  • Фильтрация запросов не вариант, потому что код состоянияон возвращает не настраивается (он всегда возвращает 404).
  • Фильтры действий не вариант, потому что они не будут поражены для статического содержимого, и я не хочу отправлять все через конвейер MVC.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Я бы не стал использовать конфигурацию IIS, так как это делает вас зависимым от IIS, даже если вы уже это делаете. Использование фильтра удаляет эту зависимость, вот так:

public class VerbFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        if (context.HttpContext.Request.Method == "HEAD")
        {
            context.Result = new StatusCodeResult(405);
        }
        else
        {
            await next();
        }
    }
}
0 голосов
/ 23 мая 2019

Вы можете создать фильтр действий и проверить метод запроса. Если это «HEAD», вы можете отклонить запрос с помощью настроек Result в filterContext и установить для statuscode значение 405. Недопустимый метод.

Или Вы можете проверить вышеуказанную логику для Application_BeginRequest в Global.aspx и сделать то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...