SAML プラグイン使用時のアカウント自動作成の試行

SAML plugin in repo. Multisite の議論の続きです:

SAML プラグイン内の以下のコードを使用して、ユーザーが正常に認証された後に自動的にアカウントを作成しようとしています。これにより、ユーザーがメールアドレス、ユーザー名、名前を変更できる可能性のあるログインダイアログに表示されることを防ぎたいと考えています。ユーザーにはこれらの設定を制御させず、SAML 認証に基づいて自動的に設定されるようにしたいです。

私の app.yml ファイルには以下が含まれています:

  ...
  # SAML アサートから fullName 属性を強制し、name 属性を上書きします。
  # これにより、ユーザーのフルネームが Discourse の Name フィールドにマッピングされ、
  # ポストの数値 User Name フィールドを補完するのに役立ちます。
  DISCOURSE_SAML_ATTRIBUTE_STATEMENTS: "name:fullName"

  DISCOURSE_SAML_AUTO_CREATE_ACCOUNT: true
  ...

この機能をテストしたところ、ログに以下のエラーが表示されました:

Completed 500 Internal Server Error in 175ms (ActiveRecord: 0.0ms)
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR:  null value in column "uid" violates not-null constraint
DETAIL:  Failing row contains (2, 3, null, saml, user@company.com, Smith, John, 2019-06-03 21:40:55.44066, 2019-06-03 21:40:55.44066).
: INSERT INTO "oauth2_user_infos" ("user_id", "provider", "email", "name", "created_at", "updated_at") VALUES (3, 'saml', 'user@company.com', 'Smith, John', '2019-06-03 21:40:55.440660', '2019-06-03 21:40:55.440660') RETURNING "id")
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.0.2/lib/patches/db/pg.rb:69:in `async_exec_params'
Failed to handle exception in exception app middleware : PG::NotNullViolation: ERROR:  null value in column "uid" violates not-null constraint
DETAIL:  Failing row contains (2, 3, null, saml, user@company.com, Smith, John, 2019-06-03 21:40:55.44066, 2019-06-03 21:40:55.44066).
: INSERT INTO "oauth2_user_infos" ("user_id", "provider", "email", "name", "created_at", "updated_at") VALUES (3, 'saml','user@company.com', 'Smith, John', '2019-06-03 21:40:55.440660', '2019-06-03 21:40:55.440660') RETURNING "id"

SAML アサートのいずれかの属性を通じて “uid” を強制的に設定するようプラグインを構成する必要があるかどうか、ご存知でしょうか?

DISCOURSE_SAML_AUTO_CREATE_ACCOUNTfalse に設定されている場合、または存在しない場合、SAML ベースの認証は機能しますが、ユーザーはメールアドレス、ユーザー名、名前を変更できるダイアログが表示されます。

Problem has been solved. We had inadvertently had removed from the ADFS IdP configuration the “nameid” from the SAML response. Once we added that back in, the auto create account feature worked fine!

With both the create account option set to true and the other settings shown below in our app.yml, we’re able to avoid having both login dialog windows being displayed. Now new users just click “Login”, authenticate via the IdP and then are put into their new Discourse account all without being able to override username, name and email address in an intervening dialog.

Once a user gets into Discourse, they cannot edit their email address, but we are allowing them to change their username so that they can have a more recognizable “nickname” in @ mentions and such.

  ...
  # Force fullName attribute from SAML assertion to override name attribute so that
  # the user's full name will be mapped to Discourse's Name field and will help
  # augment the numeric User Name field on posts.
  DISCOURSE_SAML_ATTRIBUTE_STATEMENTS: "name:fullName"

  DISCOURSE_SAML_AUTO_CREATE_ACCOUNT: true
  ...
  - exec: rails r "SiteSetting.login_required=true"
  - exec: rails r "SiteSetting.enable_local_logins=false"

  - exec: rails r "SiteSetting.email_editable=false"

  - exec: rails r "SiteSetting.display_name_on_posts=true"
  - exec: rails r "SiteSetting.prioritize_username_in_ux=true"
  ...