Подтвердить что ты не робот

Как предотвратить IIS7 для обработки кода статуса 401 HTTP?

Я работаю над своим проектом ASP.NET MVC 2. Я создаю фильтр исключений для исключения неавторизованного доступа, которые возникают, когда пользователь не имеет разрешения на просмотр какого-либо действия.

[CustomError(typeof(UnauthorizedAccessException), "Error", "UnauthorizedAccess")]
public class MyController : BaseController
{
}

После того, как выбрано исключение, мой фильтр перейдет к сконфигурированному контроллеру/действию, который является следующим методом.

public ActionResult UnauthorizedAccess(ExceptionContext context)
{
    Response.StatusCode = CustomHttpStatusCode.UnauthorizedUser;

    return View(model);
}

Наконец, перед тем как приложение ASP.NET завершит этот запрос, он вызовет следующий метод, который находится в Global.ascx для изменения пользовательского кода состояния HTTP на статус HTTP 401 (несанкционированный доступ).

public void Application_EndRequest(object sender, EventArgs e)
{
    if (Response.StatusCode == CustomHttpStatusCode.UnauthorizedUser)
    {
        Response.StatusCode = 401;
    }
}

Все работает отлично на моей машине (IIS 7.5). Но он не работает на моем веб-сайте развертывания. Он по-прежнему возвращает обычный текст "У вас нет разрешения на просмотр этого каталога или страницы". вместо моей пользовательской страницы ошибок.

PS. Следующая конфигурация - это мой текущий файл web.config для этого случая.

  <?xml version="1.0" encoding="UTF-8"?>
  <configuration>
    <system.web>
      <customErrors mode="On"></customErrors>
    </system.web>
    <system.webServer>
      <httpErrors errorMode="Custom">
         <remove statusCode="502" subStatusCode="-1" />
         <remove statusCode="501" subStatusCode="-1" />
         <remove statusCode="500" subStatusCode="-1" />
         <remove statusCode="412" subStatusCode="-1" />
         <remove statusCode="406" subStatusCode="-1" />
         <remove statusCode="405" subStatusCode="-1" />
         <remove statusCode="404" subStatusCode="-1" />
         <remove statusCode="403" subStatusCode="-1" />
         <remove statusCode="401" subStatusCode="-1" />
      </httpErrors>
    </system.webServer>
  </configuration>
4b9b3361

Ответ 1

Я просто нашел легкое решение этой проблемы. Я просто добавляю новую настройку в файл web.config, например, следующий код. Все работает отлично на моем веб-сайте развертывания.

  <?xml version="1.0" encoding="utf-8"?>
  <configuration> 
    <system.webServer>
      <httpErrors errorMode="Custom" existingResponse="PassThrough">
          <remove statusCode="502" subStatusCode="-1" />
          <remove statusCode="501" subStatusCode="-1" />
          <remove statusCode="500" subStatusCode="-1" />
          <remove statusCode="412" subStatusCode="-1" />
          <remove statusCode="406" subStatusCode="-1" />
          <remove statusCode="405" subStatusCode="-1" />
          <remove statusCode="404" subStatusCode="-1" />
          <remove statusCode="403" subStatusCode="-1" />
          <remove statusCode="401" subStatusCode="-1" />
      </httpErrors>
    </system.webServer>
  </configuration>

Таким образом, я могу создать страницу пользовательской ошибки как в текстовом редакторе, так и в ответе JSON.

Для получения дополнительной информации: HttpErrorsSection Class

PS. Но я не могу найти атрибут existingResponse в функции "Страницы ошибок" диспетчера IIS.

Ответ 2

Вы можете передавать сообщения об ошибках по умолчанию IIS7 двумя способами.

Один из них - установить response.TrySkipIisCustomErrors, чтобы быть правдой.

response.TrySkipIisCustomErrors = true;
response.Status = response.Status;

По какой-то причине TrySkipIisCustomErrors не соблюдается, если вы не установите response.Status.

Другой - установить существующийResponse на "PassThrough" в web.config

<configuration>
  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>
</configuration>

Но это игнорирует все настраиваемые страницы ошибок IIS.