Versuch, automatisch Konten zu erstellen, wenn das SAML-Plugin verwendet wird

Fortsetzung der Diskussion aus SAML-Plugin im Repository. Multisite:

Ich versuche, den folgenden Code im SAML-Plugin zu verwenden, um automatisch ein Konto zu erstellen, nachdem ein Benutzer erfolgreich authentifiziert wurde, damit Benutzer nicht mit dem Anmelde-Dialog konfrontiert werden, in dem sie theoretisch ihre E-Mail-Adresse, ihren Benutzernamen und ihren Namen ändern könnten. Ich bevorzuge es, dass Benutzer keine Kontrolle über diese Einstellungen haben und diese stattdessen automatisch basierend auf der SAML-Authentifizierung festgelegt werden.

Meine app.yml-Datei enthält:

  ...
  # Erzwingt das Attribut fullName aus der SAML-Bestätigung, um das Attribut name zu überschreiben, damit
  # der vollständige Name des Benutzers dem Namensfeld von Discourse zugeordnet wird und dazu beiträgt,
  # das numerische Benutzername-Feld in Beiträgen zu ergänzen.
  DISCOURSE_SAML_ATTRIBUTE_STATEMENTS: "name:fullName"

  DISCOURSE_SAML_AUTO_CREATE_ACCOUNT: true
  ...

Beim Testen dieser Funktion sehe ich folgenden Fehler in den Protokollen:

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"

Haben Sie eine Idee, ob ich das Plugin konfigurieren muss, um festzulegen, dass „uid" über eines der Attribute aus der SAML-Bestätigung gesetzt wird?

Wenn DISCOURSE_SAML_AUTO_CREATE_ACCOUNT entweder auf false gesetzt ist oder nicht vorhanden ist, funktioniert die SAML-basierte Authentifizierung, aber der Benutzer sieht den Dialog, in dem er seine E-Mail-Adresse, seinen Benutzernamen und seinen Namen ändern kann.

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