12

У меня есть веб-сайт ASP.NET с аутентификацией с использованием ActiveDirectory.ASP.NET WindowsAuthentication custom 401 Страница несанкционированной ошибки

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

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

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

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

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

+0

Вы хотите не-IE пользователей переадресованы на другую страницу? Перенос URL-адресов на основе User Agent - путь. –

+0

Невозможно. Первый запрос из браузера всегда анонимный. IIS всегда отвечает '401 Unauthorized' заголовком' www.authenticate: negotiate' (или NTLM или оба). Затем клиент (браузер) снова запрашивает заголовок 'Authorization: Negotiate ..hash..' на этот раз. В зависимости от доверенного сайта браузер *** всегда будет запрашивать учетные данные. Вы не можете показать пользовательскую ошибку, потому что первый ответ всегда '401', независимо. – Abhitalks

+0

Вы можете написать HTTP-модуль и подключиться к HttpApplication.PostAuthenticateRequest. Оттуда вы можете использовать HttpContext.RewritePath и/или в значительной степени играть с контекстом ответа так, как хотите. Трудно сказать больше без очевидного случая с воспроизведением. –

ответ

14

Благодаря @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.

+0

Спасибо, искал это. +1 для вас – KoenW

1

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

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

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

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

Я получил эту информацию от: https://stackoverflow.com/a/17324195/3310441

Смежные вопросы