2009-06-23 14 views
12

Estoy tratando de usar System.Net.WebClient en una aplicación WinForms para cargar un archivo en un servidor IIS6 que tiene Autenticación de Windows como es el único método de 'Autenticación'.System.Net.WebClient no funciona con la Autenticación de Windows

WebClient myWebClient = new WebClient(); 
myWebClient.Credentials = new System.Net.NetworkCredential(@"boxname\peter", "mypassword"); 
byte[] responseArray = myWebClient.UploadFile("http://localhost/upload.aspx", fileName); 

me sale un 'El servidor remoto devolvió un error: (401) no autorizada', en realidad se trata de un 401,2

Tanto el cliente como IIS están en la misma máquina Dev Windows Server 2003.

Cuando intento abrir la página en Firefox e ingreso las mismas credenciales correctas que en el código, aparece la página. Sin embargo, cuando uso IE8, obtengo el mismo error 401.2.

Probé Chrome y Opera y ambos funcionan.

He habilitado 'Habilitar autenticación de Windows integrada' en las opciones de IE Internet.

La seguridad del registro de eventos tiene una Auditoría de errores:

Logon Failure: 
    Reason:  An error occurred during logon 
    User Name: peter 
    Domain:  boxname 
    Logon Type: 3 
    Logon Process: ÈùÄ 
    Authentication Package: NTLM 
    Workstation Name: boxname 
    Status code: 0xC000006D 
    Substatus code: 0x0 
    Caller User Name: - 
    Caller Domain: - 
    Caller Logon ID: - 
    Caller Process ID: - 
    Transited Services: - 
    Source Network Address: 127.0.0.1 
    Source Port: 1476 

que utiliza el monitor de procesos y Fiddler para investigar, pero en vano.

¿Por qué funciona esto para navegadores de terceros pero no con IE o System.Net.WebClient?

+0

Después de cambiar el método de autenticación única en IIS de Windows integrada a Basic funciona, pero eso no resuelve mi problema porque no puedo cambiar dicha configuración en el servidor de producción. –

+0

Utilicé la herramienta de diagnóstico de autenticación y control de acceso de IIS 'para supervisar el proceso y comparé el registro de Firefox con el de IE. Se ve bien hasta que la prueba/respuesta NTLM falla, pero tampoco me da ninguna pista de por qué lo hace. –

+0

Hice algunas pruebas más: El Servidor 2003 descrito anteriormente es en realidad una VM en Virtual PC, cuando uso IE desde el equipo host puedo autenticar, pero no usando IE en el invitado. Sin embargo, el IE del huésped funciona cuando se utiliza la dirección IP del sitio en lugar del nombre de host configurado a través del archivo hosts. ¡Algo roto aquí! Me alegro de que no esté en un servidor de producción. –

Respuesta

18

He visto un problema similar, donde la seguridad integrada/NTLM solo funcionará si está accediendo al host por nombre de máquina o localhost. De hecho, es una función de documento [pobremente] en Windows que está diseñada para proteger contra los "ataques de reflexión".

Básicamente, debe crear una clave de registro en la máquina que está tratando de acceder al servidor, y poner en la lista blanca el dominio que está tratando de alcanzar. Cada nombre de host/FQDN debe estar en su propia línea; no hay comodines y el nombre debe coincidir exactamente. Del artículo KB:

  • Haga clic en Inicio, haga clic en Ejecutar, escriba regedit y luego haga clic en Aceptar.
  • En Editor del Registro, busque y haga clic en la siguiente clave del registro: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ MSV1_0
  • Haga clic MSV1_0, seleccione nuevo y, a continuación, haga clic en cadena múltiple Valor.
  • Tipo BackConnectionHostNames, y presiona ENTRAR.
  • Haga clic con el botón secundario en BackConnectionHostNames y luego haga clic en Modificar.
  • En el cuadro Información del valor, escriba el nombre de host o los nombres de host para los sitios que están en la computadora local y luego haga clic en Aceptar.
  • Salga del Editor del registro y luego reinicie la computadora.

http://support.microsoft.com/kb/956158/en-us

+3

+10 Si pudiera votar esto 10 veces, lo haría. Terminé mis 3 días de rascarse la cabeza y buscar en Google. – DancesWithBamboo

+0

+20 Me gustaría votar esto 20 veces si pudiera. –

4

¿Has probado ...

new NetworkCredential("peter", "password", "boxname"); 

También puede intentar ...

var credCache = new CredentialCache(); 
credCache.Add(new Uri ("http://localhost/upload.aspx"), 
       "Negotiate", 
       new NetworkCredential("peter", "password", "boxname")); 
wc.Credentials = credCache; 

Además, según this Puede ser que IIS está configurado de forma incorrecta. Intente reemplazar "Negociar" por "Básico" en el punto anterior y verificar su configuración de IIS para el sitio web. También hay un montón de causas posibles here.

+0

Acabo de probarlo, misma respuesta 401.2 y 'Failure Audit' –

+0

También probé la versión 'Negociar', el mismo resultado. Lo que me amortigua es que tampoco funciona en IE. –

0

Sin conocer su implementación de IIS, y suponiendo que tiene las reglas de autorización correctas para la carga establecida en IIS (por ejemplo, la derecha permite * ACL en los directorios correctos a los que intenta cargar contenido, etc.), lo primero que haría try es establecer UseDefaultCredentials en true en lugar de establecer explícitamente Credential. (¿Tal vez crees que estás accediendo al servidor con las credenciales que estás configurando pero ese no es el caso? Eso sería posible si esto funciona.)

Este es un escenario muy común, por lo que me centraría en las reglas de autorización de IIS para el directorio en el que intenta cargar el archivo, las ACL reales en ese directorio. Por ej. ¿su sitio se está haciendo pasar por otro o no? si es así, debe tener ACL reales en ese directorio; de lo contrario, se ejecutará el conjunto de aplicaciones de la cuenta.

+0

No creo que sea un problema de ACL porque no llega tan lejos, Process Monitor no muestra ninguna actividad en el directorio de destino. –

+0

Acabo de probarlo con UseDefaultCredentials, también falló. Necesito que funcione con las credenciales no predeterminadas porque los usuarios de Windows son diferentes en las máquinas cliente y servidor en producción. –

1

Intenta entrar en las opciones de IE y agrega explícitamente el sitio a la Zona de Intranet. Luego vuelve a ejecutar el programa. Tampoco debería ejecutar el programa desde un inicio de sesión de administrador. Esto puede desencadenar el Enhanced Security Configuration for Internet Explorer.

Podría explicar por qué puede acceder al sitio con Firefox y Opera, pero no con IE o WebClient.

+0

Buenas ideas, las intenté pero aún no funciona. –

Cuestiones relacionadas