asp.net - asp - windows authentication iis
DirectoryServicesCOMException(0x80072020) cuando se usa Active Directory desde la aplicaciĆ³n ASP.NET (1)
Introducción
Estoy manteniendo una aplicación heredada ASP.NET 3.5 que consulta Active Directory. La aplicación utiliza "Autenticación integrada de Windows" y está diseñada para conectarse a Active Directory utilizando su propio contexto de seguridad en lugar de un nombre de usuario y contraseña dedicados.
Aquí está el código relevante.
using (DirectoryEntry root = new DirectoryEntry())
using (DirectorySearcher searcher = new DirectorySearcher(root))
{
searcher.Filter = string.Format("(&(samAccountName={0})(objectClass=user)(objectCategory=person))", userName.Trim());
SearchResultCollection results = searcher.FindAll();
}
Aunque utiliza ASP.NET 3.5, debe poder ejecutarse desde un grupo de aplicaciones ASP.NET 4.0 debido a restricciones de infraestructura existentes.
Problema
La llamada a FindAll
arroja la siguiente excepción bajo ciertas circunstancias:
System.DirectoryServices.DirectoryServicesCOMException (0x80072020): se ha producido un error de operaciones.
Cuando inspecciono el objeto de excepción con el depurador de Visual Studio, la propiedad ExtendedErrorMessage
contiene información más detallada:
000004DC: LdapErr: DSID-0C0906E8, comentario: para realizar esta operación, se debe completar un enlace correcto en la conexión., Data 0, v1db1
La siguiente captura de pantalla muestra cómo se ve esto en el depurador de Visual Studio:
Que funciona
He encontrado algunas soluciones alternativas para que esto funcione, pero ninguna de ellas es aceptable para mí:
- Deshabilitar la Autenticación de Windows integrada y, en su lugar, usar la Autenticación básica .
- En IIS, ejecuta la aplicación en ASP.NET 2.0 con la cuenta de servicio de red y la suplantación de ASP.NET deshabilitada .
- Solo accediendo a la aplicación desde el servidor web, usando localhost como nombre de host.
- Usar la suplantación ASP.NET con una cuenta codificada en web.config.
Lo que no funciona
He encontrado algunas sugerencias de Internet, pero ninguna de ellas resolvió completamente el problema:
- Usando
HostingEnvironment.Impersonate()
. - Deshabilitar la suplantación
Lo que quiero
Me gustaría hacer que esto funcione sin tener que volver a configurar nada en Active Directory. Funciona bien bajo cierta configuración de IIS como se muestra arriba, así que creo que debería ser posible hacer que funcione reconfigurando la aplicación o IIS (excepto para cambiar la versión de .NET framework).
Creo que el problema tiene múltiples causas:
- Uso de la suplantación de ASP.NET.
- Ejecutar la aplicación ASP.NET 3.5 en un grupo de aplicaciones ASP.NET 4.0.
Para resolver el segundo, actualice la aplicación a ASP.NET 4.0 o configure IIS para usar ASP.NET 2.0.