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. ![]()