Ответ 1
Благодаря @Abhitalks для объяснения того, как это работает в комментариях. Я не знаю почему, но я был уверен, что IE и Google Chrome отправляют заголовок авторизации по первому запросу, и поэтому только неавторизованные пользователи получают ответ 401. После того, как я понял, что я не могу вообще избежать ответа 401, я решил использовать этот простой подход, поскольку это поведение является самым близким к желаемому.
Я добавил следующий метод в Global.asax
:
protected void Application_EndRequest(object sender, EventArgs e)
{
if (Response.StatusCode == 401)
{
Response.ClearContent();
Response.WriteFile("~/Static/NotAuthorized.html");
Response.ContentType = "text/html";
}
}
Теперь, когда пользователь открывает страницу, сервер возвращает ему страницу пользовательских ошибок, но с заголовком 401 Unauthorized
.
Chrome, IE или хорошо настроенный Firefox. Пользователи запрашивают URL-адрес, сервер возвращает страницу с ошибкой с заголовком 401 - браузер автоматически завершает вызов авторизации, перенаправляет на тот же URL-адрес, сервер возвращает правильную страницу и теперь 200. Пользователь не увидит эту страницу с ошибкой.
Неконфигурированный Firefox. Пользователь запрашивает URL-адрес, сервер возвращает страницу с ошибкой с заголовком 401 - браузер не может завершить запрос авторизации и запрашивает у пользователя учетные данные.
-
Пользователь вводит правильный логин. Пользователь снова запрашивает тот же URL-адрес, получает страницу и 200 ОК.
-
Пользователь вводит неверный логин. В браузере снова запрашиваются учетные данные.
-
Пользователь нажимает Отмена. Браузер отображает страницу пользовательских ошибок, которая была отправлена с заголовком 401. Эта страница сообщает пользователю, что если он использует Firefox, он должен либо ввести свои учетные данные, либо разрешить автоматическую проверку подлинности NTLM.