То, как подавить “аутентификацию браузера, потребовало” диалогового окна при выполнении вызова ajax, который требует аутентификации?

Точная Аудио Копия прокладывает себе путь на Windows XP. Стандартный файл открывается, диалоговое окно показывают, но поле имени файла содержит текст "Имя файла, будет проигнорирован".

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

Редактирование: это намного легче, чем я думал. Вот является код в C++ / MFC, можно перевести его в среду по Вашему выбору.

CFileDialog dlg(true, NULL, "Filename will be ignored", OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_PATHMUSTEXIST | OFN_READONLY, NULL, this);
dlg.DoModal();

Редактирование 2: Это должно быть переводом в C#, но я не бегло говорю на C#, так не стреляйте в меня, если он не работает.

OpenFileDialog openFileDialog1 = new OpenFileDialog();

openFileDialog1.FileName = "Filename will be ignored";
openFileDialog1.CheckPathExists = true;
openFileDialog1.ShowReadOnly = false;
openFileDialog1.ReadOnlyChecked = true;
openFileDialog1.CheckFileExists = false;
openFileDialog1.ValidateNames = false;

if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
    // openFileDialog1.FileName should contain the folder and a dummy filename
}

Редактирование 3: Наконец посмотрел на фактическое рассматриваемое диалоговое окно, в Visual Studio 2005 (у меня не было доступа к нему ранее). Это не стандартный файл открытое диалоговое окно! , Если Вы осматриваете окна в Шпионе ++ и сравниваете их со стандартным открытым файлом, Вы будете видеть, что структура и имена классов не соответствуют. Когда Вы смотрите тесно, можно также определить некоторые различия между содержанием диалоговых окон. Мое заключение состоит в том, что Microsoft полностью заменила стандартное диалоговое окно в Visual Studio, чтобы дать ему эту возможность. Мое решение или что-то подобное будут так близки, как можно добраться, если Вы не готовы кодировать свое собственное с нуля.

6
задан makeee 26 October 2009 в 19:42
поделиться

5 ответов

Я решил эту проблему, установив прокси-сервер между браузером и службой, требующей аутентификации, в моем случае - сервлетом Java. Браузер отправляет запрос AJAX сервлету, который пересылает запрос службе, а затем отправляет обратно ответ службы, опуская заголовок «WWW-Authenticate». Ваше приложение для браузера. обрабатывает код ответа HTTP 200 или 401 соответственно.

Точно так же прокси всегда может вернуть 200 с ответом json, указывающим результаты перенаправленного запроса. Таким образом, вы сможете различить разницу между отказом вашего прокси-сервера и ответом службы.

Возможно, вам придется иметь дело с одной сложной вещью - если удаленная служба отвечает заголовком set-cookie, скажем, потому что это создал сеанс для вашего клиента, тогда у вас есть (как минимум) 2 возможных пути.

  1. ваш прокси запомнит куки, ваше приложение браузера. всегда проходит через прокси для этой службы, и прокси добавляет этот файл cookie к последующим перенаправленным запросам. или
  2. вы игнорируете cookie службы и заставляете браузер повторно аутентифицироваться непосредственно в службе после того, как вы подтвердите имя пользователя и пароль через прокси. Хотя это может иметь побочный эффект в виде создания потерянного сеанса со службой
1
ответ дан 17 December 2019 в 22:13
поделиться

Instead of the url string being "http://blah.com", make it "http://user:password@blah.com"

// Note that you might need to trim http:// out of endpoint first
url: 'http://' + username + ':' + password + '@' + endpoint,
1
ответ дан 17 December 2019 в 22:13
поделиться

Без jquery (не работает в IE, но это нормально для расширений firefox):

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://example.com", true, "username", "password");
xhr.onreadystatechange = function(){
  if(this.readyState == 4){
    if(this.status == 200){
      alert("we got a response");
    }
  }
}
xhr.send();
0
ответ дан 17 December 2019 в 22:13
поделиться

Как насчет того, чтобы не использовать HTTP-аутентификацию? Используйте стандартный вход с файлами cookie или просто отправьте POST имя пользователя и пароль, которые пользователь вводит в сценарий, и проверьте данные по базе данных пользователей.

0
ответ дан 17 December 2019 в 22:13
поделиться

Вы не можете сделать это в IE или firefox, и вы никогда не сможете сделать это из javascript по соображениям безопасности. В браузере нет настроек, позволяющих избежать запроса на HTTP-аутентификацию. Это очень раздражает, когда у вас есть 50 изображений, для которых требуется HTTP-аутентификация.

-1
ответ дан 17 December 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: