DiscourseConnect-Flow funktioniert nicht mehr

Seit dem Update von DiscourseSSO auf DiscourseConnect funktioniert unsere SSO-Integration nicht mehr.

Wir haben wahrscheinlich eine ungewöhnliche Konfiguration: Es gibt mehrere Anwendungen, von denen aus SSO initiiert werden kann, nicht nur eine einzige. Unsere Software kann on-premise oder als Multi-Tenant-Lösung in der Cloud installiert werden. Jede Tenant-Instanz der Software enthält einen SSO-Link zu unserer Discourse-Community. Das bedeutet, dass wir den SSO-Prozess von beispielsweise tenant1.ourcompany.com, software.tenant2.com oder something.else.com aus starten können – also von fast tausend verschiedenen Orten.

Wir verfügen nicht über einen einzigen zentralen Identity Provider für alle unsere Tenants; jeder kann seine eigene IDP-Lösung nutzen (Google, O365, AD, Okta, …). Auf Serverseite haben wir Prozesse und Gegenmaßnahmen implementiert, um Account-Übernahmen zu verhindern.

Leider scheint unser Ansatz mit dem neuesten Discourse-Update nicht mehr zu funktionieren. (Danke an diesen Commit.) Aus technischer Sicht funktionierte der Ablauf bisher so:

  • Unser Backend holte sich per API einen Nonce und SSO-Details von Discourse.
  • Discourse sendete eine 301-Weiterleitung mit dem SSO-Payload zurück an eine einzige, spezifische Adresse bei uns.
  • Der Server an dieser Adresse war so konfiguriert, dass er die 301-Weiterleitung ignorierte (um Nonce-Fehler zu vermeiden). Stattdessen analysierte er den Location-Header, dekodierte die Base64-Werte, extrahierte den Nonce, generierte den SSO-Payload, signierte ihn mit dem SSO-Geheimnis und leitete den Benutzer zur SSO-Login-URL weiter.

Es scheint, dass der Nonce nun an die Browsersitzung gebunden ist (zum Schutz vor CSRF-Angriffen). Das bedeutet, dass beim Versuch des oben beschriebenen Ablaufs der Client-Browser den _forum_session-Cookie für den Nonce nicht hat, wenn wir ihn zurück zu Discourse senden. Daher erhalten wir die Meldung „Nonce abgelaufen“.

Ist es möglich, diesen CSRF-Schutz optional zu machen? Das heißt, eine neue Einstellung enable_secure_nonce einzuführen, die wir auf false setzen können?

Derzeit sind die meisten unserer Kunden von unserem Forum ausgeschlossen. Wir müssten sie alle auffordern, Passwörter einzurichten, und verlieren gleichzeitig die Möglichkeit, Forum-Benachrichtigungen in unserer App zu verfolgen – was zu einem Rückgang der Engagement-Rate führen wird. :frowning:

2 „Gefällt mir“

Ja, traditionell haben wir für solche Fälle immer Site-Einstellungen unterstützt. Wir werden dies wahrscheinlich zu einer versteckten Einstellung machen, da sie sehr schwer zu erklären ist, aber ich unterstütze sie für Ausnahmefälle wie Ihren. Wir können dies dann für Ihre Instanz aktivieren.

@david wird sich dies ansehen.

7 „Gefällt mir“

Es ist nun möglich, den Schutz über die Rails-Konsole zu deaktivieren, indem Sie folgenden Befehl ausführen:

SiteSetting.discourse_connect_csrf_protection=false

Führen Sie dies nur durch, wenn Sie die damit verbundenen Risiken verstehen und akzeptieren. Für alle, die von discourse.org gehostet werden, wenden Sie sich bitte an uns; wir können die Einstellung für Sie umschalten.

(cc @rysher, der eine ähnliche Anfrage hatte)

9 „Gefällt mir“

Dieses Thema wurde automatisch 30 Tage nach der letzten Antwort geschlossen. Neue Antworten sind nicht mehr erlaubt.