Discourse-saml: SLO non annulla la sessione

Ciao,

abbiamo la seguente configurazione:
Discourse ufficiale 2.5.0 ([ 3f7658cc6e ]) con il plugin discourse-saml (commit 230a58b),
Keycloak (10.0.2) come Identity Provider

Il nostro Identity Provider è configurato per utilizzare l’URL https://discourse.our-domain.xxx/auth/saml/slo come URL di destinazione per il binding POST del servizio di logout. Il nostro processo di login funziona perfettamente. Utilizzando il pulsante di logout in Discourse, viene cancellata anche la sessione del nostro IdP.

Il problema si verifica quando si utilizza la funzionalità di logout dell’IdP. Discourse non cancella la sessione. Il forum riceve la richiesta, ma sembra non gestirla correttamente. L’utente rimane connesso e otteniamo un errore nel log di Discourse.

Il nome utente per i seguenti log è test.

Started POST "/auth/saml/slo" for 127.0.0.1 at 2020-07-09 18:29:33 +0000                                                                                                                            
OmniAuth::Strategies::SAML::ValidationError (SAML failed to process LogoutRequest)                                                                                                                  
/var/www/discourse/plugins/discourse-saml/gems/2.6.6/gems/omniauth-saml-1.9.0/lib/omniauth/strategies/saml.rb:189:in `handle_logout_request'

La condizione if che porta all’eccezione è la seguente (saml.rb):

if logout_request.is_valid? &&
     logout_request.name_id == session["saml_uid"]
codice per l'output di debug
STDERR.puts '*************************************************************************'
STDERR.puts 'raw_request:'                                                             
STDERR.puts raw_request                                                                
STDERR.puts '*************************************************************************'
STDERR.puts 'logout_request.is_valid?'                                                 
STDERR.puts logout_request.is_valid?                                                   
STDERR.puts '*************************************************************************'
STDERR.puts 'logout_request.name_id'                                                   
STDERR.puts logout_request.name_id                                                     
STDERR.puts '*************************************************************************'
STDERR.puts 'session[saml_uid]'                                                        
STDERR.puts session["saml_uid"]                                                        
STDERR.puts '*************************************************************************'

Abbiamo aggiunto l’output di debug nel file saml.rb (riga 181) e abbiamo ricevuto i seguenti valori:

*************************************************************************
raw_request:
richiesta grezza (decodificata con base64)
<?xml version="1.0"?>
<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns="urn:oasis:names:tc:SAML:2.0:assertion" Destination="https://discourse.test.our-domain.xxx/auth/saml/slo" ID="ID_ee6ef1f7-a269-443f-9942-1311b2c09636" IssueInstant="2020-07-09T19:20:27.882Z" Version="2.0">
  <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://ima.test.our-domain.xxx/auth/realms/master</saml:Issuer>
  <dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    <dsig:SignedInfo>
      <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
      <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
      <dsig:Reference URI="#ID_ee6ef1f7-a269-443f-9942-1311b2c09636">
        <dsig:Transforms>
          <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
          <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        </dsig:Transforms>
        <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
        <dsig:DigestValue>nbeIwX97u+NNRf4KswI95oSmI2w=</dsig:DigestValue>
      </dsig:Reference>
    </dsig:SignedInfo>
    <dsig:SignatureValue>[...]</dsig:SignatureValue>
    <dsig:KeyInfo>
      <dsig:KeyName>[...]</dsig:KeyName>
      <dsig:X509Data>
        <dsig:X509Certificate>[...]</dsig:X509Certificate>
      </dsig:X509Data>
      <dsig:KeyValue>
        <dsig:RSAKeyValue>
          <dsig:Modulus>[...]</dsig:Modulus>
          <dsig:Exponent>AQAB</dsig:Exponent>
        </dsig:RSAKeyValue>
      </dsig:KeyValue>
    </dsig:KeyInfo>
  </dsig:Signature>
  <saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">test</saml:NameID>
  <samlp:SessionIndex>393fc3ab-6a18-4b8e-89a5-a005fc48f7cf::36a71dc0-22a0-4b72-be02-68639bedea06</samlp:SessionIndex>
</samlp:LogoutRequest>

*************************************************************************
logout_request.is_valid?           
true                                          
*************************************************************************
logout_request.name_id
test
*************************************************************************
session[saml_uid]
                                                                       
*************************************************************************

Qualcuno può aiutarci? Non sembra trattarsi di un problema di configurazione.

Grazie in anticipo

Max

Il nostro plugin non gestisce il valore di sessione saml_uid. Questo è gestito direttamente dal gem omniauth-saml. Quindi non sono sicuro del motivo per cui hai un valore vuoto in session["saml_uid"]. Potrebbe essere necessario segnalare il problema nel gem omniauth.

Inoltre, nessuno dei clienti ha ancora segnalato problemi relativi alla SLO.

Ho notato lo stesso problema:

  • Due applicazioni (Discourse e un’altra, chiamiamola X) collegate a Keycloak tramite SAML.
  • Effettuando il logout su Discourse, l’utente viene disconnesso anche da X e non può più eseguire alcuna azione.
  • Effettuando il logout su X, la sessione su Keycloak viene eliminata, ma l’utente rimane connesso su Discourse.

Persino un ricaricamento della pagina nel browser su Discourse non verifica che l’autenticazione SAML sia stata revocata (cioè che l’utente sia disconnesso).

Mi aspetterei che l’utente venga disconnesso anche da Discourse.
Discourse verifica lo stato dell’autenticazione SAML su Keycloak?
Quando lo fa?

Sarebbe possibile verificare se la sessione SAML è ancora attiva? Vedi la risposta sopra @vinothkannans