【问题标题】:Proxy Basic Authentication in C#: HTTP 407 errorC# 中的代理基本身份验证:HTTP 407 错误
【发布时间】:2012-03-07 14:16:17
【问题描述】:

我正在使用需要身份验证的代理,即在浏览器中,如果我尝试打开一个页面,它会立即要求提供凭据。我在我的程序中提供了相同的凭据,但它失败并出现 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;

我已经尝试了所有可能的事情,但似乎我错过了一些东西。 是不是像,我必须提出两个请求?首先没有凭据,一旦我从服务器收到关于需要凭据的回复,是否使用凭据发出相同的请求?

【问题讨论】:

  • 您的代理服务器需要什么身份验证方案?基本的? NTLM?
  • basic,这就是为什么我在 creds 缓存中使用 Basic...

标签: c# proxy httpwebrequest basic-authentication http-status-code-407


【解决方案1】:

这种方法可以避免硬编码或配置代理凭据的需要,这可能是可取的。

把它放在你的应用程序配置文件中 - 可能是 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 .. 无缝运行
  • @tomfanning,我相信如果代理服务器凭据与用户的默认凭据不同,此解决方案将不起作用。例如,如果代理服务器只允许特定帐户,并且每个帐户都有自己的密码。在这种情况下,使用默认凭据将不起作用。
  • 5 年后...是的,当然,如果默认凭据(即您的 Windows 帐户)不是您的代理所需的凭据,则此解决方案将不起作用。
【解决方案2】:

我遇到了一个非常相似的情况,默认情况下 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;
}

并且由于这使用默认凭据,因此不应询问用户的详细信息。

【讨论】:

  • 这在我的控制台应用程序中有效,但是它在我的 .NET 应用程序中不支持 HTTPS。 tomfanning 的解决方案确实有效。谢谢!
【解决方案3】:

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

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;

感谢大家的帮助... :)

【讨论】:

  • 只有当你想强制你的用户发现他们的代理服务器地址和端口号,并在你的应用程序中输入他们的用户名和密码,并且你的应用程序将它存储在某个地方(或者在清除或使用必然可逆的加密)-几乎不理想-检查我的答案以寻找可能在大多数情况下都可以使用的更清洁的方法。
  • 在您的应用中存储代理地址和凭据不是一个好主意 - 其他两个答案中的任何一个都比这更好
【解决方案4】:

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

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

request.Proxy.Credentials = CredentialCache.DefaultCredentials;

【讨论】:

    【解决方案5】:

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

    最终我的解决方案是使用名为“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;
    }
    

    这会从“凭据管理器”中获取凭据 - 可以通过 Windows 找到 - 单击开始,然后搜索“凭据管理器”。浏览器提示时手动输入的代理凭据将位于 Windows 凭据部分。

    【讨论】:

      【解决方案6】:

      你可以这样使用,它有效!

              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("...");
      

      【讨论】:

        【解决方案7】:

        试试这个

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

        【讨论】:

          猜你喜欢
          • 2021-10-10
          • 2016-04-24
          • 2010-11-15
          • 1970-01-01
          • 2012-07-30
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 2012-11-22
          相关资源
          最近更新 更多