Conexión al servidor LDAP desde .NET

Se me ha recomendado usar System.DirectoryServices.Protocols para poder admitir la conexión a servidores LDAP que no sean Active Directoy aquí .
Desafortunadamente, no he podido buscar el directorio correctamente. Me gustaría poder obtener un determinado atributo para un usuario (por ejemplo, mail ). Esto se hace fácilmente en el espacio de nombres System.DirectoryServices utilizando la clase DirectorySearcher . ¿Cómo puedo lograr lo mismo en el espacio de nombres System.DirectoryServices.Protocols ? Esto es lo que tengo hasta ahora:

 var domainParts = domain.Split('.'); string targetOu = string.Format("cn=builtin,dc={0},dc={1}", domainParts[0], domainParts[1]); string ldapSearchFilter = string.Format("(&(ObjectClass={0})(sAMAccountName={1}))", "person", username); // establish a connection to the directory LdapConnection connection = new LdapConnection( new LdapDirectoryIdentifier(domain), new NetworkCredential() { UserName = username, Password = "MyPassword" }); SearchRequest searchRequest = new SearchRequest( targetOu, ldapSearchFilter, SearchScope.OneLevel, new[] {"mail"}); 

Este código genera una excepción de tipo DirectoryOperationException con mensaje The object does not exist .

Sospecho que hay algo mal con mis variables targetOu y ldapSearchFilter .

Gracias.

Sospecho que el problema principal podría ser: samAccountName es un atributo estrictamente solo de Windows que otros servidores LDAP no conocerán.

Por lo tanto, si va en contra de un LDAP que no es de Active Directory, debe usar otra cosa para buscar, por ejemplo, sn (para apellidos o apellidos), givenName (primer nombre), y posiblemente un givenName .

Otra opción interesante podría ser utilizar búsquedas ANR (resolución de nombres ambiguos): vea esta página en SelfADSI aproximadamente en el medio, donde se explica ANR.

Con ANR, escribirías tu consulta de esta manera:

 string ldapSearchFilter = string.Format("(&(ObjectCategory={0})(anr={1}))", "person", username); 

También cambié ObjectClass a ObjectCategory por dos razones:

  • ObjectCategory es de un solo valor, por ejemplo, solo contiene un solo valor ( ObjectClass tiene varios valores)
  • ObjectCategory normalmente está indexada y, por lo tanto, las búsquedas son mucho más rápidas usando ObjectCategory

¿Devuelve esto los resultados que estás buscando?