2009-07-29 34 views
12

Estoy tratando de averiguar cómo manejar de forma robusta los errores de autenticación proxy (HTTP 407 código de estado) cuando se utiliza la clase System.Net.WebClient.System.Net.WebClient Autenticación de proxy 407 error

En el campo, vemos muchos usuarios que reciben una autenticación de proxy 407 WebException, pero no estoy seguro de cuál es una buena estrategia predeterminada. En .Net 2.0/3.5, se supone que la configuración de autenticación del proxy debe heredarse de la configuración del sistema de Internet Explorer. Firefox, Opera y Chrome usan estos mismos ajustes.

Aquí está el código básico que estamos utilizando:

using System.Net; 

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

Cuando falla este código, abrimos el navegador del usuario y los envía a una página de ayuda . De nuestros registros web, sabemos que estos clientes pueden conectarse correctamente en sus navegadores. ¿Quizás estén ingresando manualmente su nombre de usuario proxy y contraseña antes de que lleguen a nuestra página de ayuda? No lo sabemos

Parece que podríamos usar WebClient.UseDefaultCredentials, pero este parece redundante si WebClient está utilizando la configuración del sistema de todos modos.

Cualquier ayuda es apreciada.

Respuesta

11

Internet Explorer no almacena/reutiliza de forma persistente las credenciales de autenticación de proxy si la autenticación proxy utiliza BASIC o DIGEST. Para Negotiate/NTLM, se proporcionarán las credenciales predeterminadas.

Por lo tanto, aunque .NET hereda de la configuración de IE, no obtendrá ningún soporte "gratuito" para la autenticación de proxy para Basic/Digest a menos que se ejecute en IE; Deberá avisar al usuario o proporcionar una pantalla de configuración.

Fiddler (www.fiddler2.com) tiene la opción "Solicitar autenticación de proxy" en el menú Reglas que puede utilizar para simular este escenario para la prueba.

+2

Gracias Eric. Fiddler funciona bien. Para aclarar, para Negotiate/NTML, las credenciales predeterminadas serán proporcionadas por WebClient independientemente de si configuro UseDefaultCredentials = true? En otras palabras, ¿hay algún valor en el manejo de 407 WebException y reintentar con UseDefaultCredentials = true? ¿Por qué no solo siempre configura UseDefaultCredentials = true? ¿Riesgo de seguridad? Exención de responsabilidad: WinInet parecía manejar esto mucho mejor. Dado que todos en el universo quieren atravesar los proxies, ¿por qué no hacer esto automáticamente o iniciar un evento y proporcionar una interfaz de usuario estándar para ingresar/guardar credenciales? – Daniel

+0

Experimenté más con Fiddler. Pensé que sería fácil simplemente proporcionar el nombre de usuario y la contraseña ("1", "1") como a continuación, pero no funciona. string url = "http://www.java.com/"; webClient = new WebClient(); CredentialCache cache = new CredentialCache(); caché.Add (nuevo Uri (url), "Básico", nuevo NetworkCredential ("1", "1")); webClient.Proxy.Credentials = credentialCache; webClient.Credentials = credentialCache; string contents = webClient.DownloadString (url); – Daniel

+1

Lo tengo trabajando. Por algún motivo, CredentialCache no funcionó. Tuve que pasar un NetworkCredential a webClient.Proxy.Credentials. – Daniel

6

Resolvimos ese problema agregando un diálogo de configuración que permite al usuario elegir "usar proxy". Si se realiza esta configuración, usamos estos parámetros (dirección, credenciales ...). En caso negativo, suponemos que se puede establecer una conexión sin interacción manual. En el caso de un error que hacemos: a) tratar de nuevo utilizando las credenciales predeterminadas b) popup de una información que en un entorno de configuración podría ayudar ...

Si la autenticación de proxy se realiza a través de "credenciales por defecto".. (Usuario de Windows) IE también reacciona a un error de autenticación y envía credenciales predeterminadas en este caso. Si esto no funciona, abre un diálogo de credenciales. No estoy seguro si todos los navegadores manejan esto de esa manera, pero simplemente puede intentarlo usando el violín, para que pueda ver lo que está pasando.

+0

gracias por el flujo de trabajo detallado. –

6

Sé que esta es una publicación anterior pero tuve un problema similar tratando de descargar un archivo XML usando WebClient en una tarea de script SSIS 2008R2 (SQL Server Integration Services) (código VB.NET) a través de un servidor proxy a un control remoto sitio asegurado a través de SSL que también requiere autenticación.

Tomó un tiempo encontrar una solución y esta publicación ayudó en el lado del proxy. A continuación se muestra el código de secuencia de comandos que funcionó para mí. Puede ser útil para alguien que busca similares.

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) 
Cuestiones relacionadas