Подтвердить что ты не робот

Ошибка System.Net.WebClient против прокси-аутентификации 407

Я пытаюсь выяснить, как правильно обрабатывать ошибки проверки подлинности прокси (HTTP 407) при использовании класса System.Net.WebClient.

В поле мы видим, что многие пользователи получают 407 прокси-аутентификацию WebException, но я не уверен, какая хорошая стратегия по умолчанию. В .Net 2.0/3.5, параметры аутентификации прокси-сервера должны быть унаследованы от системных настроек Internet Explorer. Firefox, Opera и Chrome используют эти те же настройки.

Вот базовый код, который мы используем:

using System.Net;

string url = "http://www.mysite.com";
WebClient webClient = new WebClient();
byte[] data = webClient.DownloadFile(url);

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

Кажется, что мы могли бы использовать WebClient.UseDefaultCredentials, но это кажется излишним, если WebClient все равно использует системные настройки.

Любая помощь приветствуется.

4b9b3361

Ответ 1

Internet Explorer не настойчиво кэширует/повторно использует учетные данные для проверки подлинности прокси-сервера, если proxy auth использует BASIC или DIGEST. Для Negotiate/NTLM будут предоставлены учетные данные по умолчанию.

Следовательно, даже несмотря на то, что .NET наследует настройки IE, вы не получите никакой "бесплатной" поддержки для проверки подлинности прокси для Basic/Digest, если только вы не работаете в IE; вам необходимо запросить пользователя или предоставить экран конфигурации.

Fiddler (www.fiddler2.com) имеет опцию "Запрос прокси-аутентификации" в меню "Правила", которую вы можете использовать для имитации этого сценария для тестирования.

Ответ 2

Мы решили эту проблему, добавив диалог конфигурации, в котором пользователь может выбрать "использовать прокси". Если этот параметр выполняется, мы используем этот параметр (адрес, учетные данные...). Если нет - мы предполагаем, что соединение может быть выполнено без какого-либо ручного взаимодействия. В случае ошибки мы делаем: a.) повторите попытку, используя учетные данные по умолчанию b.) всплывает информация, которую может помочь настройка в config...

Если прокси-аутентификация выполняется через "учетные данные по умолчанию" (пользователь Windows), IE также реагирует на ошибку auth и отправляет учетные данные по умолчанию в этом случае. Если это не работает, открывается диалоговое окно учетных данных. Я не уверен, что все браузеры обрабатывают это так, но вы можете просто попробовать попробовать скрипач, чтобы вы могли видеть, что происходит.

Ответ 3

Я знаю, что это старый пост, но у меня была аналогичная проблема с загрузкой XML файла с использованием WebClient в задаче SSIS 2008R2 (службы SQL Server) script (код VB.NET) через прокси-сервер удаленный сайт, защищенный с помощью SSL, также требующий аутентификации.

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

    Dim objWebClient As WebClient = New WebClient()
    Dim objCache As New CredentialCache()

    'https://www.company.net/xxxx/resources/flt
    Dim strDownloadURL As String = Dts.Variables("FileURL").Value.ToString

    '[email protected]
    Dim strLogin As String = Dts.Variables("FileLogin").Value.ToString

    'sitepassword
    Dim strPass As String = Dts.Variables("FilePass").Value.ToString

    'itwsproxy.mycompany.com
    Dim strProxyURL As String = Dts.Variables("WebProxyURL").Value.ToString

    '8080
    Dim intProxyPort As Integer = Dts.Variables("WebProxyPort").Value

    'Set Proxy & Credentials as a Network Domain User acc to get through the Proxy
    Dim wp As WebProxy = New WebProxy(strProxyURL, intProxyPort)
    wp.Credentials = New NetworkCredential("userlogin", "password", "domain")
    objWebClient.Proxy = wp

    'Set the Credentials for the Remote Server not the Network Proxy
    objCache.Add(New Uri(strDownloadURL), "Basic", New NetworkCredential(strLogin, strPass))
    objWebClient.Credentials = objCache

    'Download file, use Flat File Connectionstring to save the file
    objWebClient.DownloadFile(strDownloadURL, Dts.Connections("XMLFile").ConnectionString)