Отображение диалога аутентификации прокси в C # - PullRequest
7 голосов
/ 17 ноября 2010

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

FtpWebRequest request = FtpWebRequest.Create(
                        new Uri("ftp://upload.myserver.com") as FtpWebRequest;

NetworkCredential credentials = new NetworkCredential("username", "password");
request.Credentials = credentials;

Это работает!

Я также пытался использовать CredentialCache.DefaultNetworkCredentials, но этоне работаетЯ хочу избежать хранения имени пользователя и пароля в любом месте (код, база данных, файл конфигурации).

Я подумал, что самым простым способом будет использовать тот же диалог, который отображается, когда я захожу в Интернет с помощью Internet Explorer.Кто-нибудь знает, как поднять этот диалог?

http://services.arcgisonline.com/arcgisexplorer500/help/proxy_connect_to_on_browser_request.png

РЕДАКТИРОВАТЬ

Целью этой задачи было загрузить файл через FTP.Наконец, я обнаружил, что нет необходимости устанавливать прокси для FTP-запросов, потому что .NET Framework не позволяет FTP работать через HTTP-прокси.Но вы должны явно установить для свойства proxy значение null.

FtpWebRequest request = FtpWebRequest.Create(
                        new Uri("ftp://upload.myserver.com") as FtpWebRequest;

NetworkCredential credentials = new NetworkCredential("username", "password");
request.Credentials = credentials;
request.Proxy = null;

Вот и все!

Ответы [ 3 ]

3 голосов
/ 18 ноября 2010

Прежде всего, id говорят, что это не диалог IE. Это должен быть системный диалог.
Кроме того, если вы вызываете его, вам все равно нужно будет получить доступ к введенным значениям и использовать их в своем коде. Этот диалог - просто окно ввода, он не даст вашему приложению доступ к прокси / интернету! Также вся обработка ошибок (неправильная, учетные данные и т. Д.) Должна выполняться самостоятельно.
Я думаю, что это может быть проще, проверить, нужен ли прокси (используя реестр Windows, wmi и т. Д.), И открыть пользовательскую форму, где вы можете легко получить доступ и повторно использовать значения.

3 голосов
/ 21 сентября 2012

В статье MSDN " Обработка аутентификации " автор пишет:

Прокси-аутентификация

Когда клиент пытаетсяПри использовании прокси-сервера, который требует аутентификации, он возвращает клиенту сообщение с кодом состояния 407.В этом сообщении прокси должен включать один или несколько заголовков ответа Proxy-Authenticate.Эти заголовки включают в себя методы аутентификации, доступные через прокси.WinINet выбирает первый метод, который он распознает.

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

После более продолжительного поиска я обнаружил статью базы знаний Майкрософт " Как обрабатывать авторизацию прокси с WinInet ", в которой приведен пример использования этой функции для аутентификации пользователя прокси..

Они предоставляют (C ++) пример кода с:

if ( InternetErrorDlg (GetDesktopWindow(),
      hReq, ERROR_INTERNET_INCORRECT_PASSWORD,
      FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
      FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
      FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
      NULL) == ERROR_INTERNET_FORCE_RETRY)
            goto again;

(см. это сообщение в блоге MSDN для примера P / Invoke функции InternetErrorDlg).

В статье «Обработка аутентификации» далее говорится:

Пользовательский интерфейс может использовать функцию InternetSetOption для установки INTERNET_OPTION_PROXY_PASSWORD и INTERNET_OPTION_PROXY_USERNAME значений, а затем повторно отправьте запрос в прокси.

Поэтому я могу предположить, что следующий «рабочий процесс» может быть успешным:

  1. Установите для прокси-сервера использование прокси-сервера по умолчанию, например, request.Proxy = WebRequest.GetSystemWebProxy().
  2. Запросите URL с HttpWebRequest (или FtpWebRequest).
  3. Если407 Код возврата HTTP возвращается, вызовите функцию InternetErrDlg.
  4. Повторите запрос URL.

Этот может работать, так как этот ответ утверждает, что он успешно использовал WebRequest, когда он только недавно открыл Internet Explorer и ввел там свои учетные данные прокси.

Поэтому я предполагаю, что информация прокси хранится где-то в «пользовательской сессии» Windows до тех поркак пользователь вошел в систему и доступен для всех приложений после аутентификации.

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

0 голосов
/ 18 ноября 2010

Может быть, это может помочь вам.Не уверен, что это именно то, что вы ищете.

http://sturla.simnet.is/post/2008/09/22/Enable-proxy-in-IE.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...