31

Sto lavorando con un proxy che richiede l'autenticazione, ad esempio, in un browser, se provo ad aprire una pagina, verrà richiesto immediatamente le credenziali. Ho fornito le stesse credenziali nel mio programma ma fallisce con l'errore HTTP 407.Autenticazione base proxy in C#: errore HTTP 407

Ecco il mio codice:

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; 

Ho provato ogni cosa possibile, ma sembrare come mi manca qualcosa. È qualcosa del genere, devo fare due richieste? Innanzitutto senza le credenziali e una volta che ho ricevuto una risposta dal server sulla necessità di credenziali, effettua la stessa richiesta con le credenziali?

+0

Quale schema di autenticazione richiede il server proxy? Di base? NTLM? –

+0

di base, è per questo che ho usato Basic nella cache dei cred ... – rplusg

risposta

17

qui è il modo corretto di usare delega con 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; 

Grazie a tutti per l'aiuto ... :)

+7

Questo è corretto solo se vuoi forzare il tuo utente a scoprire il loro indirizzo e numero di porta del server proxy e digitare il loro nome utente e password nella tua applicazione, e la tua applicazione per memorizzarlo da qualche parte (sia in chiaro o utilizzando la crittografia necessariamente reversibile) - quasi ideale - controlla la mia risposta per un metodo più pulito che probabilmente funzionerà nella maggior parte degli scenari. – tomfanning

+1

Memorizzare l'indirizzo proxy e le credenziali nella tua app non è una buona idea - entrambe le altre due risposte sono migliori di questa –

+0

Sono d'accordo, questa non è la risposta corretta. –

69

Questo metodo può evitare la necessità di codificare o configurare credenziali proxy , che può essere desiderabile

Inserire questo nel file di configurazione dell'applicazione - probabilmente app.config. Visual Studio lo rinominerà in yourappname.exe.config su build e finirà accanto al tuo eseguibile. Se non si dispone di un file di configurazione dell'applicazione, aggiungerne uno utilizzando Aggiungi nuovo elemento in Visual Studio.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.net> 
    <defaultProxy useDefaultCredentials="true" /> 
    </system.net> 
</configuration> 
+0

Funziona, ma ho dovuto fornire l'URL del proxy. – Vanuan

+0

Questo ha funzionato perfettamente per me. Grazie mille! – MrBubbles

+0

Ya questo è il modo migliore. in quanto non è necessario aggiungere le credenziali nel codice. +1 ..funziona perfettamente – csharpcoder

18

mi è stato sempre una situazione molto simile dove il HttpWebRequest non stava raccogliendo i dati corretti del proxy per impostazione predefinita e l'impostazione delle useDefaultCredentials non ha funzionato neanche. Forzare le impostazioni nel codice tuttavia ha funzionato a meraviglia:

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

e perché questa utilizza le credenziali di default non dovrebbe chiedere all'utente per i loro dettagli.

+0

Questo ha funzionato nella mia applicazione console ma non supporta HTTPS nella mia applicazione .NET. La soluzione di tomfanning funziona. Grazie! – Smeiff

2

Questo problema mi dava fastidio per anni, l'unica soluzione per me era chiedere al nostro team di reti di fare eccezioni sul nostro firewall in modo che alcune richieste di URL non necessitassero di essere autenticate sul proxy che non è l'ideale.

Recentemente ho aggiornato il progetto di .NET 4 da 3.5 e il codice appena iniziato a lavorare utilizzando le credenziali predefinite per il proxy, non hardcoding delle credenziali ecc

request.Proxy.Credentials = CredentialCache.DefaultCredentials; 
-1

provare questo

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