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

rpl*_*usg 40 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;
Run Code Online (Sandbox Code Playgroud)

我尝试了所有可能的事情,但似乎我错过了一些东西.是这样的,我必须提出两个要求吗?首先没有凭据,一旦我从服务器收到有关凭据需求的回复,请使用凭据进行相同的请求?

tom*_*ing 77

该方法可以避免硬编码或配置代理凭证的需要,这可能是期望的.

把它放在你的应用程序配置文件中 - 可能是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>
Run Code Online (Sandbox Code Playgroud)

  • 5年......是的,当然,如果默认凭据(即您的Windows帐户)不是代理所需的凭据,则此解决方案将无效. (9认同)
  • @tomfanning,如果代理服务器凭据与用户的默认凭据不同,我相信此解决方案将不起作用。例如,如果代理服务器只允许特定帐户,并且每个帐户都有自己的密码。在这种情况下,使用默认凭据将不起作用。 (2认同)

Car*_*ger 24

我得到了一个非常类似的情况,默认情况下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;
}
Run Code Online (Sandbox Code Playgroud)

并且因为它使用默认凭据,所以不应该询问用户他们的详细信息.


rpl*_*usg 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;
Run Code Online (Sandbox Code Playgroud)

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

  • 只有当您要强制用户发现其代理服务器地址和端口号,并在应用程序中键入其用户名和密码,以及将应用程序存储在某个位置(以明文或使用必要的可逆加密)时,这才是正确的.几乎不理想 - 检查我的答案,找到一种可能适用于大多数场景的更干净的方法. (8认同)
  • 在您的应用程序中存储代理地址和凭据不是一个好主意 - 其他两个答案中的任何一个都比这更好 (2认同)