Dopo l’aggiornamento da DiscourseSSO a DiscourseConnect, la nostra integrazione SSO ha smesso di funzionare.
Abbiamo una configurazione probabilmente insolita: l’SSO può essere avviato da più applicazioni, non da una singola. Il nostro software può essere installato on-premise o in cloud in modalità multi-tenant. Ogni istanza tenant del software include un link SSO verso la nostra community Discourse. Ciò significa che possiamo avviare l’SSO da (ad esempio) tenant1.ourcompany.com, da software.tenant2.com e da something.else.com — quasi mille punti diversi.
Non disponiamo di un unico provider di identità centrale per tutti i tenant; ciascuno può utilizzare la propria soluzione IDP (Google, O365, AD, Okta, …). A livello di server, abbiamo implementato processi e mitigazioni per proteggere contro il takeover degli account.
Purtroppo, il nostro approccio sembra non funzionare più nell’ultimo aggiornamento di Discourse. (Grazie a questo commit.) Dal punto di vista tecnico, il flusso che funzionava era il seguente:
- Il nostro backend, tramite API, otteneva un nonce e i dettagli SSO da Discourse
- Discourse inviava un重定向 301 con il payload SSO indietro a noi a un indirizzo specifico
- Il server qui era configurato per ignorare il重定向 301 (per evitare errori di nonce). Invece, analizzava l’intestazione
Location, decodificava i valori in base64, recuperava il nonce, generava il payload SSO, lo firmava con il segreto SSO e inviava l’utente al URL di login SSO.
Sembra che il nonce sia stato modificato in modo che sia associato alla sessione del browser (per proteggersi dagli attacchi CSRF). Ciò significa che quando proviamo il flusso sopra, il browser client non dispone del cookie _forum_session per il nonce quando lo rimandiamo a Discourse, e quindi riceviamo un messaggio “nonce scaduto”.
È possibile rendere opzionale questa protezione CSRF? Cioè, introdurre una nuova impostazione enable_secure_nonce che possiamo impostare su false?
Allo stato attuale, la maggior parte dei nostri clienti è bloccata fuori dal nostro forum, e dobbiamo far sì che tutti impostino le password, perdendo la nostra capacità di tracciare le notifiche del forum nella nostra app — il che comporterà un calo del coinvolgimento. ![]()