Обычная проверка подлинности прокси в C #: ошибка HTTP 407 - PullRequest
40 голосов
/ 07 марта 2012

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

Вот мой код:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

IWebProxy proxy = WebRequest.GetSystemWebProxy();
CredentialCache cc = new CredentialCache();
NetworkCredential nc = new NetworkCredential();

nc.UserName = "userName";
nc.Password = "password";
nc.Domain = "mydomain";
cc.Add("http://20.154.23.100", 8888, "Basic", nc);
proxy.Credentials = cc;
//proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
request.Proxy = proxy;
request.Proxy.Credentials = cc;
request.Credentials = cc;
request.PreAuthenticate = true;

Я перепробовал все возможные вещи, но, похоже, что-то упустил.Это что-то вроде, я должен сделать два запроса?Сначала без учетных данных, и как только я получу ответ от сервера о необходимости учетных данных, сделать тот же запрос с учетными данными?

Ответы [ 5 ]

76 голосов
/ 03 августа 2012

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

Поместите это в файл конфигурации вашего приложения - возможно, app.config.Visual Studio переименует его в yourappname.exe.config при сборке и окажется рядом с вашим исполняемым файлом.Если у вас нет файла конфигурации приложения, просто добавьте его, используя команду «Добавить новый элемент» в Visual Studio.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <defaultProxy useDefaultCredentials="true" />
  </system.net>
</configuration>
23 голосов
/ 02 августа 2013

У меня была очень похожая ситуация, когда HttpWebRequest не собирал правильные данные прокси-сервера по умолчанию и установка UseDefaultCredentials также не работала. Однако принудительное выполнение настроек в коде сработало:

IWebProxy proxy = myWebRequest.Proxy;
if (proxy != null) {
    string proxyuri = proxy.GetProxy(myWebRequest.RequestUri).ToString();
    myWebRequest.UseDefaultCredentials = true;
    myWebRequest.Proxy = new WebProxy(proxyuri, false);
    myWebRequest.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
}

и поскольку он использует учетные данные по умолчанию, он не должен запрашивать у пользователя их данные.

17 голосов
/ 07 марта 2012

вот правильный способ использования прокси вместе с кредитами.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

IWebProxy proxy = request.Proxy;                    
if (proxy != null)
{
    Console.WriteLine("Proxy: {0}", proxy.GetProxy(request.RequestUri));
}
else
{
    Console.WriteLine("Proxy is null; no proxy will be used");
}

WebProxy myProxy = new WebProxy();
Uri newUri = new Uri("http://20.154.23.100:8888");
// Associate the newUri object to 'myProxy' object so that new myProxy settings can be set.
myProxy.Address = newUri;
// Create a NetworkCredential object and associate it with the 
// Proxy property of request object.
myProxy.Credentials = new NetworkCredential("userName", "password");
request.Proxy = myProxy;

Спасибо всем за помощь ...:)

3 голосов
/ 21 мая 2015

Эта проблема беспокоила меня в течение многих лет. Единственный обходной путь для меня - попросить нашу сетевую команду сделать исключения для нашего брандмауэра, чтобы не требовалось проходить проверку подлинности определенных URL-адресов на прокси-сервере, что не идеально.

Недавно я обновил проект до .NET 4 с версии 3.5, и код только начал работать с использованием учетных данных по умолчанию для прокси, без жесткого кодирования учетных данных и т. Д.

request.Proxy.Credentials = CredentialCache.DefaultCredentials;
0 голосов
/ 05 ноября 2015

попробуйте это

        var YourURL = "http://yourUrl/";

         HttpClientHandler handler = new HttpClientHandler() 
         { 
             Proxy = new WebProxy("http://127.0.0.1:8888"), 
             UseProxy = true, 
         }; 

         Console.WriteLine(YourURL); 

         HttpClient client = new HttpClient(handler); 
...