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); 
相關問題