2009-07-29 6 views
12

Sto cercando di capire come gestire in modo efficace gli errori di autenticazione proxy (codice di protezione HTTP 407) quando si utilizza la classe System.Net.WebClient.Errore System.Net.WebClient vs. proxy 407

Nel campo, vediamo molti utenti che ricevono un'autenticazione proxy 407 WebException, ma non sono sicuro di quale sia una buona strategia predefinita. In .Net 2.0/3.5, le impostazioni di autenticazione proxy dovrebbero essere ereditate da le impostazioni di sistema di Internet Explorer. Firefox, Opera e Chrome utilizzano queste stesse impostazioni .

Ecco il codice di base che stiamo usando:

using System.Net; 

string url = "http://www.mysite.com"; 
WebClient webClient = new WebClient(); 
byte[] data = webClient.DownloadFile(url); 

Quando questo codice viene a mancare, apriamo il browser dell'utente e li trasmetteremo un aiuto pagina. Dai nostri registri web, sappiamo che questi clienti possono connettersi con successo nei loro browser . Forse stanno inserendo manualmente il loro nome utente proxy e la password prima di arrivare alla nostra pagina di aiuto? Non lo sappiamo

Sembra che potremmo utilizzare WebClient.UseDefaultCredentials, ma questo sembra ridondante se WebClient utilizza comunque le impostazioni di sistema.

Qualsiasi aiuto è apprezzato.

risposta

11

Internet Explorer non memorizza nella cache/riutilizza le credenziali di autenticazione proxy se l'autenticazione proxy utilizza BASIC o DIGEST. Per Negotiate/NTLM, verranno fornite le credenziali predefinite.

Quindi, anche se .NET eredita dalle impostazioni di IE, non si otterrà alcun supporto "gratuito" per l'autenticazione proxy per Basic/Digest a meno che non si stia eseguendo in IE; dovrai richiedere all'utente o fornire una schermata di configurazione.

Fiddler (www.fiddler2.com) ha l'opzione "Richiedi autenticazione proxy" nel menu Regole che è possibile utilizzare per simulare questo scenario per il test.

+2

Grazie Eric. Il violinista funziona bene. Per chiarire, per Negoziare/NTML, le credenziali predefinite verranno fornite da WebClient indipendentemente dal fatto che imposti UseDefaultCredentials = true? In altre parole, c'è un valore nella gestione di WebException 407 e riprovare con UseDefaultCredentials = true? Perché non impostare sempre UseDefaultCredentials = true? Rischio per la sicurezza? Opinion Disclaimer: WinInet sembrava gestire questo molto meglio. Dato che tutti nell'universo vogliono attraversare i proxy, perché non farlo automaticamente o attivare un evento e fornire un'interfaccia utente standard per l'inserimento/salvataggio delle credenziali? – Daniel

+0

Ho sperimentato di più con Fiddler. Ho pensato che sarebbe stato semplice fornire il nome utente e la password ("1", "1") come sotto, ma non funziona. string url = "http://www.java.com/"; webClient = new WebClient(); CredentialCache cache = new CredentialCache(); cache.Add (nuovo Uri (url), "Base", nuovo NetworkCredential ("1", "1")); webClient.Proxy.Credentials = credentialCache; webClient.Credentials = credentialCache; string contents = webClient.DownloadString (url); – Daniel

+1

Ha funzionato. Per qualche motivo, CredentialCache non ha funzionato. Ho dovuto passare un NetworkCredential a webClient.Proxy.Credentials. – Daniel

6

Abbiamo risolto il problema aggiungendo una finestra di configurazione che consente all'utente di scegliere "usa proxy". Se questa impostazione è stata eseguita, usiamo questi parametri (indirizzo, credenziali ...). In caso contrario, supponiamo che una connessione possa essere effettuata senza alcuna interazione manuale. Nel caso di un errore che facciamo: a) riprovare utilizzando le credenziali di default b) popup un'informazione che un ambiente in config potrebbe aiutare ...

Se l'autenticazione proxy viene effettuata tramite "credenziali predefinite".. (Utente Windows) IE reagisce anche a un errore di autenticazione e invia le credenziali di default in questo caso. Se questo non funziona apre una finestra di dialogo delle credenziali. Non sono sicuro che tutti i browser lo gestiscano in questo modo, ma puoi semplicemente provare usando il violinista, così puoi vedere cosa sta succedendo.

+0

grazie per il flusso di lavoro dettagliato. –

6

So che questo è un vecchio post ma ho avuto un problema simile nel tentativo di scaricare un file XML utilizzando WebClient in un'attività di script SSIS 2008R2 (SQL Server Integration Services) (codice VB.NET) tramite un server proxy a un remoto sito protetto tramite SSL che richiedeva anche l'autenticazione.

Ci è voluto un po 'per trovare una soluzione e questo post ha aiutato sul lato proxy. Di seguito è riportato il codice dello script che ha funzionato per me. Potrebbe essere utile per qualcuno alla ricerca di simili.

Dim objWebClient As WebClient = New WebClient() 
    Dim objCache As New CredentialCache() 

    'https://www.company.net/xxxx/resources/flt 
    Dim strDownloadURL As String = Dts.Variables("FileURL").Value.ToString 

    '[email protected] 
    Dim strLogin As String = Dts.Variables("FileLogin").Value.ToString 

    'sitepassword 
    Dim strPass As String = Dts.Variables("FilePass").Value.ToString 

    'itwsproxy.mycompany.com 
    Dim strProxyURL As String = Dts.Variables("WebProxyURL").Value.ToString 

    '8080 
    Dim intProxyPort As Integer = Dts.Variables("WebProxyPort").Value 

    'Set Proxy & Credentials as a Network Domain User acc to get through the Proxy 
    Dim wp As WebProxy = New WebProxy(strProxyURL, intProxyPort) 
    wp.Credentials = New NetworkCredential("userlogin", "password", "domain") 
    objWebClient.Proxy = wp 

    'Set the Credentials for the Remote Server not the Network Proxy 
    objCache.Add(New Uri(strDownloadURL), "Basic", New NetworkCredential(strLogin, strPass)) 
    objWebClient.Credentials = objCache 

    'Download file, use Flat File Connectionstring to save the file 
    objWebClient.DownloadFile(strDownloadURL, Dts.Connections("XMLFile").ConnectionString)