Tentative de création automatique de comptes lors de l'utilisation du plugin SAML

Suite à la discussion sur le plugin SAML dans le dépôt. Multisite :

Je tente d’utiliser le code suivant dans le plugin SAML pour créer automatiquement un compte après qu’un utilisateur a été authentifié avec succès, afin que les utilisateurs ne soient pas confrontés à la boîte de dialogue de connexion où ils pourraient éventuellement modifier leur adresse e-mail, leur nom d’utilisateur et leur nom. Je préfère que les utilisateurs n’aient pas le contrôle de ces paramètres et qu’ils soient définis automatiquement en fonction de l’authentification SAML.

Mon fichier app.yml contient :

  ...
  # Forcer l'attribut fullName depuis l'assertion SAML pour remplacer l'attribut name afin que
  # le nom complet de l'utilisateur soit mappé au champ Nom de Discourse et aide à
  # enrichir le champ Nom d'utilisateur numérique dans les publications.
  DISCOURSE_SAML_ATTRIBUTE_STATEMENTS: "name:fullName"

  DISCOURSE_SAML_AUTO_CREATE_ACCOUNT: true
  ...

Lorsque je teste cette fonctionnalité, je vois l’erreur suivante dans les journaux :

Terminé avec une erreur 500 Internal Server Error en 175 ms (ActiveRecord: 0,0 ms)
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERREUR : la valeur NULL dans la colonne "uid" viole la contrainte not-null
DÉTAIL : La ligne échouée contient (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'
Échec de la gestion de l'exception dans le middleware de l'application d'exception : PG::NotNullViolation: ERREUR : la valeur NULL dans la colonne "uid" viole la contrainte not-null
DÉTAIL : La ligne échouée contient (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"

Avez-vous une idée de savoir si je dois configurer le plugin pour forcer la définition de “uid” via l’un des attributs de l’assertion SAML ?

Lorsque DISCOURSE_SAML_AUTO_CREATE_ACCOUNT est défini sur false ou est absent, l’authentification basée sur SAML fonctionne, mais l’utilisateur voit la boîte de dialogue dans laquelle il peut modifier son adresse e-mail, son nom d’utilisateur et son nom.

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