Как я могу подавить диалог аутентификации браузера? - PullRequest
74 голосов
/ 17 сентября 2008

Мое веб-приложение имеет страницу входа, которая отправляет учетные данные для аутентификации через вызов AJAX. Если пользователь вводит правильное имя пользователя и пароль, все в порядке, но если нет, происходит следующее:

  1. Веб-сервер определяет, что, хотя в запрос включен правильно сформированный заголовок авторизации, учетные данные в заголовке не проходят проверку подлинности.
  2. Веб-сервер возвращает код состояния 401 и включает в себя один или несколько заголовков WWW-Authenticate со списком поддерживаемых типов аутентификации.
  3. Браузер обнаруживает, что ответом на мой вызов объекта XMLHttpRequest является 401, и ответ включает заголовки WWW-Authenticate. Затем появляется диалоговое окно аутентификации с запросом имени пользователя и пароля.

Это нормально до шага 3. Я не хочу, чтобы диалоговое окно всплывало, я хочу обработать ответ 401 в моей функции обратного вызова AJAX. (Например, отображая сообщение об ошибке на странице входа в систему.) Я хочу, чтобы пользователь повторно вводил свои имя пользователя и пароль, конечно, но я хочу, чтобы они увидели мою дружественную, обнадеживающую форму входа в систему, а не уродливый браузер, по умолчанию диалог аутентификации.

Между прочим, я не имею никакого контроля над сервером, поэтому заставить его возвращать пользовательский код состояния (т. Е. Что-то отличное от 401) не вариант.

Есть ли способ подавить диалог аутентификации? В частности, можно ли отключить диалоговое окно «Требуется аутентификация» в Firefox 2 или более поздней версии? Есть ли способ подавить диалог Connect to [host] в IE 6 и более поздних версиях?


Редактировать
Дополнительная информация от автора (18 сентября):
Я должен добавить, что реальная проблема с диалоговым окном аутентификации браузера заключается в том, что он дает недостаточно информации пользователю.

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

Диалог не подтверждает тот факт, что он просто сделал , введя имя пользователя и пароль. В нем четко не указано, что возникла проблема и что он должен попробовать еще раз. Вместо этого диалоговое окно предоставляет пользователю зашифрованную информацию, такую ​​как «Сайт говорит:« [realm] '». Где [realm] - это короткое имя области, которое может любить только программист.

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

Ответы [ 11 ]

0 голосов
/ 24 мая 2016

Для тех, кто не использует C #, здесь ActionAttribute, который возвращает 400 вместо 401, и «проглатывает» диалог базовой аутентификации.

public class NoBasicAuthDialogAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);
        filterContext.Result = new HttpStatusCodeResult(400);
    }
}

используйте как указано ниже:

[NoBasicAuthDialogAuthorize(Roles = "A-Team")]
public ActionResult CarType()
{
 // your code goes here
}

Надеюсь, это сэкономит вам время.

...