2009-09-17 19 views
13

Sto provando a connettermi a un server edirectory 8.8 che esegue LDAP. Come potrei fare per farlo in. Net? Posso ancora utilizzare le classi in System.DirectoryService come DirectoryEntry e DirectorySearcher o sono specifiche di AD? Devo specificare la "stringa di connessione" in modo diverso?Connessione a LDAP da C# utilizzando DirectoryServices

Sto provando qualcosa come il codice qui sotto, ma non sembra funzionare ...

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

Tutte le idee?

risposta

11

Beh, penso che la stringa di connessione non è presente un po '- specificando solo il nome del server non è abbastanza buono - devi anche specificare un "punto di partenza" per la tua ricerca.

In dC, questo sarebbe tipicamente qualcosa come gli "Utenti" contenitore nel dominio, che hai specificato come questo nel gergo LDAP:

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

sicuro di come LDAP compliant le versioni più recenti di eDirectory sono - ma che dovrebbe funzionare dal momento che, in teoria, è standard LDAP indipendentemente l'attuazione :-)

ma poi di nuovo: solo in teoria, non c'è differenza tra teoria e pratica .....

c'è anche a System.DirectoryServices.Protocols namespace che offre chiamate LDAP di basso livello direttamente - e questo non è assolutamente legato ad AD, ma è davvero piuttosto basso .....

C'è anche uno Novell C# LDAP library ma non l'ho mai provato e posso Diciamo quanto sia completo o capace. Potrebbe darti qualche indizio, però!

Vedere anche questo altro Stackoverflow question su Novell, LDAP e C# - potrebbe fornire ulteriori informazioni.

+0

Ciao Marc, non andare con questo neanche. eDirectory non sembra gradirlo. La SE calcola che la CC nella stringa di connessione è molto specifica per l'AD. Avevo già visto l'altra domanda, ma stavo cercando di rimanere più vicino all'implementazione generale della SM piuttosto che prendere una dipendenza dall'ennesima implementazione. – Chaitanya

+0

La sintassi eDir si conclude raramente in dc = this, dc = that. Più tipicamente sarebbe ou = OrgU, o = Org invece della dc = notazione. Ovviamente devi avere il DN specifico corretto per la base di ricerca ... – geoffc

4

Penso che sia necessario utilizzare la sintassi LDAP per l'host.

Assicurarsi di non dimenticare di rilasciare la connessione con using - se non si eliminano le voci della rubrica, rimangono in attesa per sempre fino a quando il pool non si esaurisce e l'app si interrompe.

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

ho avuto difficoltà a capire questo fuori, ma si potrebbe usare qualcosa di simile a quanto segue, ha funzionato dolce per me:

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

Ciao Fermin, questo si collega a edirectory o AD? l'oggetto "Dominio" sembra vivere nello spazio dei nomi ActiveDirectory. Sto ancora cercando di farlo funzionare. – Chaitanya

+0

Anche questo ha funzionato alla perfezione. Grazie! – gsharp

+0

Qual è la ricercaQuery? campioni? . Qualunque soluzione finale con l'applicazione di esempio con codice sorgente completo? IMHO, i campioni migliori per ridurre al minimo la curva di apprendimento sono applicazioni reali con codice sorgente completo e buoni schemi. – Kiquenet

1

Sto provando a connettermi a un server di edirectory 8.8 che esegue LDAP. Come potrei fare per farlo in. Net? Posso ancora utilizzare le classi in System.DirectoryService come DirectoryEntry e DirectorySearcher o sono specifiche di AD?

Stiamo usando System.DirectoryServices per Microsoft Active Directory, OpenLDAP in esecuzione su Linux e eDirectiry senza alcun problema. Quindi la risposta è sì, è possibile utilizzare queste classi per accedere a eDir.

Devo specificare la "stringa di connessione" in modo diverso?

Sì.Quando si passa a DirectoryEntry una stringa che inizia con "LDAP: //" è necessario conformarsi alla sintassi LDAP che è molto diversa dalla sintassi URI.

Ti consiglio di utilizzare un browser LDAP (google, ci sono molti download gratuiti) per ottenere il percorso corretto per l'oggetto radice altrimenti passerai il tempo a cercare di capire i tipi di oggetto corretti.

1

Se il LDAP esterno richiede l'autenticazione con DN provare questo: prima di recuperare il DN utente, quindi provare l'autenticazione con il DN e le credenziali utente. L'ho provato su 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) { } 
Problemi correlati