it-swarm.com.de

SSO/Authentifizierungsintegration mit externem 'Verzeichnisdienst'

Ich arbeite gerade an einem Prototyp für einen Kunden. Eine der erforderlichen Funktionen ist die Integration in ein internes Benutzerauthentifizierungs-/Registrierungssystem.

Dieses System fungiert als autorisierende Benutzerdatenbank und bietet eine REST-Schnittstelle zum Erstellen neuer Benutzer und zum Authentifizieren gültiger Benutzer.

  1. Ich muss in der Lage sein, neue Benutzer in WP zu erstellen und im Rahmen dieses Prozesses die externe Authentifizierungs-API aufzurufen, um diesen Benutzer zu erstellen oder zu validieren.

  2. Eine Person, die ein gültiger Benutzer ist, der WP jedoch nicht bekannt ist, sollte sich zum Kommentieren anmelden können, ohne sich auf der WP Website registrieren zu müssen.

  3. Eine Person, die auf der gesamten Website angemeldet ist, sollte auch automatisch bei WordPress angemeldet sein.

Ich denke, das Folgende ist der richtige Weg.

  • Für (1) - gibt es einen Registrierungshaken, den ich verwenden kann?

  • Für (2) - ich gehe davon aus, dass ich den Authentifizierungsfilter einhänge - dh, wenn jemand versucht, sich anzumelden, fange ich das ab, rufe das externe System an und verarbeite dann entweder die Anmeldung WP oder leite sie um zum Registrierungsprozess wo (1) oer nimmt.

  • Für (3) - lesen Sie das Login-Cookie auf der Hauptseite und fahren Sie mit (2) fort.

Ich denke, ich muss auch einen Datensatz in die Benutzer- und Usermeta-Tabelle einfügen.

Ergibt das oben Gesagte Sinn - habe ich nicht über etwas nachgedacht? Jeder hat gute Ressourcen, um dabei zu helfen (@hakre - ich habe gesehen, dass Sie daran gearbeitet haben !!).

Aktualisieren

Ich drücke meinen Kopf immer noch ein wenig dagegen, im Grunde versuche ich, mich in den Authentifizierungsfilter einzuklinken und dies zu verwenden, um:

  1. überprüfen Sie, ob ein Anmeldecookie für die 'Master'-Site festgelegt ist, und überprüfen Sie gegebenenfalls die Authentifizierungs-API, und erzwingen Sie, falls gültig, eine WP -Anmeldung mit wp_signon() unter Verwendung der auf der Master-Site enthaltenen Informationen Cookie (E-Mail und Hash-Passwort) als Zugangsdaten für WP
  2. wenn das Cookie nicht gesetzt ist, leiten Sie zur Master-Site-Anmeldeseite um und erhalten Sie entweder eine Anmeldung/Registrierung, dann kehren Sie zu Schritt 1 zurück
  3. wenn es keinen WP Benutzer gibt, wenn ein authentifizierter Master-Site-Benutzer vorhanden ist, erstellen Sie ihn und dann eine "transparente" Anmeldung (dh der Benutzer sieht kein WP Login) bilden)

Grundsätzlich möchte ich das Anmeldeformular WP vollständig für Benutzer verbergen, die nur hauptsächlich kommentieren und später eine Möglichkeit finden, Autoren und Administratoren den direkten Zugriff darauf zu ermöglichen.

Es geht ziemlich langsam voran, hier ist, wofür ich etwas Hilfe gebrauchen könnte:

  • ist der Authentifizierungsfilter der richtige? Es scheint nicht in allen Situationen aufgerufen zu werden, die ich erwarten würde - z. B. zeigt das Meta-Widget Anmelde-/Abmelde-Links an, ohne dass der authentifizierte Hook ausgelöst wird

  • ich kann wp_signon() dazu bringen, ein WP_User-Objekt zurückzugeben (was auf Erfolg hinweist), aber es hat keinen Einfluss auf den Anmeldestatus - dh das Meta-Widget wird auch nach dem Aktualisieren noch in "Login" angezeigt.

Jede Hilfe dankbar erhalten :)

15
anu

OK, der Ansatz, der für mich funktioniert, ist wie folgt:

  1. Angenommen, die Benutzerdatenbank der Hauptwebsite ist autorisierend. Das Haupt-Site-Login-Cookie enthält eine ID und einen Hash des Site-Passworts.

  2. Rufen Sie das Cookie von der Hauptwebsite ab und überprüfen Sie es anhand der Authentifizierungs-API der Hauptwebsite

  3. Wenn dies gültig ist, verwenden Sie die E-Mail-Adresse aus dem Rückgabewert als 'user_login'-Wert für WP und das Kennwort für die Hash-Site als WP-Kennwort.

  4. Testen Sie mit wp_authenticate('user_login', 'user_pass'), ob dieser Benutzer in WP vorhanden ist. Dies gibt ein WP_User-Objekt bei Erfolg oder ein WP_Error-Objekt bei einem Fehler zurück.

  5. Wenn WP_Error/is_wp_error(), verwenden Sie wp_update_user(), um einen Benutzer zu erstellen (oder einen Benutzer mit einem geänderten Kennwort zu aktualisieren).

  6. Login über wp_set_current_user(), wp_set_auth_cookie() und do_action('wp_login, id)

(Dies ist alles in einer Funktion enthalten, die an die Aktion 'init' angehängt ist.)

Dies scheint zu funktionieren - gültige Site-Benutzer, die WP unbekannt sind, werden automatisch erstellt. Kennwortänderungen werden berücksichtigt. Wenn das Site-Cookie gesetzt ist und der Benutzer WP vorhanden ist, erfolgt die einmalige Anmeldung automatisch und nahtlos.

12
anu

Das gesamte Authentifizierungssystem ist steckbar. Ich schlage vor, vorhandene Plugins zu prüfen, um eine Vorstellung davon zu bekommen, wie das System überschrieben werden kann. Vielleicht durch einen Blick auf einige LDAP-Plugins ?

3
Dougal Campbell

Das Aktivieren von Single-Sign-On in WordPress hat mich mehr als 18 Stunden gekämpft, aber möglicherweise dauert es nur ein paar Minuten:

Grundsätzlich sollten Sie https://wordpress.org/plugins/wp-force-login/ und eine geänderte Version von https://as.wordpress.org/plugins/jwt-authenticator verwenden/ und erstellen Sie dann einen auth-geschützten Endpunkt auf Ihrer Hauptsite, der ein JWT (JSON Web Token) generiert und zur speziellen URL Ihrer WordPress-Site zurückleitet.

Siehe vollständigen Code hier .

1
Ryan

Einige benutzerbezogene Funktionen sind in wp-includes/pluggable.php bedingt auf !function_exists() definiert und können leicht mit Ihren eigenen Versionen überschrieben werden.

1
Rarst