Sé que hay miles de informes de personas que tienen problemas para lograr que la autenticación integrada de Windows funcione con IIS, pero todos parecen conducir a páginas web que no se aplican o soluciones que ya he probado. He implementado docenas de sitios como este antes, por lo que hay algo extraño que sucede con el servidor / configuración, o he estado mirando esto demasiado tiempo y no he visto lo obvio.
En pocas palabras, todo funciona perfectamente en mi máquina local, pero se desmorona en el servidor de producción, que, por lo que puedo decir, tiene exactamente la misma configuración .
En la máquina local:
- La máquina ejecuta Windows 7 Ultimate, Service Pack 1, IIS 7.5.
- El sitio ha sido probado con éxito, utilizando IIS y el servidor de desarrollo web VS.
- La configuración del sitio IIS tiene todos los métodos de autenticación deshabilitados, excepto la autenticación de Windows.
- La máquina local no está en ningún dominio.
- Los proveedores configurados son Negotiate y NTLM (no Negotiate: Kerberos).
- La protección extendida está desactivada.
- Todos los navegadores probados (IE, Firefox, Chrome) muestran el mensaje de desafío y me permiten iniciar sesión en el dominio localhost con mi cuenta de Windows (local).
- Todos los navegadores probados también funcionan con una dirección IP local opaca, por lo que a los navegadores no les importa si el sitio parece "local" o "remoto".
- He agregado una línea de visualización a la página web que muestra el usuario que ha iniciado sesión actualmente y muestra exactamente lo que esperaría (con el usuario local con el que he iniciado sesión).
En la máquina remota:
- El servidor ejecuta Windows Server 2008 R2, IIS 7.5.
- La carga de la página web produce un error inmediato 401.2: no está autorizado para ver esta página debido a encabezados de autenticación no válidos. No aparece ningún mensaje de desafío.
- La configuración del sitio IIS tiene todos los métodos de autenticación deshabilitados, excepto la autenticación de Windows.
- La máquina remota no está en ningún dominio.
- Los proveedores configurados son Negotiate y NTLM (no Negotiate: Kerberos).
- La protección extendida está desactivada.
- En la máquina remota (sesión de escritorio remoto), aparece el mismo error en Internet Explorer independientemente de si el dominio es localhost o la dirección IP externa.
- Si intento ver el sitio web remoto desde mi máquina local , el error sigue siendo 401, pero un 401. ligeramente diferente. Sin subcódigo, con el texto: Acceso denegado debido a credenciales no válidas.
- La autenticación de Windows función función de IIS está instalado.
- El WindowsAuthentication módulo se añadió (a nivel de servidor).
- El mismo error exacto ocurre si apago la autenticación de Windows y habilito la autenticación básica.
- El sitio se carga si apago la autenticación de Windows y habilito Anónimo (obviamente).
- Ya he seguido todos los pasos de solución de problemas en el soporte de Microsoft: Solución de errores de HTTP 401 en IIS
- Ya probé la solución que se muestra en otra página de soporte de Microsoft (supuestamente para forzar NTLM como el único método).
Por último, pero no menos importante, intenté activar FREB para errores 401.2 y los resultados no parecen decirme nada útil, todo lo que veo es la siguiente advertencia:
MODULE_SET_RESPONSE_ERROR_STATUS
ModuleName IIS Web Core
Notification 2
HttpStatus 401
HttpReason No autorizado
HttpSubStatus 2
Código de
error 2147942405 ConfigExceptionInfo
Notificación AUTHENTICATE_REQUEST
ErrorCode Acceso denegado. (0x80070005)
... esto parece solo decirme lo que ya sé (que es simplemente rechazar la solicitud en lugar de negociar las credenciales).
El seguimiento indica que el módulo de Autenticación de Windows está cargado correctamente porque hay una NOTIFY_MODULE_START
línea con ModuleName
= WindowsAuthentication
(y varios otros eventos de seguimiento ASP.NET - [desafortunadamente], no hay errores interesantes o advertencias aquí).
¿Alguien puede decirme lo que podría estar perdiendo aquí?
Actualización rápida:
Estoy un poco incómodo enviando un volcado de Wireshark completo ya que revelaría IP, URL y otras cosas, pero hice una comparación lado a lado de las respuestas HTTP de localhost y el servidor remoto en Fiddler, y parece bastante propio -evidente cuál es el problema:
Localhost:
HTTP / 1.1 401 no autorizado Control de caché: privado Tipo de contenido: texto / html; charset = utf-8 Servidor: Microsoft-IIS / 7.5 Autenticación WWW: Negociar Autenticación WWW: NTLM Desarrollado por X: ASP.NET Fecha: sábado 17 de diciembre de 2011 23:42:34 GMT Longitud del contenido: 6399 Soporte de proxy: autenticación basada en sesión
Remoto:
HTTP / 1.1 401 no autorizado Tipo de contenido: texto / html Servidor: Microsoft-IIS / 7.5 Desarrollado por X: ASP.NET Fecha: sábado 17 de diciembre de 2011 23:43:13 GMT Longitud del contenido: 1293
Además de algunas diferencias aparentemente intrascendentes como el control de caché, la diferencia principal es que el servidor remoto no está enviando los encabezados WWW-Authenticate al cliente.
Entonces, supongo que eso reduce la pregunta a: ¿Por qué IIS no envía encabezados WWW-Authenticate cuando la autenticación de Windows parece estar instalada, cargada y habilitada exclusivamente?
fuente
Respuestas:
Problema resuelto. Finalmente decidí comparar la lista de módulos uno al lado del otro y en realidad faltaba uno. Resulta que hay dos módulos de autenticación de Windows:
En el servidor, el
WindowsAuthentication
módulo administrado estaba allí, pero no el nativoWindowsAuthenticationModule
resaltado anteriormente. Nadie sabe por qué se configuró de esa manera, pero aparentemente si el módulo nativo no está cargado, el módulo administrado se cargará alegremente y fallará en silencio.Entonces, para cualquier lector futuro que encuentre este problema, asegúrese de tener ambos módulos cargados , porque IIS no le avisará si falta uno de ellos.
fuente
Descubrimos que esto no necesariamente solucionó el problema para los desarrolladores que trabajan localmente en sitios ASP.NET que se ejecutan con autenticación de Windows. Encontramos un hack de registro que deshabilita la verificación de loopback; esto lo solucionó: -
clave de registro: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa
Cree un DWORD con el valor 1 llamado "DisableLoopbackCheck"
Deberá reiniciar la máquina para que la configuración surta efecto
fuente