2016-06-17 6 views
1

Ich versuche, eine Verbindung zu einem lokalen LDAP-Server herzustellen, den ich mit Apache Directory Studio eingerichtet habe. Ich bin mit Visual Studio 2015 Enterprise Update 2 und MVC 5.Verbindung mit einem lokalen LDAP-Server über MVC herstellen 5

Dies sind die beiden Ansätze ich bin mit Arbeit:

public void ldap() 
    { 

     try 
     { 
      DirectoryEntry entry = new DirectoryEntry("LDAP://localhost:10389"); 
      DirectorySearcher mySearcher = new DirectorySearcher(entry); 

      var result = mySearcher.FindOne(); 

     } 
     catch (System.Runtime.InteropServices.COMException) 
     { 
      System.Runtime.InteropServices.COMException exception = new System.Runtime.InteropServices.COMException(); 
      Console.WriteLine(exception); 
     } 
     catch (InvalidOperationException) 
     { 
      InvalidOperationException InvOpEx = new InvalidOperationException(); 
      Console.WriteLine(InvOpEx.Message); 
     } 
     catch (NotSupportedException) 
     { 
      NotSupportedException NotSuppEx = new NotSupportedException(); 
      Console.WriteLine(NotSuppEx.Message); 
     } 
    } 

Nach var result = mySearcher.FindOne() ausgeführt wird, ein System- .Runtime.InteropServices.COMException 'in System.DirectoryServices.dll tritt auf und gibt an, dass ein HRESULT E_FAIL-Fehler beim Aufrufen einer COM-Komponente übergeben wurde.

Ich habe keine Ahnung, was das bedeutet und habe mit Google nicht hilfreich gefunden.

2. Ansatz:

try 
     { 
      LdapConnection ldapConnection = new LdapConnection("LDAP://localhost:10389"); 

      var networkCredential = new NetworkCredential("cbrunato", "c2VjcmV0", "dc=example,dc=com"); 
      ldapConnection.SessionOptions.SecureSocketLayer = true; 
      ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; }; 
      ldapConnection.AuthType = AuthType.Negotiate; 
      ldapConnection.Bind(networkCredential); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 

Nach ldapConnection.Bind (NetworkCredential) ausgeführt wird, ich die Fehlermeldung "LDAP-Server ist nicht verfügbar".

Wenn ich den LDAP-Server stoppe und das Programm starte, bekomme ich die gleichen Fehler, also nehme ich keine Verbindung zu meinem LDAP-Server mit beiden Ansätzen, aber ich habe keine Ahnung warum.

Ich bin sehr dankbar für jede Hilfe.

Update: Credentials sind ungültig Ausnahme

Apache Directory Studio

Strings als Benutzername verwendet:

"uid=cbrunato" 
"cn=Chuck Brunato" 
"cn=Chuck Brunato,ou=Users,dc=example,dc=com" 
"uid=cbrunato,cn=Chuck Brunato,ou=Users,dc=example,dc=com" 
"uid=cbrunato,ou=Users,dc=example,dc=com" 
+0

E_FAIL ist wahrscheinlich ein Berechtigungsproblem. Ist die Identität der appdomain Zugriff erlaubt? Ich kann mich nicht einmal daran erinnern, dass ADS integrierte Sicherheit erlaubt, ich musste immer Netzwerkzertifikate bereitstellen. – rene

+0

Ich fürchte ich verstehe das nicht. Ich muss zugeben, dass ich komplett neu in .NET bin. Sagen Sie, dass meine Anwendung keine Berechtigung zum Herstellen einer Verbindung zum LDAP-Server hat? –

+0

[Diese Frage] (http://stackoverflow.com/questions/8700115/connecting-to-ldap-server-from-net) scheint nützlich, da es zeigt, wie Credential bereitzustellen, ist die Antwort relevant, weil Sie ADS verwenden . Möglicherweise müssen Sie mehr q + a auf dem [Thema] (http://stackoverflow.com/search?q=directorySearcher+networkcredential) lesen. – rene

Antwort

0

Sie haben ein paar Probleme in der Nutzung Ihrer LdapConnection.

Zuerst müssen Sie die LdapProtocol-Version festlegen und zweitens benötigen Sie eine Standardauthentifizierung. Die Option Negotiate meist funktioniert nur mit Microsoft-Produkten. Da Sie Port 10389 verwenden, benötigen Sie kein SSL, da 10636 der SSL-Port ist.

Dieser Code funktioniert für mich:

try 
{ 
    // don't add LDAP://, the protocol is already known ... 
    LdapConnection ldapConnection = new LdapConnection("127.0.0.1:10389"); 
    // notice we don't use the domain here 
    var networkCredential = new NetworkCredential(
      "uid=yourusername,dc=example,dc=com", 
      "yourpassword"); 

    // Apache Directory Server uses LDAPv3 
    ldapConnection.SessionOptions.ProtocolVersion = 3; 

    // 10389 is the plain port, no ssl needed 
    //ldapConnection.SessionOptions.SecureSocketLayer = true; 
    // ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; }; 

    // let's not negotiate, only Basic is supported 
    ldapConnection.AuthType = AuthType.Basic; 
    ldapConnection.Bind(networkCredential); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.Message); 
} 
+0

Vielen Dank !!! Jetzt kann ich mich mit dem Server verbinden. Ich bekomme jedoch eine Ausnahme nach Bind(), dass die Anmeldeinformationen ungültig sind. Ich habe der Frage ein Bild von meinem Apache Directory Studio Server hinzugefügt. Ich habe verschiedene Strings für den Benutzernamen (in der Frage aufgeführt) ausprobiert. Könnte es ein Problem sein, dass das Passwort SSHA Hash in ADS ist, aber in NetworkCredentials das Passwort als normaler String zur Verfügung gestellt wird? –

+0

Ich kann eine Verbindung mit dem Standard-Admin-Konto mit uid = admin, ou = System und dem Passwort "secret", die im Klartext gespeichert wird –

+0

Ich würde erwarten, dass 'uid = cbrunato, ou = Benutzer, dc = Beispiel, dc = com 'um zu arbeiten. @DonKassube in meinem Test wurde das Passwort auch als SSHA gespeichert und ich musste nichts ändern. – rene