Как я могу отключить диалоговое окно аутентификации браузера?

StackOverflow https://stackoverflow.com/questions/86105

Вопрос

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

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

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

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

Есть ли какой-нибудь способ, которым я могу отключить диалоговое окно аутентификации?В частности, могу ли я отключить диалоговое окно "Требуется проверка подлинности" в Firefox 2 или более поздней версии?Есть ли какой-нибудь способ подавить Подключение к [ведущий] диалоговое окно в IE 6 и более поздних версиях?


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

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

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

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

Это было полезно?

Решение

Я не думаю, что это возможно - если вы используете реализацию HTTP-клиента браузера, всегда будет всплывать это диалоговое окно.На ум приходят два хака:

  1. Возможно, Flash обрабатывает это по-другому (я еще не пробовал), поэтому запрос с помощью flash movie может помочь.

  2. Вы можете настроить "прокси" для службы, к которой вы обращаетесь на своем собственном сервере, и попросить его немного изменить заголовки аутентификации, чтобы браузер их не распознал.

Другие советы

Я столкнулся с такой же проблемой здесь, и серверный инженер моей компании внедрил поведение, которое, по-видимому, считается хорошей практикой :когда вызов URL возвращает значение 401, если клиент установил заголовок X-Requested-With: XMLHttpRequest, сервер сбрасывает www-authenticate заголовок в своем ответе.

Побочным эффектом является то, что всплывающее окно проверки подлинности по умолчанию не появляется.

Убедитесь, что ваш вызов API имеет X-Requested-With заголовок установлен в XMLHttpRequest.Если это так, то ничего не остается делать, кроме как изменить поведение сервера в соответствии с этой хорошей практикой...

Браузер выдает запрос на вход в систему при выполнении обоих следующих условий:

  1. Статус HTTP - 4xx
  2. WWW-Authenticate заголовок присутствует в ответе

Если вы можете контролировать HTTP-ответ, то вы можете удалить WWW-Authenticate заголовок из ответа, и браузер не будет открывать диалоговое окно входа в систему.

Если вы не можете контролировать ответ, вы можете настроить прокси-сервер для фильтрации WWW-Authenticate заголовок из ответа.

Насколько я знаю (не стесняйтесь поправить меня, если я ошибаюсь), нет способа предотвратить запрос на вход в систему, как только браузер получит WWW-Authenticate заголовок.

Я понимаю, что этот вопрос и ответы на него очень старые.Но в итоге я оказался здесь.Возможно, другие тоже это сделают.

Если у вас есть доступ к коду веб-службы, которая возвращает значение 401.Просто измените сервис, чтобы в этой ситуации возвращать 403 (Запрещено) вместо 401.Браузер не будет запрашивать учетные данные в ответ на сообщение 403.403 - это правильный код для прошедшего проверку подлинности пользователя, который не авторизован для определенного ресурса.Похоже, такова ситуация с операцией.

Из документа IETF о 403:

Сервер, который получает действительные учетные данные, которые не адекватны получение доступа должны отвечать 403 (запрещено) - код состояния

В Mozilla вы можете достичь этого с помощью следующего скрипта при создании объекта XMLHttpRequest:

xmlHttp=new XMLHttpRequest();
xmlHttp.mozBackgroundRequest = true;
xmlHttp.open("GET",URL,true,USERNAME,PASSWORD);
xmlHttp.send(null);

2-я строка не позволяет открыть диалоговое окно....

Какую серверную технологию вы используете и есть ли какой-то конкретный продукт, который вы используете для аутентификации?

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

В Mozilla land, установив параметр mozBackgroundRequest для XMLHttpRequest (Документы) значение true подавляет эти диалоговые окна и приводит к тому, что запросы просто завершаются сбоем.Однако я не знаю, насколько хороша кроссбраузерная поддержка (в том числе, очень ли хорошо качество информации об ошибках в этих неудачных запросах в разных браузерах).

у jan.vdbergh есть правда, если вы можете изменить 401 на стороне сервера на другой код состояния, браузер не будет перехватывать и отображать всплывающее окно.Другим решением может быть изменение заголовка WWW-Authenticate на другой пользовательский заголовок.Я не понимаю, почему другой браузер не может это поддерживать, в нескольких версиях Firefox мы можем выполнить запрос xhr с помощью mozBackgroundRequest, но в других браузерах??здесь есть интересный Ссылка с этой проблемой в Chromium.

У меня такая же проблема с MVC 5 и VPN, когда всякий раз, когда мы находимся за пределами DMZ, используя VPN, нам приходится отвечать на это сообщение браузера.Используя .net, я просто обрабатываю маршрутизацию ошибки, используя

<customErrors defaultRedirect="~/Error"  >
  <error statusCode="401" redirect="~/Index"/>
</customErrors>

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

      DirectoryEntry entry = new DirectoryEntry("LDAP://OurDomain");
      DirectorySearcher Dsearch = new DirectorySearcher(entry);
      Dsearch.Filter = "(SAMAccountName=" + UserID + ")";
      Dsearch.PropertiesToLoad.Add("cn");

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

Для тех, кто не использует 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
}

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

Я использую Node, Express & Passport и боролся с той же проблемой.Я заставил это сработать, явно установив www-authenticate заголовок к пустой строке.В моем случае это выглядело примерно так:

(err, req, res, next) => {
  if (err) {
    res._headers['www-authenticate'] = ''
    return res.json(err)
  }
}

Я надеюсь, что это кому-то поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top