Tentativo di creazione automatica degli account utilizzando il plugin SAML

Continuiamo la discussione da SAML plugin in repo. Multisite:

Sto cercando di utilizzare il seguente codice nel plugin SAML per creare automaticamente un account dopo che un utente si è autenticato con successo, in modo che gli utenti non si trovino di fronte alla finestra di accesso in cui potrebbero teoricamente modificare la loro email, il nome utente e il nome. Preferirei che gli utenti non avessero il controllo su queste impostazioni, ma che venissero impostate automaticamente in base all’autenticazione SAML.

Il mio file app.yml contiene:

  ...
  # Forza l'attributo fullName dall'asserzione SAML per sovrascrivere l'attributo name in modo che
  # il nome completo dell'utente venga mappato nel campo Nome di Discourse e aiuti ad
  # arricchire il campo Nome Utente numerico nei post.
  DISCOURSE_SAML_ATTRIBUTE_STATEMENTS: "name:fullName"

  DISCOURSE_SAML_AUTO_CREATE_ACCOUNT: true
  ...

Quando provo questa funzionalità, vedo il seguente errore nei log:

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"

Qualcuno sa se devo configurare il plugin per forzare l’impostazione di “uid” tramite uno degli attributi dell’asserzione SAML?

Quando DISCOURSE_SAML_AUTO_CREATE_ACCOUNT è impostato su false o non è presente, l’autenticazione basata su SAML funziona, ma l’utente vede la finestra di dialogo in cui può modificare la propria email, il nome utente e il nome.

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"
  ...