SAMLで認証すると、ハッシュ化されたユーザー名とメールアドレスが提供されます

こんにちは、

Discourse のインストール環境において、ユーザー認証を大学の SAML を通じて行うことを希望しています。

Discourse の Docker 版と SAML プラグインを使用しています。このプラグインの GitHub サイトにある手順に従って試みました。

以下のフォームが表示されるまで、すべて正常に動作しています:


通常、メールアドレスが表示されるはずの場所に、16 進数値が表示されています。これはメールアドレスのハッシュ形式だと推測されますが、これらの値では認証プロセスを継続できません。

この件についてのご助言をいただければ幸いです!

よろしくお願いいたします、
ロナルド

こんにちは、ロナルドさん :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 がメールアドレスとユーザー名のハッシュを送信していることがはっきりとわかります。

SAML のフィールドを Discourse のフィールドにマッピングする設定があると思うので、Discourse 側で何か変更を加えて修正できる可能性があります。

さらに調査を進めた結果、登録フォーム内の「hashed」コードは、実際には IdP から送信される NameID であることが分かりました。また、IdP 側の SAML 設定において、以下の属性を有効化しました。

  • 表示名: urn:mace:dir:attribute-def:displayName
  • フルネーム: urn:mace:dir:attribute-def:cn
  • メールアドレス: urn:mace:dir:attribute-def:mail
  • ユーザー ID: 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: