Как предотвратить 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>
Ответы
Ответ 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.