Pregunta

Estoy tratando de usar System.Net.WebClient en una aplicación WinForms para cargar un archivo en un servidor IIS6 que tiene la autenticación de Windows como solo el método de 'Autenticación'.

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

Recibo un mensaje "El servidor remoto devolvió un error: (401) No autorizado", en realidad es un 401.2

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

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

Intenté Chrome y Opera y ambos funcionan.

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

El registro de eventos de seguridad 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

Utilicé Process Monitor y Fiddler para investigar pero fue en vano.

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

¿Fue útil?

Solución

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 [mal] en Windows que está diseñada para proteger contra "ataques de reflexión".

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

  • Haga clic en Inicio, haga clic en Ejecutar, escriba regedit y luego haga clic en Aceptar.
  • En el Editor del registro, busque y haga clic en la siguiente clave del registro: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
  • Haga clic con el botón derecho en MSV1_0 , seleccione Nuevo y, a continuación, haga clic en Valor de cadenas múltiples.
  • Escriba BackConnectionHostNames y presione ENTRAR.
  • Haga clic con el botón derecho 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

Otros consejos

¿Has probado ...

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

También puedes probar ...

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 esto puede ser que IIS esté configurado incorrectamente. Intenta reemplazar " Negociar " con " Básico " en lo anterior y verificando su configuración IIS para el sitio web. También hay un montón de posibles causas aquí .

Intente acceder a las opciones de IE y agregue explícitamente el sitio a la Zona de Intranet. Luego vuelva a ejecutar el programa. Tampoco debe ejecutar el programa desde un inicio de sesión de administrador. Esto puede activar la Configuración de seguridad mejorada para Internet Explorer .

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

Sin conocer su implementación de IIS, y suponiendo que tiene las reglas de autorización correctas para la carga configuradas en IIS (por ejemplo, las ACL permitidas * correctas en los directorios correctos en los que está intentando cargar contenido, etc.), lo primero que intentaré es establecer UseDefaultCredentials en verdadero en lugar de establecer explícitamente Credential. (Tal vez piense que está accediendo al servidor con las Credenciales que está 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 está intentando cargar el archivo, las ACL reales en ese directorio. Por ej. ¿Está suplantando su sitio o no? si es así, debe tener ACL reales en ese directorio, de lo contrario, se ejecutará cualquier grupo de aplicaciones de cuenta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top