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

javascript ajax http-authentication

52605 просмотра

11 ответа

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

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

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

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

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


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

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

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

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

Автор: dgvid Источник Размещён: 04.10.2019 11:16

Ответы (11)


17 плюса

Решение

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

  1. Может быть, Flash обрабатывает это по-другому (я еще не пробовал), так что использование Flash-фильма может помочь.

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

Автор: Marijn Размещён: 18.09.2008 07:55

46 плюса

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

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

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

Автор: Antoine Banctel-Chevrel Размещён: 26.11.2013 03:31

15 плюса

В браузере появляется запрос на вход в систему, когда выполняются оба следующих условия:

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

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

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

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

Автор: rustyx Размещён: 16.03.2015 04:47

5 плюса

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

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

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

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

Автор: Jim Reineri Размещён: 05.10.2016 03:13

4 плюса

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

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

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

Автор: Yogesh Размещён: 04.10.2008 04:41

2 плюса

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

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

Автор: jan.vdbergh Размещён: 17.09.2008 06:34

2 плюса

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

Автор: rakslice Размещён: 30.01.2009 04:08

2 плюса

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

Автор: Kalamarico Размещён: 26.07.2012 09:54

1 плюс

У меня есть такая же проблема с 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");

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

Автор: Clarence Размещён: 28.05.2015 03:57

0 плюса

Для тех unsing 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
}

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

Автор: Matas Vaitkevicius Размещён: 24.05.2016 11:16

0 плюса

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

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

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

Автор: John Knotts Размещён: 18.10.2017 12:14
Вопросы из категории :
32x32