你好,
我们目前的配置如下:
官方 Discourse 2.5.0 ([ 3f7658cc6e ]) 搭配 discourse-saml 插件(提交版本 230a58b),
Keycloak (10.0.2) 作为身份提供商(IdP)。
我们的身份提供商已配置为使用 URL https://discourse.our-domain.xxx/auth/saml/slo 作为登出服务 POST 绑定地址。我们的登录流程运行 flawless。使用 Discourse 中的登出按钮可以成功取消我们的 IdP 会话。
问题出现在使用 IdP 的登出功能时。Discourse 未能取消会话。论坛接收到了请求,但似乎未能正确处理。用户仍然保持登录状态,并且在 Discourse 日志中出现了错误。
以下日志中的用户名为 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'
导致该异常的 if 条件如下(saml.rb):
if logout_request.is_valid? &&
logout_request.name_id == session["saml_uid"]
调试输出代码
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 '*************************************************************************'
我们在 saml.rb 的第 181 行添加了调试输出,并获得了以下值:
*************************************************************************
raw_request:
原始请求(经 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]
*************************************************************************
有人能帮我们吗?这看起来不像是一个配置问题。
提前感谢
Max