Как предотвратить IIS7 для обработки HTTP-кода состояния 401? - PullRequest
13 голосов
/ 05 декабря 2010

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

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

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

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>

Ответы [ 2 ]

13 голосов
/ 05 декабря 2010

Я только что нашел простое решение этой проблемы. Я просто добавляю новые настройки в файл 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. Но я не могу найти атрибут существующий ответ в функции «Страницы ошибок» диспетчера IIS.

11 голосов
/ 26 июня 2013

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

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

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

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

Другой способ - установить для существующего ответа значение «PassThrough» в файле web.config

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

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

...