So integrieren Sie LDAP in WPF-Anwendungen, die den WCF-Dienst nutzen

8

Ich werde damit beginnen, zu beschreiben, wie meine Anwendung heute ohne LDAP funktioniert. Ich habe WPF-Anwendung, die WCF-Dienste verbraucht (Authentifizierung Windows oder Benutzername hängt von der Wahl des Benutzers ab). Dieser Dienst ermöglicht die Kommunikation mit der Datenbank.

Ich zeige dem Benutzer einen "Anmeldebildschirm" an, damit er seinen "Benutzernamen" und sein "Passwort" einstellen kann, dann verbindet sich die Anwendung mit dem Dienst und verwendet eine Funktion, die prüft, ob Benutzername und Passwort in der Datenbank vorhanden sind. (siehe img unten)

Jetzt muss ich auch LDAP integrieren, um Benutzerkonten gegen ihre bestehenden Systeme zu authentifizieren, anstatt ein weiteres Login-Konto zu erstellen.

Ich bin etwas ignorant gegenüber LDAP und verwirrt über viele Dinge. Bitte entschuldigen Sie die mögliche Verwendung falscher Terminologie.

Ich habe gegoogelt, aber ich habe immer noch keine Antworten auf viele Fragen.

1- Welche Beziehung besteht zwischen Benutzern, die in meiner Datenbanktabelle "Benutzer" existieren, und Profilen, die ich in LDAP erstellen soll?

2- Was muss ich tun, damit Benutzer aus LDAP auf meine Anwendung zugreifen und alle Funktionen meines Dienstes nutzen können?

3- Soll ich Service Typ "LDAP" wie andere Authentifizierungsarten, die ich heute in meiner Anwendung habe ("Windows" und "UserName") haben?

4- Wenn ich meine im obigen Bild beschriebene Anwendungsarchitektur aktualisieren möchte, wo sollte ich LDAP hinzufügen?

    
xtensa1408 10.12.2017, 00:03
quelle

1 Antwort

4

Zuerst werde ich Ihre Fragen eins nach dem anderen beantworten,

  1. Der Benutzer in LDAP ist derselbe in der Datenbank, Sie können den LDAP-Benutzernamen und seine Domäne in Ihrer Benutzertabelle speichern, aber das Profil auf dem LDAP kann mit Ihrer Profiltabelle variieren, aber es kann von der LDAP-Adresse abgerufen werden.

  2. Es genügt, den Benutzernamen und das Passwort über LDAP zu überprüfen, Sie müssen lediglich LDAP-Adressen in einer Tabelle speichern (Beispiel ExternalPath) und eine Beziehung zwischen den Tabellen "User" und "ExternalPath" herstellen. LDAP-Adresse enthält einige Spezifikationen.

  3. Ja, Sie müssen einen separaten Mechanismus zum Identifizieren von LDAP-Benutzern haben, den ich näher erläutern werde.

  4. Das ist nicht schwer, wenn alles atomar und richtig gestaltet ist, in weiteren Schritten werden Sie vielleicht sehen, dass es einfach ist.

Lassen Sie mich also über meine Erfahrungen mit LDAP und Authentifizieren von Benutzern in LDAP und DB und unserer Architektur sprechen.

Ich wurde ein WCF-Dienst namens Auth.svc implementiert, dieser Dienst enthält eine Methode namens AuthenticateAndAuthorizeUser , die für Benutzer transparent ist, die von LDAP oder irgendwo her kamen.

Ich hoffe, Sie erhalten den Schlüssel und die Architektur zur Authentifizierung des Benutzers über LDAP und DB in den folgenden Schritten:

1 - Zuerst habe ich eine Tabelle mit dem Namen Users , die Benutzerinformationen enthält und ein weiteres Feld mit dem Namen ExternalPath als Fremdschlüssel. Wenn es null ist, geben Sie UserName in DB mit Passwort an Es kommt von UserDirectory .

2 - Im zweiten Schritt müssen Sie die LDAP-Adresse halten (in meinem Fall sind LDAP-Adressen in ExternalPath table), alle LDAP-Adressen sind auf Port 389 gemeinsam.

3 - Authentifizierungsbenutzer implementieren, falls nicht gefunden (mit Benutzername und Passwort), dann überprüfen Sie, ob ExternalPath die LDAP-Adresse überprüft.

4 - Das DB-Schema sollte so aussehen wie im Screenshot.

Wie Sie ExternalPath Feld angeben können, ist der Benutzer von LDAP oder nicht.

5 - Im Präsentationslayer definiere ich LDAP-Server wie im Screenshot auch

6 - Auf der anderen Seite können Sie beim Hinzufügen neuer Benutzer im System LDAP für Benutzer definieren. In meinem Fall listet ich LDAP-Titel in einem DropDown auf, indem Sie Benutzerformular hinzufügen ( wenn admin auswählen) LDAP-Adresse muss dann kein Passwort bekommen und speichern Sie es in der DB ), wie ich bereits erwähnt LDAP-Benutzername nicht Passwort halten müssen.

7 - Aber letzte Sache ist die Authentifizierung des Benutzers in LDAP und DB.

Also ist die Authentifizierungsmethode etwas wie:

%Vor%

Wenn userLogin in der DB nicht existiert, durch Eingabe von Benutzername und Passwort, sollten wir es über die zugehörige LDAP-Adresse authentifizieren.

In else Block finde den Benutzer aus der Users Tabelle und erhalte ExternalPath , wenn dieses Feld nicht null ist, bedeutet User in LDAP.

8 - Die Methode LDAPAuthenticateUser ist:

%Vor%

Wenn die Ausnahme in LDAPAuthenticateUser ausgelöst wurde, bedeutet dies, dass der Benutzer im Benutzerverzeichnis nicht existiert.

Der Authentifizierungscode akzeptiert eine Domäne, einen Benutzernamen, ein Kennwort und einen Pfad zur Struktur in Active Directory.

Der obige Code verwendet den LDAP-Verzeichnisprovider, der von der Authentifizierungsmethode LDAPAuthenticateUser aufgerufen wird, und übergibt die Anmeldeinformationen, die vom Benutzer gesammelt wurden. Anschließend wird ein DirectoryEntry-Objekt mit dem Pfad zur Verzeichnisstruktur, dem Benutzernamen und dem Kennwort erstellt. Das Objekt DirectoryEntry versucht, die Bindung AdsObject zu erzwingen, indem die Eigenschaft NativeObject abgerufen wird. Wenn dies erfolgreich ist, wird das CN -Attribut für den Benutzer durch Erstellen eines DirectorySearcher -Objekts und durch Filtern auf SAMAccountName erhalten. Nachdem der Benutzer authentifiziert wurde und die Ausnahme nicht aufgetreten ist, gibt die Methode true zurück, dh der Benutzer findet die angegebene LDAP-Adresse.

Wenn Sie weitere Informationen zum Lightweight Directory Access Protocol anzeigen und sich darüber authentifizieren möchten DIESER Link , können Sie nützlich sein, die über Spezifikation mehr erzählt.

Hoffnung wird dir helfen.

    
Aria 07.01.2018, 09:20
quelle

Tags und Links