Обычная проверка подлинности прокси в C#: ошибка HTTP 407
Я работаю с прокси, который требует аутентификации, т. Е. В браузере, если я пытаюсь открыть страницу, он сразу же запрашивает учетные данные. Я предоставил те же учетные данные в моей программе, но это не удается с ошибкой 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;
Я перепробовал все возможные вещи, но мне кажется, что я что-то упустил. Это что-то вроде, я должен сделать два запроса? Сначала без учетных данных, и как только я получу ответ от сервера о необходимости в учетных данных, сделайте тот же запрос с учетными данными?
7 ответов
Вот правильный способ использования прокси вместе с кредитами.
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;
Спасибо всем за помощь...:)
Этот метод может избежать необходимости жесткого кода или настройки учетных данных прокси, что может быть желательно.
Поместите это в файл конфигурации вашего приложения - вероятно, 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>
У меня была очень похожая ситуация, когда 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;
}
и поскольку он использует учетные данные по умолчанию, он не должен запрашивать у пользователя их данные.
Эта проблема беспокоила меня в течение многих лет. Единственный обходной путь для меня заключался в том, чтобы попросить нашу сетевую команду сделать исключения для нашего брандмауэра, чтобы не требовалось проходить проверку подлинности определенных URL-запросов на прокси-сервере, что не является идеальным.
Недавно я обновил проект до версии.NET 4 с версии 3.5, и код только начал работать с использованием учетных данных по умолчанию для прокси, без жесткого кодирования учетных данных и т. Д.
request.Proxy.Credentials = CredentialCache.DefaultCredentials;
У меня была аналогичная проблема из-за защищенного паролем прокси-сервера, и я не смог найти много информации - надеюсь, это кому-то поможет. Я хотел получить учетные данные, используемые браузером клиента. Однако CredentialCache.DefaultCredentials и DefaultNetworkCredentials не работают, когда прокси-сервер имеет собственное имя пользователя и пароль, хотя я ввел эти данные, чтобы гарантировать, что Internet Explorer и Edge имеют доступ.
В конце концов, решение для меня состояло в том, чтобы использовать пакет nuget под названием «CredentialManagement.Standard» и следующий код:
using WebClient webClient = new WebClient();
var request = WebRequest.Create("http://google.co.uk");
var proxy = request.Proxy.GetProxy(new Uri("http://google.co.uk"));
var cmgr = new CredentialManagement.Credential() { Target = proxy.Host };
if (cmgr.Load())
{
var credentials = new NetworkCredential(cmgr.Username, cmgr.Password);
webClient.Proxy.Credentials = credentials;
webClient.Credentials = credentials;
}
Это захватывает учетные данные из «Диспетчера учетных данных», который можно найти через Windows — нажмите «Пуск», затем выполните поиск «Диспетчер учетных данных». Учетные данные для прокси-сервера, введенные вручную по запросу браузера, будут находиться в разделе «Учетные данные Windows».
Можно использовать вот так, работает!
WebProxy proxy = new WebProxy
{
Address = new Uri(""),
Credentials = new NetworkCredential("", "")
};
HttpClientHandler httpClientHandler = new HttpClientHandler
{
Proxy = proxy,
UseProxy = true
};
HttpClient client = new HttpClient(httpClientHandler);
HttpResponseMessage response = await client.PostAsync("...");
попробуй это
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);