31

我与需要身份验证的代理,即工作,在浏览器中,如果我尝试打开一个网页就会立即要求提供信用凭证。我在我的程序中提供了相同的凭据,但因HTTP 407错误而失败。代理基本身份验证在C#中: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; 

我曾尝试一切可能的事情,但看起来像我失去了一些东西。 这是类似的东西,我不得不提出两个要求?首先输出凭证,一旦我从服务器收到有关凭据需求的回复,请使用凭据进行相同的请求?

+0

没有代理服务器需要什么样的认证方式?基本? NTLM? – 2012-03-07 14:18:33

+0

基本的,这就是为什么我在creds高速缓存使用的基本... – rplusg 2012-03-07 14:19:46

回答

17

这里是使用与creds一起代理的正确方式..

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; 

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

+7

如果要强制用户发现他们的代理服务器地址和端口号,并输入自己的用户名和密码到应用程序中这是唯一正确的,和你的应用程序将其存储在某个地方(无论是清晰的还是使用必然可逆的加密) - 难以理想 - 请检查我的答案,找出一种更清晰的方法,这种方法可能适用于大多数情况。 – tomfanning 2012-08-22 16:06:46

+1

在您的应用中存储代理地址和凭据不是一个好主意 - 其他两个答案中的任何一个都比这个更好 – 2014-12-02 01:38:28

+0

我同意,这不是正确的答案。 – 2017-07-18 13:41:34

69

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

把这个在您的应用程序配置文件 - 可能的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> 
+0

这有效,但我不得不提供代理网址。 – Vanuan 2012-08-23 08:52:26

+0

这对我来说非常合适。万分感谢! – MrBubbles 2015-06-11 16:10:55

+0

雅这是更好的方法。因为您不需要在代码中添加凭据。 +1 ..无缝工作 – csharpcoder 2015-08-04 12:41:52

18

我得到其中的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; 
} 

因为这使用默认凭据,它不应该询问用户的细节。

+0

这工作在我的控制台应用程序,但它不支持我的.NET应用程序中的HTTPS。 tomfanning的解决方案确实有效。谢谢! – Smeiff 2014-10-03 14:27:20

2

这个问题一直缠着我多年对我来说,唯一的解决方法就是要求我们的网络团队,使我们的防火墙例外,因此某些URL请求,没必要在这是不理想的代理进行身份验证。

近日笔者从3.5升级项目.NET 4和代码刚开始使用默认凭据代理工作,没有凭据等

request.Proxy.Credentials = CredentialCache.DefaultCredentials; 
-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); 
相关问题