C#中的代理基本身份验证:HTTP 407错误

时间:2012-03-07 14:16:17

标签: c# proxy httpwebrequest basic-authentication http-status-code-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 个答案:

答案 0 :(得分:75)

此方法可能无需硬编码或配置代理凭据,这可能是理想的。

将它放在您的应用程序配置文件中 - 可能是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>

答案 1 :(得分:23)

我遇到了一个非常类似的情况,即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;
}

因为它使用默认凭据,所以不应该询问用户的详细信息。

答案 2 :(得分:17)

这是使用代理和信用的正确方法..

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 :(得分:3)

这个问题困扰了我多年,对我来说唯一的解决方法就是要求我们的网络团队在我们的防火墙上设置例外,以便某些URL请求不需要在代理上进行身份验证,这是不理想的。

最近我将项目从3.5升级到.NET 4,代码刚刚开始使用代理的默认凭据,没有凭证的硬编码等。

request.Proxy.Credentials = CredentialCache.DefaultCredentials;

答案 4 :(得分:0)

您可以像这样使用,它有效!

target_link_directories

答案 5 :(得分:0)

由于受密码保护的代理服务器,我遇到了类似的问题,并且找不到太多的信息方式-希望这对某人有帮助。我想获取客户浏览器使用的凭据。但是,即使我输入了这些详细信息以确保Internet Explorer和Edge可以访问,但是当代理具有自己的用户名和密码时,CredentialCache.DefaultCredentials和DefaultNetworkCredentials也不起作用。

最后,对我来说,解决方案是使用一个名为“ CredentialManagement.Standard”的nuget程序包和以下代码:

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;
}

这将从“ Credentials Manager”(可通过​​Windows找到)中获取凭据,单击“开始”,然后搜索“ Credentials Manager”。在浏览器提示时手动输入的代理凭据将在“ Windows凭据”部分中。

答案 6 :(得分:-1)

  

试试这个

        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);