Discourse-saml: SLO beendet die Sitzung nicht

Hallo,

wir haben folgendes Setup:
Offizielles Discourse 2.5.0 ([ 3f7658cc6e ]) mit dem discourse-saml-Plugin (Commit 230a58b),
Keycloak (10.0.2) als Identity Provider.

Unser Identity Provider ist so konfiguriert, dass er die URL https://discourse.our-domain.xxx/auth/saml/slo als URL für die Logout-Service-POST-Bindung verwendet. Unser Anmeldeprozess funktioniert einwandfrei. Durch Klicken auf den Abmeldebutton in Discourse wird auch unsere IdP-Sitzung beendet.

Das Problem tritt auf, wenn die Abmeldefunktionalität des IdP verwendet wird. Discourse beendet die Sitzung nicht. Das Forum empfängt die Anfrage, scheint sie jedoch nicht ordnungsgemäß zu verarbeiten. Der Benutzer bleibt angemeldet, und wir erhalten einen Fehler im Discourse-Log.

Der Benutzername für die folgenden Logs lautet 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'

Die if-Bedingung, die zur Ausnahme führt, sieht wie folgt aus (saml.rb):

if logout_request.is_valid? &&
     logout_request.name_id == session["saml_uid"]
Code für Debug-Ausgabe
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 '*************************************************************************'

Wir haben die Debug-Ausgabe in der saml.rb (Zeile 181) hinzugefügt und folgende Werte erhalten:

*************************************************************************
raw_request:
raw request (mit Base64 decodiert)
<?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]
                                                                       
*************************************************************************

Kann uns jemand helfen? Für uns sieht es nicht nach einem Konfigurationsproblem aus.

Vielen Dank im Voraus

Max

Unser Plugin verarbeitet den Sitzungswert saml_uid nicht. Dieser wird vom omniauth-saml-Gem selbst verarbeitet. Daher bin ich mir nicht sicher, warum Sie einen leeren Wert in session["saml_uid"] haben. Möglicherweise müssen Sie das Problem im omniauth-Gem melden.

Außerdem hat bisher kein Kunde ein Problem mit SLO gemeldet.

Ich habe dasselbe festgestellt:

  • 2 Anwendungen (Discourse und eine andere, nennen wir sie X), die über SAML mit Keycloak verbunden sind.
  • Abmeldung bei Discourse: Der Benutzer wird auch bei X abgemeldet und kann dort nichts mehr tun.
  • Abmeldung bei X: Die Sitzung bei Keycloak ist beendet, aber der Benutzer bleibt bei Discourse angemeldet.

Selbst ein Neuladen der Browserseite bei Discourse überprüft nicht, ob die SAML-Authentifizierung entfallen ist (= Benutzer ist abgemeldet).

Ich würde erwarten, dass der Benutzer auch bei Discourse abgemeldet wird.
Überprüft Discourse die SAML-Authentifizierung bei Keycloak?
Wann geschieht das?

Wäre es möglich zu prüfen, ob die SAML-Sitzung noch aktiv ist? Siehe Antwort oben @vinothkannans