ASP.NET WindowsAuthentication custom 401 Страница несанкционированной ошибки

У меня есть веб-сайт ASP.NET с проверкой подлинности с помощью ActiveDirectory.

Теперь, когда аутентифицированный пользователь открывает страницу - он автоматически аутентифицируется. Я столкнулся с проблемой - когда пользователь, не прошедший проверку подлинности (например, пользователь Mozilla Firefox с неопределенным свойством network.automatic-ntlm-auth.trusted-uris), открывает страницу, IIS отправляет 401 ответ и подсказки для входа\пароля.

Я хочу не запрашивать пароль для входа в систему - просто покажите собственную страницу с ошибкой. Это звучит довольно просто - пользователи, прошедшие аутентификацию, получают запрошенную страницу, не прошедшие аутентификацию, перенаправляются на страницу пользовательских ошибок. Это отлично работает для FormsAuthentication.

Тем не менее, я уже пробовал так много способов. Любые перенаправления Web.config не работают. Даже если я очистил Response и поставлю туда перенаправление - я получу цикл, потому что эта настраиваемая страница (*, например, /Error/AccessDenied) также требует аутентификации. Пометка контроллера как AllowAnonymous ничего не делает.

Однако, если я разрешаю анонимную проверку подлинности в диспетчере IIS, настоящие пользователи аутентифицированного домена не авторизованы при открытии веб-сайта.

Как я могу решить эту проблему?

Ответ 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.

Ответ 2

Важное дополнение к комментарию Йелдара:

При изменении ответного сообщения для удаленных запросов (read: non-localhost) вам нужно добавить в конфигурационный файл следующее:

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

Если вы не позволяете ответу "проходить через" удаленные клиенты, получите значение по умолчанию "You do not have permission to view this directory or page".

Я получил эту информацию от: fooobar.com/info/154471/...