2016-04-06 8 views
1

Wir haben Port 389 in der Firewall zu einem der aktiven Root-Verzeichnisserver in einem Netzwerk geöffnet, so dass wir Benutzer einer Website authentifizieren können, die in einem anderen Netzwerk ausgeführt wird (mit völlig separaten Domains), verwende ich C# dafür und ich kann den Benutzer gut mit seinem Benutzernamen und Passwort authentifizieren, aber wenn ich versuche, eine Abfrage zu machen, um seine Details zu erhalten, wie E-Mail und Anzeigename, gibt die Suche nichts zurück, Der Benutzer wird einfach nicht gefunden. Ich habe im ganzen Internet gesucht, um zu sehen, warum das passiert, aber LDAP-Protokoll scheint nur so umfangreich, dass ich wahrscheinlich Training nehmen müsste, um zu versuchen, warum zu verstehen.Kann mit ldap hinter der Firewall authentifizieren, aber Benutzerabfrage bringt keine Ergebnisse C#

Im Moment testet in einer Konsolenanwendung mit diesem Code:

try { 
      string container = "DC=my,DC=corp,DC=domain,DC=local"; 
      var entry = new DirectoryEntry("LDAP://ip_address:389/" + container, username, password); 
      object nativeObject = entry.NativeObject; 

      Console.WriteLine("Authenticated"); 

      var searcher = new DirectorySearcher(entry); 
      searcher.Filter = "samaccountname=" + username; 
      var result = searcher.FindAll(); 
      if (result == null) { 
       Console.WriteLine("User " + username + " not found in LDAP."); 
       return; 
      } 
      foreach (SearchResult res in result) { 
       var resultEntry = res.GetDirectoryEntry(); 
       if (resultEntry == null) { 
        Console.WriteLine("Unable to get directory entry for user " + username); 
        return; 
       } 
       Console.WriteLine("SAM: " + resultEntry.Properties["sAMAccountName"].Value); 
      } 
     } 
     catch (Exception ex) { 
      Console.WriteLine("Error: " + ex); 
     } 

Der Code perfekt funktioniert gut, wenn ich es auf einer Maschine auf dem gleichen Netzwerk wie der Root-LDAP-Server laufen, aber wenn ich es auf laufen das andere Netzwerk mit dem gleichen Behälter durch die Firewall, erhalte ich Fehler:

Error: System.DirectoryServices.DirectoryServicesCOMException (0x8007202B): A referral was returned from the server.

wenn ich jedoch ändern, den Behälter nur:

string container = "DC=domain,DC=local";

dann sehe ich tatsächlich den Text "Authentifiziert", aber dann gibt die Suche nichts zurück. Wenn ich denselben minimalen Container verwende und den Code im selben Netzwerk wie der LDAP-Server ausführe, kann ich mich erneut authentifizieren, aber die Suche gibt auch nichts zurück.

Das sagt mir, dass der Container sagt, wo nach dem Benutzer suchen, ich nehme jedoch an, dass der Stammserver mit einem Verweis auf einen anderen LDAP-Server in der Gesamtstruktur antwortet, wo die tatsächliche Abfrage ausgeführt wird, aber möglicherweise Da ich den Code in einem geschlossenen Netzwerk verwende, in dem die Firewall nur für einen Root-Server und nicht für alle DCs geöffnet ist, kann der Verweis nicht kontaktiert werden und es schlägt alles fehl.

Ist das richtig? Würde das bedeuten, dass ich die Firewall für alle DCs im anderen Netzwerk öffnen müsste? Gibt es keine Möglichkeit, dem Root-Server mitzuteilen, dass er die Verbindung selbst zu dem anderen Domänencontroller herstellen soll und nur die Daten erhalten soll?

Warum Authentifizierung funktioniert, aber Abfrage nicht?

Sorry, zu viele Fragen, aber ich bin in diesem Szenario verloren. Schätzen Sie jede Hilfe!

Antwort

0

Gibt es in ihrer Gesamtstruktur mehrere Domänen, und Sie stellen nur eine Verbindung zur Stammdomäne her?

Wenn dies der Fall ist, müssen Sie den globalen Katalog verwenden ("GC: //" anstelle von "LDAP: //"). Dann wirst du nicht verwiesen. Aber GC ist ein anderer Port: 3268.

Mit "LDAP: //" erhalten Sie nur Ergebnisse von der gleichen Domäne wie dieser Domänencontroller. Mit "GC: //" erhalten Sie Ergebnisse aus der gesamten Gesamtstruktur.

+0

Es gibt tatsächlich mehrere Subdomains in der Gesamtstruktur, alle haben die gleichen Eltern, aber unterschiedliche Domänencontroller für jeden Standort, und ja, ich verbinde mich nur mit einem der Root-Server. Aber so, Sie sagen, dass ich Port 389 auf der Firewall sicher schließen und nur Port 3268 öffnen kann und dann beide Authentifizierung und Benutzerabfragen gut funktionieren werden? Ich werde Netzwerkprotokolle durchlaufen müssen, damit sich die Firewall erneut ändert, bevor ich sie testen kann. Aber das klingt vielversprechend. – SergioCS

+0

Korrigieren. Und stellen Sie sicher, "LDAP: //" durch "GC: //" in Ihrem Code zu ersetzen. –

Verwandte Themen