2009-09-17 31 views
13

Ich versuche, eine Verbindung zu einem EDirectory 8.8-Server herzustellen, auf dem LDAP ausgeführt wird. Wie würde ich das in .Net machen? Kann ich die Klassen in System.DirectoryService wie DirectoryEntry und DirectorySearcher noch verwenden oder sind sie AD-spezifisch? Muss ich den "Connection String" anders angeben?Verbinden mit LDAP über C# mithilfe von DirectoryServices

ich unter so etwas wie der Code versuchen aber es scheint nicht ...

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

Irgendwelche Ideen zu arbeiten?

Antwort

11

Nun, ich denke, die Verbindungszeichenfolge ein bisschen fehlt - Angabe nur der Servername ist nicht gut genug - Sie müssen auch einen "Startpunkt" für Ihre Suche angeben.

In AD, dies würde in der Regel so etwas wie die „Benutzer“ Container in Ihrer Domäne sein, die Sie wie folgt in LDAP parlance angeben würden:

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

Nicht sicher, wie LDAP die neueren Versionen von eDirectory-konform ist - aber das sollte da in der Theorie arbeitet, ist es Standard LDAP unabhängig von der Implementierung :-)

aber dann wieder: nur in der Theorie, gibt es keinen Unterschied zwischen Theorie und Praxis .....

es gibt auch a System.DirectoryServices.Protocols Namespace, der Low-Level-LDAP-Aufrufe direkt anbietet - und das ist definitiv nicht an AD gebunden, aber es ist wirklich ziemlich Low-Level .....

Es gibt auch eine Novell C# LDAP library aber ich habe es noch nie probiert und kann sage nicht, wie vollständig oder fähig es ist. Es könnte Ihnen jedoch einige Hinweise geben!

Siehe auch diese anderen Stackoverflow question über Novell, LDAP und C# - es könnte Ihnen zusätzliche Informationen geben.

+0

Hallo Marc, geh auch nicht mit. eDirectory scheint es nicht zu mögen. Die SEs schätzen, dass der DC in der Verbindungszeichenfolge sehr AD-spezifisch ist. Ich hatte die andere Frage bereits gesehen, versuchte aber, der allgemeinen MS-Implementierung näher zu kommen, anstatt von einer weiteren Implementierung abhängig zu sein. – Chaitanya

+0

Die eDir-Syntax endet selten in dc = this, dc = that. Typischer wäre es ou = OrgU, o = Org anstelle der dc = -Notation. Offensichtlich müssen Sie die richtige spezifische DN für die Suchbasis haben ... – geoffc

4

Ich denke, Sie müssen LDAP-Syntax für den Host verwenden.

Vergessen Sie nicht, die Verbindung mit using freizugeben - wenn Sie nicht über die Verzeichniseinträge verfügen, bleiben sie für immer hängen, bis der Pool leer ist und Ihre App abstürzt.

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

Ich hatte eine harte Zeit dies herauszufinden, aber man könnte so etwas wie die folgenden verwenden, ist es für mich süß gearbeitet:

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

Hallo Fermin, ist dies Verbindung zu EDirectory oder AD? Das Objekt "Domain" scheint im ActiveDirectory-Namespace zu leben. Trotzdem versuche ich es zur Arbeit zu bringen. – Chaitanya

+0

Das hat auch für mich fantastisch funktioniert. Vielen Dank! – gsharp

+0

Was ist SucheQuery? Proben? . Irgendeine endgültige Lösung mit voller Quellcode-Beispielanwendung? IMHO, sind bessere Beispiele für die Lernkurve zu minimieren echte Anwendungen mit voller Quellcode und gute Muster. – Kiquenet

1

Ich versuche, eine Verbindung zu einem Edirectory 8.8 Server mit LDAP herzustellen. Wie würde ich das in .Net machen? Kann ich die Klassen in System.DirectoryService wie DirectoryEntry und DirectorySearcher noch verwenden oder sind sie AD-spezifisch?

Wir verwenden System.DirectoryServices für Microsoft Active Directory, OpenLDAP läuft unter Linux und eDireceiry ohne jedes Problem. Die Antwort ist also Ja. Sie können diese Klassen verwenden, um auf eDir zuzugreifen.

Muss ich die "Verbindungszeichenfolge" anders angeben?

Ja, Sie sind.Wenn Sie an einen DirectoryEntry eine Zeichenfolge übergeben, die mit "LDAP: //" beginnt, müssen Sie der LDAP-Syntax entsprechen, die sich sehr von der URI-Syntax unterscheidet.

Ich empfehle Ihnen, einen LDAP-Browser (google it, es gibt viele kostenlose Downloads) zu verwenden, um den richtigen Pfad zum Root-Objekt zu erhalten, sonst werden Sie Zeit damit verbringen, die richtigen Objekttypen herauszufinden.

1

Wenn die externe LDAP-Authentifizierung erforderlich mit DN dies versuchen: zunächst mit dem DN des Benutzers abrufen, dann versuchen Sie die Authentifizierung mit DN und Benutzerdaten. Ich habe es auf Domino LDAP getestet.

// 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) { }