Отображение диалога аутентификации прокси в C#

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

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 ответа

Решение

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

В статье 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 до тех пор, пока пользователь вошел в систему, и доступна для всех приложений после аутентификации.

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

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

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

Другие вопросы по тегам