Отображение диалога аутентификации прокси в 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
значения, а затем повторно отправить запрос на прокси.
Поэтому я предполагаю, что следующий "рабочий процесс" может быть успешным:
- Установите прокси для использования прокси по умолчанию с чем-то вроде
request.Proxy = WebRequest.GetSystemWebProxy()
, - Запросить URL с
HttpWebRequest
(или жеFtpWebRequest
). - Если возвращается код состояния 407 HTTP, вызовите
InternetErrDlg
функция. - Повторите запрос URL.
Это может сработать, так как этот ответ утверждает, что он успешно использовал WebRequest
когда он только недавно открыл Internet Explorer и ввел там свои учетные данные прокси.
Поэтому я предполагаю, что информация о прокси хранится где-то в "пользовательской сессии" Windows до тех пор, пока пользователь вошел в систему, и доступна для всех приложений после аутентификации.
Поскольку я сталкиваюсь с той же проблемой, что и оригинальный постер, сейчас я попытаюсь увидеть, как на самом деле работают мои предложения.
Может быть, это может помочь вам. Не уверен, что это именно то, что вы ищете.
http://sturla.simnet.is/post/2008/09/22/Enable-proxy-in-IE.aspx