Discourse-saml: لا يُلغي SLO الجلسة

مرحباً،

لدينا الإعداد التالي:
Discourse الرسمي 2.5.0 ([ 3f7658cc6e ]) مع إضافة discourse-saml (الإصدار 230a58b)،
Keycloak (10.0.2) كمزود للهوية.

تم إعداد مزود الهوية لدينا لاستخدام عنوان URL https://discourse.our-domain.xxx/auth/saml/slo كعنوان URL لربط خدمة تسجيل الخروج عبر POST. تعمل عملية تسجيل الدخول لدينا بشكل مثالي. عند استخدام زر تسجيل الخروج في Discourse، يتم إلغاء جلسة مزود الهوية (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]
                                                                       
*************************************************************************

هل يمكن لأي شخص مساعدتنا؟ لا يبدو الأمر وكأنه مشكلة في الإعدادات بالنسبة لنا.

شكراً مقدماً

ماكس

نحن لا نتعامل مع قيمة جلسة saml_uid في إضافة البرنامج الخاصة بنا. يتم التعامل معها بواسطة مكتبة omniauth-saml نفسها. لذا، لا أعرف السبب في وجود قيمة فارغة في session["saml_uid"]. قد تحتاج إلى الإبلاغ عن المشكلة في مكتبة omniauth.

أيضًا، لم يبلغ أي من العملاء عن مشكلة في SLO حتى الآن.

إعجاب واحد (1)

لقد لاحظت نفس الشيء:

  • تطبيقان (Discourse وتطبيق آخر، لنسمّه X) متصلان بـ Keycloak عبر SAML.
  • عند تسجيل الخروج من Discourse، يتم تسجيل المستخدم خارجًا من X أيضًا ولا يمكنه القيام بأي شيء هناك.
  • عند تسجيل الخروج من X، تختفي الجلسة في Keycloak، لكن المستخدم يظل متصلاً في Discourse.

حتى إعادة تحميل صفحة المتصفح في Discourse لا تتحقق من زوال مصادقة SAML (= تسجيل خروج المستخدم).

أتوقع أن يتم تسجيل خروج المستخدم من Discourse أيضًا.
هل يتحقق Discourse من مصادقة SAML في Keycloak؟
متى يقوم بذلك؟

هل من الممكن التحقق مما إذا كانت جلسة SAML لا تزال نشطة؟ راجع الإجابة أعلاه @vinothkannans