Estoy tratando de utilizar el .NET 3.5 System.DirectoryServices.AccountManagement
espacio de nombres para validar las credenciales del usuario contra nuestro servidor LDAP de Active Directory a través de una conexión LDAP encriptada SSL. Aquí está el código de ejemplo:¿Cómo valido los créditos de Active Directory sobre LDAP + SSL?
using (var pc = new PrincipalContext(ContextType.Domain, "sd.example.com:389", "DC=sd,DC=example,DC=com", ContextOptions.Negotiate))
{
return pc.ValidateCredentials(_username, _password);
}
Este código funciona bien a través de LDAP no seguro (puerto 389), sin embargo prefiero no transmito una combinación usuario/pase en texto claro. Pero cuando cambio a LDAP + SSL (puerto 636), tengo la siguiente excepción:
System.DirectoryServices.Protocols.DirectoryOperationException: The server cannot handle directory requests.
at System.DirectoryServices.Protocols.ErrorChecking.CheckAndSetLdapError(Int32 error)
at System.DirectoryServices.Protocols.LdapSessionOptions.FastConcurrentBind()
at System.DirectoryServices.AccountManagement.CredentialValidator.BindLdap(NetworkCredential creds, ContextOptions contextOptions)
at System.DirectoryServices.AccountManagement.CredentialValidator.Validate(String userName, String password)
at System.DirectoryServices.AccountManagement.PrincipalContext.ValidateCredentials(String userName, String password)
at (my code)
puerto 636 funciona para otras actividades, tales como la búsqueda de información no contraseña para esa entrada LDAP/AD ...
UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, _username)
... así que sé que no es la configuración SSL de mi servidor LDAP, ya que funciona a través de SSL para otras operaciones de búsqueda.
¿Alguien ha recibido la llamada ValidateCredentials(...)
para trabajar a través de SSL? ¿Puedes explicar cómo? ¿O hay otra/mejor forma de validar de forma segura las credenciales de AD/LDAP?
Aquí hay un artículo de MSDN para solucionar problemas de LDAP sobre SSL: http://support.microsoft.com/kb/938703 – CAbbott
Gracias por el enlace. Pero nuevamente puedo comunicarme a través de LDAPS (puerto 636) bien para todas las demás consultas LDAP que he realizado. Parece algo inusual sobre 'ValidateCredentials()'. Sin embargo, revisaré el artículo con más detalle. –
Las contraseñas deben transmitirse en texto claro -no hash- a través de una conexión segura a un servidor que admita comprobaciones de calidad de contraseñas y cumplimiento de historial de contraseñas a menos que el cliente LDAP proporcione la calidad de contraseña y las comprobaciones del historial; de lo contrario, el servidor no podrá calidad e historia. –