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