Аутентификация через SAML возвращает хешированное имя пользователя и e-mail

Здравствуйте,

Я хотел бы настроить аутентификацию пользователей моей установки Discourse через SAML нашего университета.

Я использую версию Discourse в Docker с плагином SAML. Я пытался следовать инструкциям на GitHub-странице этого плагина.

Всё работает нормально, пока я не вижу следующую форму:


Вместо ожидаемого адреса электронной почты я вижу шестнадцатеричное значение, которое, как я предполагаю, представляет собой хэш адреса электронной почты. Я не могу продолжить процесс аутентификации с такими значениями.

Любая помощь по этой теме будет очень признательна!

С уважением,
Рональд

Привет, Рональд :slight_smile: :wave: очень рады видеть, что всё больше университетов присоединяется к семье Discourse :smiley:

У вас довольно интересная проблема! Мои знания в области SAML/SSO не очень глубоки, поэтому я не уверен, что именно происходит, но попробуйте включить настройку сайта verbose sso logging. Это поможет отобразить полезные ошибки на странице /logs и, возможно, объяснит причину вашей проблемы или укажет на что-то более конкретное, что вы сможете поделиться здесь, чтобы мы могли лучше помочь.

Мое предположение (и мой опыт работы с SAML ограничен: кажется, я лишь один раз помогал кому-то его настроить) состоит в том, что проблема на стороне SAML. Либо он настроен на отправку хеша, либо вы каким-то образом используете не то поле.

Спасибо большое за ваш быстрый ответ!

После включения подробного логирования SSO вот что я нашёл в 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 отправляет хэш электронной почты и имени пользователя.

Думаю, есть какая-то конфигурация, где вы сопоставляете поля SAML с полями Discourse, поэтому вполне вероятно, что можно что-то изменить на стороне Discourse, чтобы это исправить.

После дополнительного исследования я выяснил, что код ‘hashed’ в форме регистрации на самом деле является NameID, отправляемым IdP. В конфигурации SAML на стороне IdP я также включил следующие атрибуты:

  • Отображаемое имя: urn:mace:dir:attribute-def:displayName
  • Полное имя: urn:mace:dir:attribute-def:cn
  • Адрес электронной почты: urn:mace:dir:attribute-def:mail
  • Идентификатор пользователя: urn:mace:dir:attribute-def:uid

Сторонний источник подтвердил, что эти атрибуты действительно отправляются IdP. Однако по какой-то причине значения этих атрибутов не используются в форме регистрации Discourse (как показано ранее). Я предполагал, что в форме:

  • Поле Email будет содержать значение атрибута urn:mace:dir:attribute-def:mail;
  • Поле Username — значение атрибута urn:mace:dir:attribute-def:mail;
  • Поле Name — либо значение атрибута urn:mace:dir:attribute-def:displayName (предпочтительно), либо urn:mace:dir:attribute-def:cn.

Существует ли способ настроить Discourse-SAML для корректного сопоставления этих атрибутов?

Привет @ronligt, у вас что-то получилось с сопоставлением правильных атрибутов через конфигурацию discourse-saml?

Я пробовал использовать эту конфигурацию в плагине, но пока безрезультатно:

Удачного дня! :slight_smile: