2009-09-17 56 views
13

Estoy intentando conectarme a un servidor de edirectory 8.8 que ejecuta LDAP. ¿Cómo haría eso en .Net? ¿Puedo seguir usando las clases en System.DirectoryService como DirectoryEntry y DirectorySearcher o son AD específicos? ¿Debo especificar la "Cadena de conexión" de forma diferente?Conexión a LDAP desde C# usando DirectoryServices

estoy tratando algo así como el código de abajo pero no parece funcionar ...

DirectoryEntry de = new DirectoryEntry ("LDAP://novellBox.sample.com","admin","password",AuthenticationTypes.None); 
DirectorySearcher ds = new DirectorySearcher(de); 
var test = ds.FindAll(); 

¿Alguna idea?

Respuesta

11

Bueno, creo que la cadena de conexión que falta un poco - especificando solo el nombre del servidor no es lo suficientemente bueno; también debe especificar un "punto de partida" para su búsqueda.

En AD, esto normalmente será algo así como los "usuarios" de contenedores en su dominio, el cual que le especifique como este en el lenguaje LDAP:

LDAP://novellBox.sample.com/cn=Users,dc=YourCompany,dc=com 
No

seguro de cómo LDAP compliant las nuevas versiones de eDirectory son - pero eso debería funcionar ya que en teoría, es LDAP estándar, independientemente de la aplicación :-)

pero, de nuevo: sólo en teoría, no hay diferencia entre la teoría y la práctica .....

también hay a System.DirectoryServices.Protocols espacio de nombres que ofrece llamadas LDAP de bajo nivel directamente, y eso definitivamente no está ligado a AD, pero es bastante bajo ...

También hay un Novell C# LDAP library pero nunca lo he intentado y puedo No digo cuán completo o capaz es. Sin embargo, ¡podría darte algunas pistas!

Consulte también este otro Stackoverflow question sobre Novell, LDAP y C# - podría proporcionarle información adicional.

+0

Hola Marc, no te vayas con esto tampoco. eDirectory no parece gustarle. Las EE consideran que el DC en la cadena de conexión es muy específico para AD. Ya había visto la otra pregunta, pero estaba tratando de estar más cerca de la implementación general de MS en lugar de tomar una dependencia en otra implementación. – Chaitanya

+0

La sintaxis eDir rara vez termina en dc = this, dc = that. Más típicamente sería ou = OrgU, o = Org en lugar de la notación dc =. Obviamente, debe tener el DN específico correcto para la base de búsqueda ... – geoffc

4

Creo que necesita utilizar la sintaxis LDAP para el host.

Asegúrese de no olvidarse de liberar la conexión con using - si no elimina las entradas de directorio que cuelgan por siempre hasta que se agote el grupo y se rompa su aplicación.

using (DirectoryEntry de = new DirectoryEntry ("LDAP://CN=server,DC=domain,DC=com","admin","password",AuthenticationTypes.Secure)) 
{ 
    ... 
} 
5

que tenían dificultades para calcular esto pero se puede usar algo como lo siguiente, se trabajó dulce para mí:

Domain domain = Domain.GetDomain(new DirectoryContext(DirectoryContextType.Domain, "novellBox.sample.com"); 
DirectorySearcher ds = new DirectorySearcher(domain.GetDirectoryEntry(), searchQuery); 
using (SearchResultCollection src = ds.FindAll()) 
{....} 
+0

Hola, Fermin, ¿esto se está conectando a edirectory o AD? el objeto "Dominio" parece vivir en el espacio de nombres ActiveDirectory. Todavía estoy tratando de hacerlo funcionar. – Chaitanya

+0

Eso funcionó fantástico para mí también. ¡Gracias! – gsharp

+0

¿Qué es searchQuery? muestras? . ¿Alguna solución final con la aplicación de ejemplo de código fuente completo? En mi humilde opinión, mejores muestras para minimizar la curva de aprendizaje son aplicaciones reales con código fuente completo y buenos patrones. – Kiquenet

1

Estoy tratando de conectarme a un servidor 8.8 de edirectory que ejecuta LDAP. ¿Cómo haría eso en .Net? ¿Puedo seguir usando las clases en System.DirectoryService como DirectoryEntry y DirectorySearcher o son AD específicos?

Estamos utilizando System.DirectoryServices para Microsoft Active Directory, OpenLDAP ejecutándose en Linux y eDirectiry sin ningún problema. Entonces la respuesta es sí, puede usar estas clases para acceder a eDir.

¿Debo especificar la "Cadena de conexión" de forma diferente?

Sí, lo es.Al pasar a DirectoryEntry una cadena que comienza con "LDAP: //", debe cumplir con la sintaxis de LDAP, que es muy diferente de la sintaxis de URI.

Le recomiendo que utilice un navegador LDAP (google it, hay muchas descargas gratuitas) para obtener la ruta correcta al objeto raíz, de lo contrario, perderá tiempo tratando de descubrir los tipos de objetos correctos.

1

Si el LDAP externo requiere autenticación con DN intente esto: primero recuperar el DN del usuario, vuelva a intentar la autenticación con DN y las credenciales de usuario. Lo probé en Domino LDAP.

// Autheticate in external LDAP 
string ldapserver = "10.1.1.1:389"; 
string ldapbasedn = "o=mycompany"; 
string ldapuser = "cn=Administrator,o=mycompany"; 
string ldappassword = "adminpassword"; 
string ldapfilter = "(&(objectclass=person)(cn={0}))"; 

string user = "usertest"; 
string password = "userpassword"; 
try 
{ 
    string DN = ""; 
    using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + ldapserver + "/" + ldapbasedn, ldapuser, ldappassword, AuthenticationTypes.None)) 
    { 
     DirectorySearcher ds = new DirectorySearcher(entry); 
     ds.SearchScope = SearchScope.Subtree; 
     ds.Filter = string.Format(ldapfilter, user); 
     SearchResult result = ds.FindOne(); 
     if (result != null) 
     { 
      DN = result.Path.Replace("LDAP://" + ldapserver + "/" , ""); 
     } 
    } 
    // try logon 
    using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + ldapserver + "/" + ldapbasedn, DN, password, AuthenticationTypes.None)) 
    { 
     DirectorySearcher ds = new DirectorySearcher(entry); 
     ds.SearchScope = SearchScope.Subtree; 
     SearchResult result = ds.FindOne(); 
    } 
} catch (Exception) { } 
Cuestiones relacionadas