Discourse-saml : SLO ne met pas fin à la session

Bonjour,

nous avons la configuration suivante :
Discourse officiel 2.5.0 ([ 3f7658cc6e ]) avec le plugin discourse-saml (commit 230a58b),
Keycloak (10.0.2) en tant que fournisseur d’identité (IdP)

Notre fournisseur d’identité est configuré pour utiliser l’URL https://discourse.our-domain.xxx/auth/saml/slo comme URL de liaison POST pour le service de déconnexion. Notre processus de connexion fonctionne parfaitement. L’utilisation du bouton de déconnexion dans Discourse annule également notre session IdP.

Le problème survient lors de l’utilisation de la fonctionnalité de déconnexion de l’IdP. Discourse n’annule pas la session. Le forum reçoit la demande, mais ne semble pas la traiter correctement. L’utilisateur reste connecté et nous obtenons une erreur dans le journal de Discourse.

Le nom d’utilisateur pour les journaux suivants est 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 condition if menant à l’exception est la suivante (saml.rb) :

if logout_request.is_valid? &&
     logout_request.name_id == session["saml_uid"]
code pour le débogage
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 '*************************************************************************'

Nous avons ajouté la sortie de débogage dans saml.rb (ligne 181) et obtenu les valeurs suivantes :

*************************************************************************
raw_request:
requête brute (décodée en 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]
                                                                       
*************************************************************************

Quelqu’un peut-il nous aider ? Cela ne semble pas être un problème de configuration de notre côté.

Merci d’avance

Max

Nous ne gérons pas la valeur de session saml_uid dans notre plugin. Elle est gérée par le gem omniauth-saml lui-même. Je ne suis donc pas certain de savoir pourquoi vous avez une valeur vide dans session["saml_uid"]. Vous devrez peut-être signaler le problème sur le dépôt du gem omniauth.

Par ailleurs, aucun client n’a encore signalé de problème concernant la déconnexion unique (SLO).

1 « J'aime »

J’ai constaté la même chose :

  • Deux applications (Discourse et une autre, appelons-la X) connectées à Keycloak via SAML.
  • Déconnexion sur Discourse. L’utilisateur est également déconnecté de X et ne peut plus rien y faire.
  • Déconnexion sur X. La session sur Keycloak a disparu, mais l’utilisateur reste connecté sur Discourse.

Même un rechargement de la page dans le navigateur sur Discourse ne vérifie pas que l’authentification SAML a disparu (= que l’utilisateur est déconnecté).

Je m’attendrais à ce que l’utilisateur soit également déconnecté sur Discourse.
Discourse vérifie-t-il l’authentification SAML sur Keycloak ?
Quand le fait-il ?

Serait-il possible de vérifier si la session SAML est toujours active ? Voir la réponse ci-dessus @vinothkannans