المصادقة باستخدام SAML تعطي اسم مستخدم وبريد إلكتروني مشفرين

مرحبًا،

أرغب في مصادقة مستخدمين تثبيتي من Discourse باستخدام نظام SAML الخاص بجامعتنا.

أستخدم إصدار Discourse المعتمد على Docker مع إضافة SAML. لقد حاولت اتباع الإرشادات الموجودة على موقع GitHub الخاص بهذه الإضافة.

كل شيء يعمل بشكل جيد حتى ظهور النموذج التالي:

حيث كنت أتوقع رؤية عنوان بريد إلكتروني عادي، أرى الآن قيمة سداسية عشرية أفترض أنها صيغة تجزئة (hash) لعنوان البريد الإلكتروني. لا يمكنني إكمال عملية المصادقة باستخدام هذه القيم.

أي مساعدة في هذا الصدد ستكون موضع تقدير كبير!

مع أطيب التحيات،
رونالد

مرحبًا رونالد :slight_smile: :wave: يسعدنا حقًا رؤية المزيد والمزيد من الجامعات تنضم إلى عائلة Discourse :smiley:

لديك قضية مثيرة للاهتمام جدًا! مهاراتي في SAML/SSO ليست قوية، لذا لست متأكدًا مما يحدث هنا، لكن هل يمكنك تجربة تمكين إعداد الموقع verbose sso logging؟ سيساعد ذلك في إظهار بعض الأخطاء المفيدة في /logs، وربما يوضح سبب حصولك على هذه المشكلة، أو يخبرك بشيء أكثر تحديدًا يمكنك مشاركته هنا، مما سيسمح لنا بمساعدتك بشكل أفضل.

تخميني (وعملي مع SAML محدود، أعتقد أنني ساعدت شخصًا واحدًا فقط في تكوينه) هو أن المشكلة تكمن في جانب SAML. إما أنه مُهيأ لإرسال التجزئة، أو أنك تستخدم حقلًا خاطئًا بطريقة ما.

شكرًا جزيلاً على ردك السريع!

بعد تعيين سجلات SSO إلى وضع verbose، إليك ما وجدته في production.log:

Started GET "/session/csrf" for <IP> at 2020-07-24 14:32:51 +0000
Processing by SessionController#csrf as JSON
Completed 200 OK in 1ms (Views: 0.1ms | ActiveRecord: 0.0ms | Allocations: 321)
Started POST "/auth/saml" for <IP> at 2020-07-24 14:32:51 +0000
(saml) Request phase initiated.
Started POST "/auth/saml/callback" for <IP> at 2020-07-24 14:33:23 +0000
(saml) Callback phase initiated.
Processing by Users::OmniauthCallbacksController#complete as HTML
  Parameters: {"SAMLResponse"=>"<SNIP>", "provider"=>"saml"}
Redirected to https://discourse-imphys.tudelft.nl/
Completed 302 Found in 24ms (ActiveRecord: 0.0ms | Allocations: 10562)
Started GET "/" for <IP> at 2020-07-24 14:33:24 +0000
Processing by ListController#latest as HTML
  Rendering list/list.erb within layouts/application
  Rendered list/list.erb within layouts/application (Duration: 3.8ms | Allocations: 1991)
  Rendered layouts/_head.html.erb (Duration: 1.9ms | Allocations: 911)
  Rendered common/_discourse_stylesheet.html.erb (Duration: 0.4ms | Allocations: 267)
  Rendered application/_header.html.erb (Duration: 2.2ms | Allocations: 1022)
Completed 200 OK in 34ms (Views: 13.1ms | ActiveRecord: 0.0ms | Allocations: 15963)
Started GET "/u/hp.json" for <IP> at 2020-07-24 14:33:24 +0000
Processing by UsersController#get_honeypot_value as JSON
Completed 200 OK in 2ms (Views: 0.2ms | ActiveRecord: 0.0ms | Allocations: 812)
Started GET "/u/check_username?username=&email=94422472fbfb32fdd22eaa2f88c723fb44be9958" for <IP> at 2020-07-24 14:33:25 +0000
Processing by UsersController#check_username as JSON
  Parameters: {"username"=>"", "email"=>"94422472fbfb32fdd22eaa2f88c723fb44be9958"}
Completed 200 OK in 1ms (Views: 0.2ms | ActiveRecord: 0.0ms | Allocations: 316)
Started GET "/u/check_username?username=94422472fbfb32fdd22e&email=94422472fbfb32fdd22eaa2f88c723fb44be9958" for <IP> at 2020-07-24 14:33:25 +0000
Processing by UsersController#check_username as JSON
  Parameters: {"username"=>"94422472fbfb32fdd22e", "email"=>"94422472fbfb32fdd22eaa2f88c723fb44be9958"}
Completed 200 OK in 3ms (Views: 0.2ms | ActiveRecord: 0.0ms | Allocations: 1421)

لقد استبدلت الشهادة بـ <SNIP> وعنوان IP الخاص بي بـ <IP>.

شكرًا لك على الرد السريع!

قد يكون هذا هو الحال أيضًا! سأتواصل مع مُصدر SAML وأبلغه بخصوص التجزئة…

نعم! يمكنك بوضوح رؤية أن SAML يرسل تجزئة (hash) للبريد الإلكتروني واسم المستخدم.

أعتقد أن هناك إعدادًا ما تقوم فيه بربط حقول SAML بحقول Discourse، لذا فمن الممكن أن يكون هناك شيء يمكنك تغييره في جانب Discourse لحل المشكلة.

بعد إجراء المزيد من البحث، اكتشفت أن الرمز ‘المشفّر’ في نموذج التسجيل هو في الواقع NameID الذي يرسله مزود الهوية (IdP). في إعدادات SAML على مزود الهوية، قمت أيضًا بتفعيل السمات التالية:

  • الاسم المعروض: urn:mace:dir:attribute-def:displayName
  • الاسم الكامل: urn:mace:dir:attribute-def:cn
  • عنوان البريد الإلكتروني: urn:mace:dir:attribute-def:mail
  • معرف المستخدم: urn:mace:dir:attribute-def:uid

أكد طرف ثالث أن هذه السمات تُرسل فعليًا من قبل مزود الهوية. ولكن لسبب ما، لا تُستخدم قيم هذه السمات في نموذج التسجيل في Discourse (كما هو موضح سابقًا). افترضت أنه في النموذج:

  • يجب أن يحتوي حقل البريد الإلكتروني على قيمة urn:mace:dir:attribute-def:mail؛
  • يجب أن يحتوي حقل اسم المستخدم على قيمة urn:mace:dir:attribute-def:mail؛
  • ويجب أن يحتوي حقل الاسم إما على قيمة urn:mace:dir:attribute-def:displayName (يفضل ذلك) أو urn:mace:dir:attribute-def:cn.

هل توجد طريقة يمكنني من خلالها تكوين Discourse-SAML لربط هذه السمات بشكل صحيح؟

مرحباً @ronligt، هل هناك أي نجاح في تعيين السمات الصحيحة عبر إعدادات discourse-saml؟

لقد كنت أحاول استخدام هذا الإعداد في المكون الإضافي ولكن لم أوفق حتى الآن:

أتمنى لك يوماً سعيداً! :slight_smile: