Authagonal

Dokumentation

Alles, was Sie für den Einstieg in Authagonal benötigen — vom Erstellen Ihres ersten Mandanten bis zur Anbindung von SSO, SCIM und individuellem Branding.

Erste Schritte

Authagonal stellt jedem Mandanten einen vollständig standardkonformen OIDC-Server bereit. Jeder Mandant erhält seine eigene Issuer-URL, sein eigenes Discovery-Dokument und eigene Token-Endpunkte — keine gemeinsam genutzte Infrastruktur zwischen Mandanten. Sie können in unter 5 Minuten von null zu einem funktionierenden Anmeldefluss gelangen.

Mandant erstellen

Registrieren Sie sich auf authagonal.io und wählen Sie einen Slug für Ihren Mandanten. Der Slug wird Ihre Issuer-Domain: {slug}.authagonal.io. Nach der Kontoerstellung verifizieren Sie Ihre E-Mail-Adresse, um den Mandanten zu aktivieren.

Authagonal signup page showing tenant slug input and email verification

Wählen Sie bei der Registrierung einen eindeutigen Slug für Ihren Mandanten

Client registrieren

Navigieren Sie zu Clients in der Portal-Seitenleiste und klicken Sie auf Neuer Client. Geben Sie eine clientId und einen clientName für Ihre Anwendung ein. Fügen Sie dann auf der Registerkarte URIs des Clients mindestens eine Redirect-URI hinzu; dorthin werden Benutzer nach der Authentifizierung weitergeleitet. Beispiel: https://app.example.com/callback. Neue Clients verlangen standardmäßig ein Client-Secret; deaktivieren Sie daher für eine Browser-App ohne Backend Secret erforderlich auf der Registerkarte Allgemein.

New client form with Client ID and Client Name fields

Neuen OAuth-Client im Portal registrieren

Lokale Entwicklung

Verwenden Sie http://localhost:3000/callback als Redirect-URI für die lokale Entwicklung. Authagonal erlaubt nicht-HTTPS-Redirect-URIs für localhost-Ursprünge.

Ihre erste Anmeldung

Der schnellste Weg zur Integration ist mit oidc-client-ts, einer leichtgewichtigen OIDC-Client-Bibliothek für JavaScript- und TypeScript-Anwendungen.

oidc-client-ts integration
import { UserManager } from 'oidc-client-ts';

const mgr = new UserManager({
  authority: 'https://acme.authagonal.io',
  client_id: 'my-app',
  redirect_uri: 'https://app.example.com/callback',
  response_type: 'code',
  scope: 'openid profile email',
});

// Redirect to login
mgr.signinRedirect();

// On callback page
const user = await mgr.signinRedirectCallback();
console.log(user.profile); // { sub, email, name, ... }

Wenn Sie einen minimalen Ansatz ohne Bibliothek bevorzugen, können Sie den Standard-OAuth 2.0-Authorization-Code-Flow mit einfachem fetch verwenden:

Minimal fetch-based flow
// 1. Redirect the user to the authorization endpoint
const authorizeUrl = new URL('https://acme.authagonal.io/connect/authorize');
authorizeUrl.searchParams.set('client_id', 'my-app');
authorizeUrl.searchParams.set('redirect_uri', 'https://app.example.com/callback');
authorizeUrl.searchParams.set('response_type', 'code');
authorizeUrl.searchParams.set('scope', 'openid profile email');
authorizeUrl.searchParams.set('code_challenge', codeChallenge);
authorizeUrl.searchParams.set('code_challenge_method', 'S256');
window.location.href = authorizeUrl.toString();

// 2. On the callback page, exchange the code for tokens
const res = await fetch('https://acme.authagonal.io/connect/token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({
    grant_type: 'authorization_code',
    code: new URLSearchParams(window.location.search).get('code')!,
    redirect_uri: 'https://app.example.com/callback',
    client_id: 'my-app',
    code_verifier: codeVerifier,
  }),
});

const tokens = await res.json();
// tokens.id_token, tokens.access_token (refresh_token only when offline_access is requested and allowed)
Authagonal login page with email and password fields, branded with tenant logo

Die Standard-Anmeldeseite für Ihren Mandanten

Sandbox-Modus

Testen Sie Ihre Integration zuerst in einer Sandbox-Umgebung. Erstellen Sie eine unter Umgebungen im Portal: Jede Sandbox erhält eine eigene URL ({env}-{slug}.authagonal.io, z. B. test1-acme.authagonal.io) und kann jederzeit auf einen leeren Zustand zurückgesetzt werden, ohne Live-Benutzer zu beeinträchtigen.

Dashboard

Das Portal-Dashboard gibt Ihnen einen Echtzeit-Überblick über Ihren Mandanten. Es zeigt die wichtigsten Metriken — Benutzerwachstum, Authentifizierungsaktivität und schnelle Navigation zu allen Funktionen im Portal.

Übersicht

Oben im Dashboard sehen Sie eine Willkommensnachricht und einen Link Anmeldeseite öffnen zur gehosteten Anmeldung Ihres Mandanten. Unter den Statistikkarten verfolgt die Anzeige Monatlich aktive Nutzer die Nutzung im Verhältnis zum Limit Ihres Tarifs und verlinkt auf Ihre Tarifoptionen, sobald Sie 80 % überschreiten. Ein Diagramm Anmeldeaktivität und ein Feed Aktuelle Aktivität mit den neuesten Audit-Einträgen vervollständigen die Seite.

Full dashboard view showing the welcome banner, stat cards, monthly active users meter, and sign-in activity chart

Der Dashboard-Startbildschirm mit Statistikkarten und Anmeldeaktivität

Aktivitätsmetriken

Sechs Statistikkarten fassen Ihren Mandanten auf einen Blick zusammen:

  • Aktive Nutzer: die Gesamtzahl der Benutzer in Ihrem Mandanten
  • Anmeldungen (24h): erfolgreiche Anmeldungen in den letzten 24 Stunden
  • MFA registriert: der Prozentsatz der Benutzer mit registrierter MFA, mit der Anzahl der registrierten Benutzer und der Gesamtzahl
  • Fehlgeschlagene Versuche (24h): fehlgeschlagene Anmeldungen in den letzten 24 Stunden, etwa durch falsche Anmeldedaten, gesperrte Konten oder Richtlinienablehnungen
  • SCIM-Synchronisierung: Bereitstellungsaktivität von verbundenen IdPs, angezeigt als Inaktiv oder als Anzahl der Operationen
  • Monatliche Ausgaben: die bisherigen Ausgaben in diesem Monat, mit einer Prognose für das Monatsende

Die 24-Stunden-Karten vergleichen die letzten 24 Stunden mit den 24 Stunden davor. Das Diagramm Anmeldeaktivität zeigt erfolgreiche und fehlgeschlagene Anmeldungen pro Tag über 14, 30 oder 90 Tage. Das Dashboard aktualisiert sich jede Minute.

Six stat cards showing active users, sign-ins, MFA enrolment, failed attempts, SCIM sync, and monthly spend

Statistikkarten mit einer Zusammenfassung der letzten 24 Stunden

Schnellnavigation

Unterhalb der Metriken verlinken Navigationskarten direkt zu Clients, SSO, Benutzer, SCIM, Branding, Einstellungen, Abrechnung, Domains und Audit-Protokoll. Jede Karte zeigt eine kurze Beschreibung, damit sich neue Teammitglieder schnell orientieren können.

Clients

OAuth-Clients repräsentieren die Anwendungen, die Benutzer über Ihren Mandanten authentifizieren. Jeder Client hat seine eigene Konfiguration für Redirect-URIs, Geltungsbereiche, Grant-Typen, Token-Laufzeiten und MFA-Richtlinie.

Client-Liste

Die Clients-Seite zeigt eine Tabelle aller registrierten Clients. Jede Zeile zeigt die clientId, den Anzeigenamen, erlaubte Grant-Typen als farbige Badges und ob PKCE aktiviert ist. Klicken Sie auf eine Zeile, um den vollständigen Konfigurationseditor zu öffnen.

Clients table showing clientId, name, grant type badges, and PKCE status for each registered application

Client-Liste mit Grant-Type-Badges und PKCE-Indikatoren

Client erstellen

Klicken Sie auf Neuer Client, um eine neue Anwendung zu registrieren. Sie müssen zwei Felder angeben:

  • clientId — ein eindeutiger Bezeichner für den Client (z. B. my-spa)
  • clientName — ein lesbarer Anzeigename
New client form with Client ID and Client Name input fields

Neuen OAuth-Client registrieren

Client löschen

Um einen Client zu löschen, klicken Sie in der Client-Tabelle auf das Papierkorbsymbol in seiner Zeile und geben Sie zur Bestätigung die Client-ID ein. Der Client wird dauerhaft entfernt und kann keine Benutzer mehr anmelden oder Tokens erneuern. Bereits ausgestellte Access-Tokens werden nicht widerrufen und bleiben bis zu ihrem Ablauf gültig.

Client-Konfigurationsreferenz

Jeder Client verfügt über einen umfassenden Satz von Konfigurationsoptionen, die in fünf Registerkarten gegliedert sind: Allgemein, URIs, Scopes & Grants, Tokens und Sicherheit.

Allgemeine Einstellungen

EinstellungBeschreibungStandard
clientNameAnzeigename, der in Zustimmungsbildschirmen und im Portal angezeigt wird–
requirePkceProof Key for Code Exchange für Authorization-Code-Flows erforderlich machenAn
requireClientSecretClient-Secret für Token-Anfragen erforderlich machen (für öffentliche Clients wie SPAs deaktivieren)An
allowOfflineAccessDem Client erlauben, Refresh-Tokens über den offline_access-Scope anzufordernAus
alwaysIncludeUserClaimsInIdTokenProfil-, E-Mail-, Rollen- und Gruppen-Claims in das ID-Token aufnehmen, auch wenn die entsprechenden Geltungsbereiche nicht angefordert wurdenAus
includeGroupsInTokensDie Namen der SCIM-Gruppen des Benutzers als groups-Claim einschließen, in Tokens, die ausgestellt werden, wenn der Geltungsbereich groups angefordert wirdAus

PKCE-Sicherheit

Das Deaktivieren von PKCE verringert die Sicherheit für Authorization-Code-Flows. Deaktivieren Sie dies nur für ältere Clients, die PKCE nicht unterstützen. Alle modernen Anwendungen sollten PKCE aktiviert lassen.

URIs

URI-Felder verwenden eine Tag-Eingabe — geben Sie einen Wert ein und drücken Sie Enter oder Komma, um ihn hinzuzufügen. Klicken Sie auf das X eines Tags, um es zu entfernen.

EinstellungBeschreibung
redirectUrisErlaubte Callback-URLs nach der Authentifizierung. Müssen exakt mit dem redirect_uri-Parameter in Autorisierungsanfragen übereinstimmen.
postLogoutRedirectUrisErlaubte URLs für die Weiterleitung nach dem Logout.
allowedCorsOriginsErlaubte Origins für Cross-Origin-Anfragen an die Token- und UserInfo-Endpunkte.
URI configuration section showing tag inputs for redirect URIs, post-logout URIs, and CORS origins

Tag-Eingabefelder zur Konfiguration von URIs

Geltungsbereiche & Grant-Typen

EinstellungOptionen
allowedScopesopenid profile email offline_access phone roles groups
allowedGrantTypesauthorization_code client_credentials refresh_token urn:ietf:params:oauth:grant-type:device_code urn:ietf:params:oauth:grant-type:token-exchange

Token-Laufzeiten

EinstellungBeschreibungStandard
accessTokenLifetimeSecondsGültigkeitsdauer von Access-Tokens1800 (30 Min.)
identityTokenLifetimeSecondsGültigkeitsdauer von ID-Tokens300 (5 Min.)
authorizationCodeLifetimeSecondsGültigkeitsdauer von Authorization Codes für den Austausch300 (5 Min.)
absoluteRefreshTokenLifetimeSecondsMaximale Lebensdauer eines Refresh-Tokens unabhängig von der Aktivität2592000 (30 Tage)
slidingRefreshTokenLifetimeSecondsRefresh-Token-Ablauf wird bei jeder Verwendung zurückgesetzt, bis zur absoluten Lebensdauer1296000 (15 Tage)
Token lifetime configuration fields with numeric inputs for each lifetime setting

Token-Laufzeiten pro Client konfigurieren

Logout-URIs

Clients können sowohl Back-Channel- als auch Front-Channel-Logout-URIs registrieren. Beide sind optional — konfigurieren Sie das, was zu Ihrer Anwendung passt.

EinstellungBeschreibung
backChannelLogoutUriServer-zu-Server-POST mit einem signierten Logout-Token. Zuverlässig, auch wenn der Browser offline ist.
frontChannelLogoutUriWird in einem versteckten iframe beim Logout geladen, damit der Browser Cookies und Local Storage löscht.
frontChannelLogoutSessionRequiredWenn aktiviert, erhält die Logout-URL die Query-Parameter iss und sid, damit Ihre App den Logout mit der spezifischen Sitzung verknüpfen kann.

Beide kombinieren

Back-Channel stellt sicher, dass der Server benachrichtigt wird; Front-Channel löscht den Browser. Die meisten Apps profitieren davon, beide zu konfigurieren.

MFA-Richtlinie

Jeder Client hat eine eigene MFA-Richtlinie, die auf der Registerkarte <strong>Sicherheit</strong> des Clients festgelegt wird. Das MFA-Richtlinien-Dropdown bietet drei Optionen:

RichtlinieVerhalten
DeaktiviertMFA wird für diesen Client nie abgefragt
AktiviertBenutzer können sich optional für MFA registrieren; sie werden bei der Anmeldung aufgefordert, wenn registriert
ErforderlichAlle Benutzer müssen MFA abschließen, um sich über diesen Client zu authentifizieren
MFA policy dropdown showing Disabled, Enabled, and Required options on the client configuration page

Clientspezifische MFA-Richtlinie

Enterprise SSO

Enterprise SSO ermöglicht es Ihren Kunden, ihren eigenen Identity Provider mitzubringen. Authagonal unterstützt sowohl SAML 2.0- als auch OIDC-Federation mit domänbasiertem Routing, sodass Benutzer anhand ihrer E-Mail-Adresse automatisch zum richtigen IdP weitergeleitet werden.

SSO domain routing flow: shows how email domains are matched to SAML or OIDC identity providers

Domänbasiertes SSO-Routing

SAML 2.0-Verbindungen

Um eine SAML-Verbindung zu erstellen, navigieren Sie zur SSO-Seite und wählen Sie den SAML-Tab. Geben Sie Folgendes an:

FeldBeschreibung
connectionNameEin lesbarer Name für diese Verbindung (z. B. "Acme Corp Okta")
entityIdIhre SP-Entitäts-ID. Registrieren Sie genau diesen Wert bei Ihrem IdP als Identifier (Entitäts-ID) der Anwendung; Assertions müssen ihn als Audience angeben
metadataLocationURL zum SAML-Metadaten-XML-Dokument des IdP
metadataXmlEingefügte IdP-Metadaten-XML, für IdPs ohne Metadaten-URL (Google Workspace) oder mit einer aus dem Internet nicht erreichbaren URL. Geben Sie entweder dies oder metadataLocation an, nicht beides
nameIdFormatOptionales vom IdP angefordertes NameID-Format. Weglassen für den emailAddress-Standard, oder "none" setzen, um NameIDPolicy ganz wegzulassen (für ADFS empfohlen)
allowedDomainsE-Mail-Domains, die an diese Verbindung weitergeleitet werden (z. B. acme.com). Werden über die API gesetzt; das Portal zeigt sie auf der Verbindungskarte und auf der Registerkarte Domain-Routing an

Wenn Sie die Verbindung speichern, ruft Authagonal das Metadatendokument ab und importiert das Signaturzertifikat des IdP, die SSO-Endpunkt-URL und das Name-Identifier-Format. Die Metadaten werden regelmäßig aktualisiert, um Zertifikatsrotationen zu berücksichtigen.

SAML connection creation form with fields for connection name, SP entity ID, and IdP metadata

SAML 2.0 SSO-Verbindung erstellen

OIDC-Verbindungen

Um eine OIDC-Federation-Verbindung zu erstellen, wählen Sie den OIDC-Tab und geben Sie an:

FeldBeschreibung
connectionNameEin lesbarer Name für diese Verbindung
metadataLocationDie OpenID Connect Discovery-URL (z. B. https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration)
clientIdDie beim externen IdP für diese Federation registrierte Client-ID
clientSecretDas Client-Secret für die Registrierung beim externen IdP
allowedDomainsE-Mail-Domains, die an diese Verbindung weitergeleitet werden (z. B. acme.com). Werden über die API gesetzt; das Portal zeigt sie auf der Verbindungskarte und auf der Registerkarte Domain-Routing an
OIDC connection creation form with fields for connection name, discovery URL, client ID, and client secret

OIDC-Federation-Verbindung erstellen

Domain-Routing

Domain-Routing leitet Benutzer automatisch zum richtigen Identity Provider basierend auf ihrer E-Mail-Domain weiter. Wenn ein Benutzer seine E-Mail auf der Anmeldeseite eingibt, prüft Authagonal, ob der Domain-Teil (z. B. acme.com) mit den allowedDomains einer SSO-Verbindung übereinstimmt. Falls ja, wird der Benutzer nahtlos zum IdP seiner Organisation weitergeleitet.

E-Mail-DomainSSO-AnbieterProtokoll
acme.comAcme Corp OktaSAML 2.0
contoso.comContoso Azure ADOIDC
example.orgExample OneLoginSAML 2.0
Domain routing table showing email domains mapped to SSO connections with protocol type

Domain-Routing ordnet E-Mail-Domains Identity Providern zu

SP-initiierter Flow

Der SP-initiierte Flow ist der Standard — Benutzer starten auf Ihrer Anmeldeseite und werden automatisch zum richtigen IdP weitergeleitet. Benutzer können auch direkt zu einer bestimmten Verbindung verlinkt werden über /saml/{connectionId}/login oder /oidc/{connectionId}/login.

JIT-Bereitstellung

Wenn sich ein Benutzer zum ersten Mal über SSO anmeldet und noch nicht in Ihrem Mandanten existiert, kann Authagonal sein Konto automatisch erstellen (Just-In-Time-Bereitstellung). Die JIT-Bereitstellung ist standardmäßig deaktiviert: Aktivieren Sie sie pro Verbindung, indem Sie beim Erstellen der Verbindung JIT-Bereitstellung aktivieren ankreuzen.

Wenn die JIT-Bereitstellung deaktiviert ist, können sich nur Benutzer anmelden, die vorab bereitgestellt wurden — über SCIM, die Benutzerseite des Portals oder die API. Unbekannte Benutzer erhalten einen access_denied-Fehler und werden aufgefordert, ihren Administrator zu kontaktieren.

Einstellung pro Verbindung

Die JIT-Bereitstellung wird pro SSO-Verbindung gesteuert, nicht mandantenweit. Sie können eine Verbindung haben, die JIT erlaubt (z. B. für eine Partnerorganisation, die ihre eigenen Benutzer verwaltet) und eine andere, die Vorab-Bereitstellung erfordert (z. B. für einen Enterprise-Kunden mit SCIM-Synchronisation).

Vor dem Rollout testen

Testen Sie SSO-Verbindungen im Sandbox-Modus, bevor Sie sie für Produktionsbenutzer ausrollen. So können Sie die IdP-Konfiguration, das Attribut-Mapping und das Domain-Routing überprüfen, ohne Live-Authentifizierungsabläufe zu beeinträchtigen.

Auf Organisationen beschränkte Verbindungen

Eine Verbindung kann auch zu einer Organisation innerhalb Ihres Mandanten gehören statt zum gesamten Mandanten. Sie wird erst angeboten, wenn diese Organisation bereits aufgelöst wurde: durch eine darauf festgelegte eigene Domain, einen organization-Parameter im Anmeldelink oder einen Client, der für genau diese eine Organisation registriert ist. Auf einer mandantenweiten Anmeldeseite wird sie nie angeboten. Welche dieser Quellen gewinnt, wird in dieser Reihenfolge geprüft, die höchste zuerst.

Die Anmeldung begründet die Mitgliedschaft

Ein Benutzer, der sich über eine auf eine Organisation beschränkte Verbindung anmeldet, wird automatisch Mitglied dieser Organisation, genauso wie JIT-Bereitstellung sein Konto anlegt. Einen separaten Einladungsschritt gibt es nicht.

Die Eindeutigkeit von Domains gilt pro Geltungsbereich

Eine E-Mail-Domain kann einmal mandantenweit und unabhängig davon noch einmal innerhalb jeder Organisation beansprucht werden: acme.com kann auf eine mandantenweite Verbindung routen und zusätzlich, sobald eine Organisation bereits ausgewählt ist, auf die eigene Verbindung dieser Organisation. Nicht möglich ist, dass sie zu zwei Verbindungen im selben Geltungsbereich gehört. Authagonal lehnt das beim Speichern der Verbindung ab.

Benutzer

Die Benutzerseite ermöglicht es Ihnen, alle Endbenutzer in Ihrem Mandanten zu verwalten. Sie können nach Benutzern suchen, deren Details anzeigen, neue Benutzer einladen und sehen, wie jeder Benutzer bereitgestellt wurde.

Die Suchleiste findet eine exakte Benutzer-ID oder E-Mail-Adresse oder ein Präfix der E-Mail-Adresse, des Vornamens oder des Nachnamens, und die Filter Alle, Aktiv und Inaktiv schränken die Liste nach Status ein. Die Suche ist mit 300ms Verzögerung entprellt, sodass Ergebnisse während der Eingabe aktualisiert werden, ohne die API zu überlasten. Ergebnisse werden mit 50 Benutzern pro Seite paginiert; verwenden Sie die Navigationssteuerungen am Ende der Tabelle, um zwischen Seiten zu wechseln.

Benutzertabelle

Die Benutzertabelle zeigt die folgenden Spalten für jeden Benutzer:

SpalteBeschreibung
BenutzerDer Name des Benutzers (oder die E-Mail-Adresse, wenn kein Name gesetzt ist), darunter seine E-Mail-Adresse und ein Badge Nicht verifiziert, bis die E-Mail bestätigt ist
StatusActive oder Inactive — gibt an, ob das Konto aktiviert ist
QuelleSCIM oder Local — wie der Benutzer erstellt wurde
RollenDie dem Benutzer zugewiesenen Rollen
MFAEnabled wenn Multi-Faktor-Authentifizierung registriert ist, andernfalls ein Strich
ErstelltDas Datum, an dem das Benutzerkonto erstellt wurde
User list table with columns for user, status, source, roles, MFA, and created date

Die Benutzerliste mit Suchleiste und Seitenumbruch

Benutzer einladen

Klicken Sie auf Benutzer einladen, um jemanden in Ihren Mandanten einzuladen. Die Person erhält eine E-Mail, um ihr eigenes Passwort festzulegen. Das Formular umfasst:

FeldBeschreibung
emailDie E-Mail-Adresse des Benutzers (muss innerhalb des Mandanten eindeutig sein)
firstNameDer Vorname des Benutzers
lastNameDer Nachname des Benutzers
localeBevorzugte Sprache. Legt die UI- und E-Mail-Sprache des Benutzers fest; optional, Fallback auf Englisch.
organizationIdOptionale Organisation, der der Benutzer hinzugefügt wird, mit seinen Rollen darin. Wird angezeigt, wenn Ihr Mandant Organisationen hat
Invite user form with email, first name, last name, and Language fields

Einen neuen Benutzer einladen

SCIM-bereitgestellte Benutzer

Über SCIM erstellte Benutzer sind in der Spalte Quelle mit einem "SCIM"-Badge gekennzeichnet. Ihr Lebenszyklus (Erstellung, Aktualisierungen und Deaktivierung) wird vom vorgelagerten Identity Provider verwaltet.

Bevorzugte Sprache

Jeder Benutzer hat eine bevorzugte Sprache, die sowohl seine gehostete UI als auch die von Authagonal gesendeten Transaktions-E-Mails (Verifizierung, Passwort-Reset, Willkommen und mehr) steuert. Sie können sie beim Einladen eines Benutzers festlegen und jederzeit auf der Detailseite des Benutzers ändern. Ist keine bevorzugte Sprache gesetzt, fällt Authagonal auf Englisch zurück. Der Auswahldialog bietet alle unterstützten Sprachen: Englisch, Chinesisch (vereinfacht), Deutsch, Französisch, Spanisch, Vietnamesisch, Portugiesisch, Japanisch, Arabisch, Hindi und Afrikaans.

User detail edit form with profile fields including a preferred Language selector

Bevorzugte Sprache eines Benutzers auf der Detailseite festlegen

Benutzerdetails

Klicken Sie auf eine Zeile in der Benutzerliste, um die Detailseite zu öffnen. Dort können Sie Profildaten bearbeiten, Rollen verwalten, MFA zurücksetzen, benutzerdefinierte Attribute überprüfen und den Benutzer löschen.

User detail page showing profile fields, status, assigned roles, and custom attributes

Profil

Bearbeiten Sie E-Mail, Vor-/Nachname, Telefon, Unternehmen, Sprache, externe ID und den Aktiv-Status des Benutzers. Das Ändern der E-Mail-Adresse oder des Bestätigungsstatus der E-Mail erfordert einen Admin oder Owner. E-Mail-Änderungen müssen innerhalb des Mandanten eindeutig bleiben; die API gibt email_already_in_use zurück, wenn die Adresse belegt ist.

Rollen

Weisen Sie Rollen zu, die auf der Seite Rollen definiert sind, oder entfernen Sie sie. Zugewiesene Rollen werden als roles-Claim in ID- und Access-Tokens ausgegeben, wenn der Client den Geltungsbereich roles anfordert.

Multi-Faktor-Authentifizierung

Sehen Sie alle für den Benutzer registrierten MFA-Zugangsdaten (Authenticator-App (TOTP), WebAuthn/Passkeys und Wiederherstellungscodes), jeweils mit Registrierungs- und Letzter-Nutzung-Zeitstempeln. Entfernen Sie einzelne Zugangsdaten oder setzen Sie alle MFA zurück; beides erfordert einen Admin oder Owner. Zurücksetzen zwingt den Benutzer, sich bei der nächsten Anmeldung neu zu registrieren.

Benutzerdefinierte Attribute

Beliebige Schlüssel-Wert-Daten, die dem Benutzer zugeordnet sind. Schlüssel müssen eindeutig sein. Attribute sind über die Benutzerprofil-API und SCIM verfügbar und können durch Konfiguration der userClaims eines benutzerdefinierten Scopes auf Access-Token-Claims abgebildet werden.

Organisation

Die Organisation, zu der dieser Benutzer gehört. Es handelt sich um einen frei wählbaren eigenen Bezeichner, der als org_id-Claim in seinen Tokens und über /connect/userinfo im Scope profile ausgegeben wird. Authagonal leitet ihn niemals selbst ab: Er wird von Ihrer Bereitstellungsanwendung, vom SCIM-Token, der den Benutzer angelegt hat, oder hier von Hand gesetzt.

Der Link neben dem Feld listet alle auf, die denselben Wert teilen, und derselbe Filter steht über die API als GET /api/v1/users?organizationId= zur Verfügung. So beantworten Sie, wer zu einem bestimmten Kunden gehört, ohne das gesamte Verzeichnis durchzublättern.

Benutzer löschen

Entfernt den Benutzer und alle seine MFA-Zugangsdaten dauerhaft. Geben Sie die E-Mail des Benutzers zur Bestätigung ein — es gibt kein Rückgängigmachen.

Gruppen

Gruppen ermöglichen es Ihnen, Benutzer zu organisieren und Gruppenmitgliedschaften in Tokens aufzunehmen. Gruppen können manuell im Portal erstellt oder automatisch über SCIM von einem externen Identity Provider bereitgestellt werden.

Gruppenliste

Gruppen werden auf der Registerkarte Gruppen der SCIM-Seite mit den folgenden Informationen aufgelistet:

SpalteBeschreibung
GruppennameDer Anzeigename der Gruppe
MitgliederDie Anzahl der Benutzer, die derzeit in der Gruppe sind
QuelleSCIM oder Manual — wie die Gruppe erstellt wurde
ErstelltDas Datum, an dem die Gruppe erstellt wurde
Groups list table showing group name, member count, source badge, granted roles, and created date

Gruppenliste mit Quellindikatoren

Gruppe erstellen

Klicken Sie auf Neue Gruppe und geben Sie unter Anzeigename einen Namen für die Gruppe ein. Gruppennamen sollten beschreibend und innerhalb Ihres Mandanten eindeutig sein (z. B. "Engineering", "Billing Admins", "Beta Testers").

Gruppendetails & Mitglieder

Klicken Sie auf eine Gruppe, um die Detailansicht zu öffnen. Hier können Sie alle aktuellen Mitglieder sehen und die Mitgliedschaft verwalten:

  • Mitglieder hinzufügen: Suchen Sie einen Benutzer per E-Mail oder Name und fügen Sie ihn zur Gruppe hinzu.
  • Mitglieder entfernen: Klicken Sie auf die Entfernen-Schaltfläche neben einem Mitglied und bestätigen Sie. Alle über die Gruppe gewährten Rollen werden widerrufen.
Group detail view showing the member list, a user search to add members, and the roles the group grants

Gruppenmitgliedschaft in der Detailansicht verwalten

Gruppen in Tokens

Wenn Gruppen in Tokens auf einem Client aktiviert ist und der Geltungsbereich groups angefordert wird, enthalten ausgestellte Tokens einen groups-Claim mit den Anzeigenamen der Gruppen des Benutzers:

groups claim
{
  "sub": "user-123",
  "email": "[email protected]",
  "groups": ["Engineering", "Beta Testers"]
}

Pro Client aktivieren

Die Einstellung Gruppen in Tokens wird auf jedem Client einzeln konfiguriert, auf der Registerkarte Allgemein des Clients. Der Client muss außerdem den Geltungsbereich groups erlauben.

Rollen

Rollen unterstützen die rollenbasierte Zugriffskontrolle (RBAC) in Ihrer Anwendung. Definieren Sie Rollen in Authagonal, weisen Sie sie Benutzern zu und verwenden Sie den roles-Claim in Tokens, um die Autorisierung in Ihrer Anwendungslogik durchzusetzen.

Rollen verwalten

Die Rollenseite zeigt eine Tabelle aller definierten Rollen mit Inline-Bearbeitung. Jede Rolle hat:

SpalteBeschreibung
NameEin eindeutiger Bezeichner für die Rolle (z. B. "admin", "editor", "viewer")
BeschreibungEine lesbare Beschreibung dessen, was die Rolle gewährt
ErstelltDas Datum, an dem die Rolle erstellt wurde

Rolle erstellen

Klicken Sie auf Neue Rolle und geben Sie einen Namen und eine Beschreibung an. Rollennamen sollten prägnant sein und einer einheitlichen Namenskonvention in Ihrer Anwendung folgen (z. B. Kleinschreibung mit Bindestrichen: billing-admin).

Inline-Bearbeitung

Rollen unterstützen die Inline-Bearbeitung direkt in der Tabelle. Klicken Sie auf das Stiftsymbol bei einer Rolle, um den Bearbeitungsmodus zu aktivieren — die Felder für Name und Beschreibung werden bearbeitbar. Ändern Sie die Werte und klicken Sie dann auf das Häkchensymbol zum Speichern. Änderungen werden sofort wirksam.

Rolle löschen

Klicken Sie auf das Löschsymbol bei einer Rolle, um sie zu entfernen. Sie werden zur Bestätigung aufgefordert, bevor die Rolle dauerhaft gelöscht wird. Das Entfernen einer Rolle macht bestehende Tokens nicht rückwirkend ungültig — die Rolle fehlt in neuen Tokens, die nach der Löschung ausgestellt werden.

Roles table with inline editing active, showing editable name and description fields with save and cancel icons

Inline-Bearbeitung von Rollen in der Rollentabelle

Rollen in Tokens

Einem Benutzer zugewiesene Rollen werden als roles-Claim in ID- und Access-Tokens aufgenommen, wenn der Client den Geltungsbereich roles anfordert. Ihre Anwendung kann diesen Claim lesen, um Autorisierungsentscheidungen zu treffen:

roles claim in ID token
{
  "sub": "user-123",
  "email": "[email protected]",
  "roles": ["admin", "billing-admin"]
}

SCIM-Bereitstellung

SCIM 2.0 (System for Cross-domain Identity Management) ermöglicht die automatische Benutzer- und Gruppenbereitstellung von Enterprise-Identity-Providern wie Okta, Azure AD, OneLogin und JumpCloud. Bei Konfiguration werden Benutzerkonten und Gruppenmitgliedschaften automatisch vom vorgelagerten IdP mit Ihrem Authagonal-Mandanten synchronisiert.

SCIM provisioning flow: shows user lifecycle events flowing from enterprise IdP through Authagonal SCIM API to your app via TCC webhooks

SCIM-Benutzerlebenszyklus-Synchronisation mit nachgelagerter Bereitstellung

Einrichtungsschritte

Befolgen Sie diese Schritte, um die SCIM-Bereitstellung für einen Client zu aktivieren:

  1. Client-Anwendung auswählen — Wählen Sie den OAuth-Client, dem die SCIM-Bereitstellung zugeordnet wird.
  2. SCIM-Token generieren — Geben Sie eine Beschreibung und einen Ablaufzeitraum in Tagen an und generieren Sie dann den Token.
  3. Token sofort kopieren — Der Roh-Token-Wert wird nur einmal angezeigt. Kopieren Sie ihn, bevor Sie den Dialog schliessen.
  4. IdP konfigurieren — Geben Sie in den SCIM-Einstellungen Ihres Identity Providers die Basis-URL und das Bearer-Token ein.
  5. Benutzersynchronisation testen — Lösen Sie eine Testsynchronisation von Ihrem IdP aus und überprüfen Sie, ob Benutzer im Authagonal-Portal erscheinen.

SCIM-Basis-URL

Konfigurieren Sie Ihren Identity Provider mit der folgenden Basis-URL:

SCIM Base URL
https://{slug}.authagonal.io/scim/v2

Ersetzen Sie {slug} durch Ihren Mandanten-Slug.

SCIM configuration page showing client selector, token generation form, and base URL

SCIM-Einrichtungsseite mit Token-Generierung

Token-Verwaltung

SCIM-Tokens authentifizieren Bereitstellungsanfragen von Ihrem IdP. Sie können mehrere Tokens pro Client verwalten:

FeldBeschreibung
BeschreibungEin Label zur Identifizierung des Tokens (z. B. "Okta Production SCIM")
AblaufToken-Lebensdauer in Tagen (1 bis 3650, Standard 365).
StatusAktive Tokens sind in Verwendung. Widerrufene Tokens zeigen ein Revoked Badge an und können keine Anfragen mehr authentifizieren.

Um einen Token zu widerrufen, klicken Sie auf die Schaltfläche Widerrufen daneben. Widerrufene Tokens bleiben aus Audit-Gründen in der Liste sichtbar, akzeptieren aber sofort keine Anfragen mehr.

SCIM token list showing active and revoked tokens with description, expiry date, and revoke button

Token-Verwaltung mit Indikatoren für aktive und widerrufene Tokens

Token sofort kopieren

Der Roh-SCIM-Token wird bei der Erstellung nur einmal angezeigt. Kopieren Sie ihn sofort — er kann später nicht abgerufen werden. Wenn Sie den Token verlieren, müssen Sie einen neuen generieren und Ihre IdP-Konfiguration aktualisieren.

Konnektivität testen

Überprüfen Sie, ob Ihre SCIM-Integration funktioniert, indem Sie den ServiceProviderConfig-Endpunkt abfragen:

Test SCIM connectivity
curl -H "Authorization: Bearer YOUR_TOKEN" \
  https://acme.authagonal.io/scim/v2/ServiceProviderConfig

Eine erfolgreiche Antwort gibt ein JSON-Dokument zurück, das die unterstützten SCIM-Funktionen beschreibt: PATCH und Filterung werden unterstützt, Massenoperationen, Passwortänderungen, Sortierung und ETags dagegen nicht.

Bevorzugte Sprache

Das SCIM-Attribut preferredLanguage (mit Fallback auf locale) wird der gespeicherten Sprache des Benutzers zugeordnet. Über SCIM bereitgestellte SSO-Benutzer erhalten automatisch lokalisierte E-Mails in der Sprache, die ihr IdP sendet.

Was ein Token sehen kann

Ein SCIM-Token sieht nur die Benutzer und Gruppen, die er selbst bereitgestellt hat. Das Lesen, Aktualisieren oder Löschen eines Benutzers, den ein anderer Connector angelegt hat, wird mit 404 beantwortet, eine Auflistung liefert nur die eigenen Benutzer, und die Mitgliedschaft einer Gruppe darf nur Benutzer nennen, die derselbe Connector bereitgestellt hat. Konten, die auf anderem Weg entstanden sind, durch einen Administrator, durch Selbstregistrierung oder durch Just-in-Time-Bereitstellung per SSO, sind für SCIM vollständig unsichtbar.

Diese Grenze verläuft pro Client, nicht pro Token. Zwei Tokens, die für denselben Client ausgestellt wurden, sind eine Identität mit zwei Secrets, und jeder kann ändern, was der andere angelegt hat. Geben Sie Connectors, die einander nicht vertrauen, jeweils einen eigenen Client. externalId ist genauso begrenzt, sodass zwei Connectors jeweils ext-001 für verschiedene Personen verwenden können, ohne zu kollidieren.

Deprovisionierung

DELETE /scim/v2/Users/{id} deaktiviert das Konto und markiert es als gelöscht. Der Datensatz bleibt erhalten, wie RFC 7644 es erlaubt, antwortet aber bei jeder weiteren Operation mit 404 und wird in Auflistungen nicht mehr aufgeführt. Die MFA-Registrierungen und Gruppenmitgliedschaften des Benutzers werden gelöscht, seine externalId-Zuordnung wird freigegeben und alle ausgestellten Tokens werden widerrufen, sodass der Zugriff sofort endet und nicht erst beim nächsten Ablauf eines Tokens.

Wird dieselbe Person später erneut eingestellt und neu angelegt, erhält sie eine neue Benutzer-ID. Bezeichner werden niemals wiederverwendet: Die ID ist das Subject in jedem Token, das Sie jemals ausgestellt haben, sodass eine Wiederverwendung dem neuen Mitarbeiter unbemerkt die Historie des vorherigen Inhabers in jeder Anwendung geben würde, die ihr vertraut.

Synchronisierte Benutzer mit einer Organisation kennzeichnen

SCIM bietet einem Connector keine Möglichkeit anzugeben, welchen Ihrer Kunden er gerade synchronisiert. Das Kern-SCIM definiert kein Organisationsattribut, sodass ein einfaches Anlegen eines Benutzers Ihnen Name und E-Mail der Person nennt und nichts darüber, zu wem sie gehört. Stellen mehrere Kunden in Ihren Mandanten bereit, sind deren Benutzer bei der Ankunft nicht voneinander zu unterscheiden.

Der Token beantwortet diese Frage anstelle der Anfrage. Wenn Sie einen SCIM-Token erstellen, wählen Sie unter Organisation eine der Organisationen Ihres Mandanten aus (die Auswahl erscheint, sobald Ihr Mandant Organisationen hat). Jeder über diesen Token bereitgestellte Benutzer wird aktives Mitglied dieser Organisation und trägt sie fortan als org_id-Claim in seinen Tokens. Vergeben Sie einen Token pro Kunde auf demselben Client, dann werden dessen synchronisierte Benutzer korrekt zugeordnet, ohne dass für jeden Kunden eine eigene Client-Registrierung nötig ist. Lassen Sie das Feld leer, bleiben die Benutzer ungekennzeichnet.

Kennzeichnung ist keine Isolation

Die Eigentümerschaft wird pro Client durchgesetzt, nicht pro Token. Zwei Tokens auf demselben Client sind eine Identität mit zwei Secrets: Jeder kann die vom anderen angelegten Benutzer lesen, umbenennen, deaktivieren und löschen. Das ist unproblematisch, solange Sie alle Tokens selbst verwahren. Hält die eigene IT-Abteilung jedes Kunden ihren Token selbst, geben Sie jedem Kunden einen eigenen Client und setzen Sie die Organisation zusätzlich auf dessen Token.

Die Kennzeichnung wird beim Anlegen des Benutzers gesetzt und nie bei einer späteren Aktualisierung, sodass eine routinemässige inkrementelle Synchronisation ein bestehendes Konto nicht unbemerkt verschieben kann. Wenn Sie zusätzlich eine Bereitstellungsanwendung betreiben, hat die explizite Kennzeichnung des Tokens Vorrang: Eine /try-Antwort füllt nur eine Organisation, die noch leer ist.

Unterstützte Schemata

Wir implementieren die Kern-Schemata User und Group von SCIM 2.0 (RFC 7643). Unterstützte Benutzerattribute sind userName, name.givenName, name.familyName, displayName, emails, active, externalId und preferredLanguage / locale.

Die Enterprise-User-Erweiterung ist nicht implementiert, daher werden department, manager, employeeNumber, costCenter, division und organization angenommen und ignoriert statt gespeichert, bei Create, Replace und PATCH gleichermassen. Entra und Okta bilden einige davon standardmässig ab, Sie müssen sie also nicht aus Ihrem Attribut-Mapping entfernen. Um einen Benutzer einem Ihrer Kunden zuzuordnen, setzen Sie stattdessen die Organisation auf dem SCIM-Token: Das Enterprise-Attribut organization stammt aus einer Assertion des Identity Providers Ihres Kunden und wird bewusst nicht zur org_id des Benutzers.

OAuth-Scopes

Geltungsbereiche ermöglichen Clients, bestimmte Teile der Benutzerdaten oder Berechtigungen anzufordern. Authagonal unterstützt sowohl Standard-OIDC-Geltungsbereiche als auch benutzerdefinierte Geltungsbereiche für Ihre APIs.

Integrierte Geltungsbereiche

GeltungsbereichBeschreibung
openidErforderlich für jeden OpenID-Connect-Flow. Gibt ein ID-Token aus.
profileLiefert Standard-Profilclaims (name, given_name, family_name, locale, org_name).
emailLiefert E-Mail-Adresse und Verifizierungsstatus des Benutzers.
phoneLiefert die Telefonnummer des Benutzers (phone_number).
offline_accessGibt neben dem Access-Token auch ein Refresh-Token aus.
rolesGibt den roles-Claim des Benutzers frei. Ohne diesen Geltungsbereich werden keine Rollen ausgegeben.
groupsGibt den groups-Claim des Benutzers frei (SCIM-Gruppenmitgliedschaft). Ohne diesen Geltungsbereich werden keine Gruppen ausgegeben.

Benutzerdefinierte Geltungsbereiche

Definieren Sie eigene Geltungsbereiche auf der Geltungsbereiche-Seite. Jeder Geltungsbereich beschreibt eine Berechtigung oder Ressource, die ein Client anfordern kann (z. B. billing.read, orders.write).

Custom scope creation form with name, display name, description and User Claims fields
FeldBeschreibung
nameDer Scope-Identifier, der in Token-Anfragen gesendet wird (z. B. billing.read).
displayNameBenutzerfreundliche Bezeichnung auf dem Zustimmungsbildschirm.
descriptionLängere Erklärung unter dem Anzeigenamen bei der Zustimmung.
userClaimsZusätzliche Claims, die dem Access-Token und dem ID-Token hinzugefügt werden, wenn der Geltungsbereich gewährt wird.
showInDiscoveryDocumentWenn aktiviert, erscheint der Geltungsbereich in /.well-known/openid-configuration.
emphasizeHebt den Geltungsbereich auf der Zustimmungsseite als sensibel hervor.
requiredVerhindert, dass der Benutzer den Geltungsbereich bei der Zustimmung abwählen kann.
groupZustimmungsgruppe: Geltungsbereiche mit derselben Überschrift erscheinen auf dem Zustimmungsbildschirm zusammen unter einem Kontrollkästchen. Dient nur der Darstellung.
allowedRolesRollen, die ein Benutzer besitzen muss, damit ihm dieser Geltungsbereich gewährt wird. Leer erlaubt es allen; bei einem Benutzer ohne eine dieser Rollen wird der Geltungsbereich aus seinem Token entfernt, statt ihn abzuweisen.

Integration der Zustimmung

Clients mit RequireConsent: true fragen den Benutzer bei der ersten Anfrage. Das Löschen eines Scopes widerruft bereits ausgestellte Tokens nicht — widerrufen Sie diese bei Bedarf explizit.

Benutzerdefinierte Claims auf Tokens

Benutzerdefinierte Claims haben zwei Hälften. Die Quelle sind benutzerbezogene Daten: Jeder AuthUser besitzt ein customAttributes-Dictionary, das Sie über das Portal (Benutzer → Benutzer → Benutzerdefinierte Attribute), per SCIM oder über einen TCC-Provisioning-Hook befüllen können. Die Freigabe erfolgt pro Geltungsbereich: Die userClaims-Liste jedes Geltungsbereichs nennt die Schlüssel, die den Server verlassen dürfen.

Wenn ein Client Geltungsbereiche anfordert, durchläuft Authagonal die gewährten Geltungsbereiche, vereinigt deren userClaims-Listen und gibt nur diese Schlüssel aus den customAttributes des Benutzers aus. Unbekannte Schlüssel werden stillschweigend verworfen — ein Client kann ein Attribut nicht durch Erraten des Namens lesen. Standard-OIDC-Claims (sub, email, name usw.) folgen der Spezifikation und unterliegen nicht der Whitelist.

Example: project-scope claims on an access token
# 1. On the user (Portal → Users → {user} → Custom Attributes)
department = "engineering"
employee_id = "E-1042"
seat_tier = "enterprise"

# 2. On a custom scope (Portal → Scopes → projects.read)
name        = "projects.read"
userClaims  = ["department", "seat_tier"]   # <-- whitelist

# 3. Client requests scope=openid projects.read
# Decoded access token (relevant fields only):
{
  "sub": "u-9b…",
  "scope": "openid projects.read",
  "department": "engineering",
  "seat_tier":  "enterprise"
  // employee_id is NOT emitted; it's not in the whitelist for any granted scope.
}

Föderations-Claims füllen pro Sitzung Lücken

Wenn sich ein Benutzer über einen Upstream-IdP (SAML/OIDC SSO) anmeldet, fließen sitzungsbezogene Claims, die vom IdP eintreffen, z. B. ein aus einer SAML-Assertion gemapptes department-Attribut, durch dieselbe Whitelist der Geltungsbereiche, füllen aber nur Lücken: Bei einer Schlüsselkollision gewinnt der persistierte customAttributes-Wert. Sie werden auf den Tokens dieser Sitzung ausgegeben (und überleben Refresh-Rotationen), ohne in den Benutzerdatensatz zurückgeschrieben zu werden.

Geltungsbereiche an Clients zuweisen

Fügen Sie erlaubte Geltungsbereiche auf der Registerkarte Clients → Scopes & Grants hinzu. Ein Client kann nur Geltungsbereiche anfordern, die ihm zugewiesen wurden; unbekannte Geltungsbereiche werden mit invalid_scope abgelehnt.

Branding

Passen Sie das Erscheinungsbild der Anmeldeseiten Ihres Mandanten an. Branding-Einstellungen ermöglichen es Ihnen, das Authentifizierungserlebnis an die visuelle Identität Ihres Produkts anzupassen — von Logos und Farben bis hin zu erweiterten CSS-Überschreibungen.

Erscheinungsbild

EinstellungBeschreibung
appNameDer Anwendungsname, der in der Kopfzeile der Anmeldeseite (wenn kein Logo gesetzt ist) und in Transaktions-E-Mails angezeigt wird
logoUrlURL zu Ihrem Logo-Bild. Wird oben auf der Anmeldeseite angezeigt. Empfohlene Größe: 200x60px oder ähnliches Seitenverhältnis.
primaryColorDie primäre Markenfarbe für Schaltflächen, Links und Fokuszustände. Einstellbar über eine Farbauswahl oder Hex-Eingabe. Eine Live-Vorschau aktualisiert sich, wenn Sie den Wert ändern.
customCssUrlURL zu einer CSS-Datei, die nach den Standardstilen geladen wird. Sie muss vom selben Origin wie die Anmeldeseite ausgeliefert werden; eine URL auf einem anderen Origin wird ignoriert.
Branding appearance settings with app name input, logo URL field, color picker with hex input, and custom CSS URL field

Erscheinungseinstellungen mit Live-Farbvorschau

Kontaktinformationen

EinstellungBeschreibung
supportEmailEine Support-E-Mail-Adresse, die auf Anmeldeseiten angezeigt wird. Benutzer sehen diese, wenn sie Hilfe mit ihrem Konto benötigen.

Anmeldeseiten-Schalter

Steuern Sie, welche Elemente auf der Anmeldeseite Ihres Mandanten angezeigt werden:

SchalterBeschreibungStandard
showForgotPasswordDen "Passwort vergessen?"-Link im Anmeldeformular anzeigenAn
showRegistrationDen "Registrieren"-Link für Self-Service-Benutzerregistrierung anzeigenAn
poweredByDas "Powered by Authagonal"-Badge am Ende der Anmeldeseite anzeigenAn
A customized login page showing a branded logo, custom primary color on the sign-in button, and support email in the footer

Beispiel-Anmeldeseite mit angewendetem individuellem Branding

Eigenes CSS

Für vollständige Kontrolle über das Aussehen der Login-Seite geben Sie eine CSS-Datei-URL in Ihren Branding-Einstellungen an. Die Datei wird nach den Standard-Styles geladen, sodass Ihre Regeln Vorrang haben. Die URL muss auf demselben Origin wie die Login-Seite liegen; Stylesheets von anderen Origins werden nicht geladen.

CSS-Custom-Properties

Die Login-Seite unterstützt CSS-Custom-Properties (Variablen) für häufige Überschreibungen. Setzen Sie diese in Ihrer CSS-Datei, um Farben, Schriftarten und Formen zu ändern, ohne komplexe Selektoren zu schreiben.
/* your-custom-styles.css */
:root {
--auth-bg: #1a1a2e;
--auth-card-bg: #16213e;
--auth-heading: #e0e0e0;
--auth-radius: 12px;
--auth-font: 'Inter', sans-serif;
}
VariableBeschreibungStandard
--auth-bgSeiten-Hintergrundfarbe#f3f4f6
--auth-card-bgHintergrund der Login-Kartewhite
--auth-headingFarbe des Überschriftentexts#111827
--auth-radiusEckenradius der Karte0.5rem
--auth-fontSchriftfamilieinherit

Dunkler Modus

Die Login-App bietet helle, dunkle und System-Designs. Die Einstellung Dunkelmodus auf der Branding-Seite legt den Standard fest: aus, auto (folgt der Systemeinstellung, der Standard) oder erzwungen. Benutzer können weiterhin über einen Umschalter auf der Login-Seite wählen; die Auswahl bleibt über Sitzungen hinweg erhalten. Bei system folgt die SPA dem Systemwert prefers-color-scheme in Echtzeit.

Helle Werte werden in :root deklariert; dunkle Überschreibungen sind auf .dark beschränkt. Tenant-Branding über customCssUrl hat immer Vorrang — Ihre Farben bleiben unabhängig vom gewählten Design erhalten.

Element-Selektoren

Für feinere Kontrolle können Sie bestimmte Elemente über data-auth-Attribute ansprechen. Diese Selektoren sind über Updates hinweg stabil — sie brechen nicht, wenn wir interne Klassennamen ändern.
SelektorElement
[data-auth="page"]Hintergrund-Container der gesamten Seite
[data-auth="header"]Bereich für Logo und App-Name
[data-auth="logo"]Logo-Bild
[data-auth="app-name"]App-Name-Überschrift (wenn kein Logo gesetzt ist)
[data-auth="content"]Hauptinhaltsbereich (Formulare, Meldungen)
[data-auth="login-form"]Login-Formular-Element
[data-auth="email-field"]E-Mail-Eingabe-Wrapper
[data-auth="password-field"]Passwort-Eingabe-Wrapper
[data-auth="submit-button"]Anmelde-Schaltfläche
[data-auth="languages"]Sprachauswahl-Leiste

Einstellungen

Konfigurieren Sie mandantenweite Sicherheitsrichtlinien, Webhooks und Umgebungseinstellungen. Diese Einstellungen gelten global für alle Clients, sofern sie nicht auf Client-Ebene überschrieben werden.

Passwortrichtlinie

Definieren Sie unter Benutzer → Einstellungen die Passwortkomplexitätsanforderungen für alle Benutzer in Ihrem Mandanten:

EinstellungBereichStandard
minPasswordLength6 – 1288
requireUppercaseAn / AusAn
requireLowercaseAn / AusAn
requireDigitAn / AusAn
requireSpecialCharAn / AusAn
Password policy settings showing minimum length slider and toggle switches for character requirements

Konfiguration der Passwortrichtlinie

MFA-Richtlinie

Die mandantenweite MFA-Richtlinie, festgelegt unter Benutzer → Einstellungen, bestimmt das Standard-Verhalten für Multi-Faktor-Authentifizierung. Einzelne Clients können diese Einstellung überschreiben.

RichtlinieVerhalten
DisabledMFA ist nicht verfügbar. Benutzer können sich nicht für MFA registrieren.
EnabledMFA ist optional. Benutzer können sich für MFA registrieren und werden bei der Anmeldung aufgefordert, wenn registriert.
RequiredMFA ist verpflichtend. Alle Benutzer müssen sich für MFA registrieren und bei jeder Anmeldung einen zweiten Faktor abschließen.

Sitzung & Sperrung

Steuern Sie die Sitzungsdauer und das Kontosperrungsverhalten:

EinstellungBereichStandard
sessionLifetimeMinutes5 – 43.200 (30 Tage)60
maxFailedAttempts1 – 1005
lockoutDurationMinutes1 – 1.440 (24 Stunden)10
Session and lockout settings with numeric inputs for session lifetime, max failed attempts, and lockout duration

Sitzungs- und Sperrungskonfiguration

Webhooks

Webhooks ermöglichen die Echtzeit-Reaktion auf Authentifizierungsereignisse. Zwei Ereignisse (onUserAuthenticated, onTokenIssued) sind erzwingbar — standardmäßig laufen sie asynchron und blockieren den Benutzer nicht, aber Sie können pro Ereignis Erzwingung aktivieren, sodass eine Antwort, die nicht 2xx ist, oder ein {"allow": false}-Body die Aktion ablehnt. Die übrigen Ereignisse sind Benachrichtigungen — immer „fire-and-forget", blockieren nie.

EreignisTypBeschreibung
onUserAuthenticatedErzwingbarWird nach einer erfolgreichen Anmeldung aufgerufen. Standardmäßig „fire-and-forget", sodass die Anmeldelatenz unbeeinflusst bleibt. Aktivieren Sie <code>webhookEnforceUserAuthenticated</code>, um den Aufruf blockierend zu machen — eine Antwort, die nicht 2xx ist, oder ein <code>{"allow": false}</code>-Body lehnt dann die Anmeldung ab.
onTokenIssuedErzwingbarWird vor der Token-Ausstellung aufgerufen (authorization_code, refresh_token, client_credentials). Standardmäßig „fire-and-forget". Aktivieren Sie <code>webhookEnforceTokenIssued</code>, um den Aufruf blockierend zu machen — eine Antwort, die nicht 2xx ist, oder ein <code>{"allow": false}</code>-Body verhindert dann die Token-Ausstellung.
onUserCreatedBenachrichtigungFire-and-Forget-Benachrichtigung, wenn ein neuer Benutzer sich registriert oder über SCIM bereitgestellt wird.
onUserUpdatedBenachrichtigung„Fire-and-forget"-Benachrichtigung, wenn ein Benutzerdatensatz aktualisiert wird (Profiländerungen, Rollenänderungen, SCIM-Updates).
onUserDeletedBenachrichtigung„Fire-and-forget"-Benachrichtigung, wenn ein Benutzer gelöscht wird, entweder per Portal/SCIM oder durch die Aufbewahrungsrichtlinie.
onLoginFailedBenachrichtigungFire-and-Forget-Benachrichtigung, wenn ein Anmeldeversuch aufgrund falscher Anmeldedaten, Sperrung oder Richtlinienablehnung fehlschlägt.

Zusätzliche Webhook-Einstellungen:

EinstellungBereichStandardBeschreibung
webhookTimeoutSeconds1 – 305Maximale Wartezeit auf eine Antwort eines Durchsetzungs-Webhooks vor dem Timeout
webhookFailOpenAn / AusAnWenn aktiviert und ein Durchsetzungs-Webhook nicht erreichbar ist oder ein Timeout hat, wird der Vorgang fortgesetzt
Webhook configuration section showing URL inputs for each event type, timeout slider, and fail-open toggle

Webhook-Ereigniskonfiguration

Verfügbarkeit von Durchsetzungs-Webhooks

Durchsetzungs-Webhooks können Authentifizierungsabläufe blockieren. Wenn Ihr Webhook-Endpunkt ausfällt und webhookFailOpen deaktiviert ist, kann sich kein Benutzer anmelden. Verwenden Sie den Fail-Open-Modus, es sei denn, Sie haben strenge Compliance-Anforderungen, die ein Blockieren bei Webhook-Ausfall vorschreiben.

Webhooks verifizieren

Sobald eine Webhook-URL konfiguriert ist, erzeugt Authagonal ein mandantenspezifisches Signaturgeheimnis (einen whsec_…-Wert, der unter Einstellungen → Webhooks schreibgeschützt angezeigt wird). Jede ausgehende Zustellung trägt einen X-Authagonal-Signature: t=<unix>,v1=<hex>-Header, wobei v1 gleich HMAC-SHA256(secret, "{t}.{body}") ist, berechnet über den rohen Anfrage-Body. Berechnen Sie ihn an Ihrem Endpunkt neu und vergleichen Sie ihn in konstanter Zeit, um zu bestätigen, dass die Anfrage tatsächlich von Authagonal stammt und nicht manipuliert wurde — und weisen Sie Zustellungen zurück, deren t zu alt ist, um Replays zu blockieren.

Einen Webhook verifizieren (Node.js)
import crypto from 'node:crypto';

// rawBody MUST be the exact bytes Authagonal sent: verify before any JSON re-serialization.
function verifyAuthagonalWebhook(signatureHeader, rawBody, signingSecret) {
  const parts = Object.fromEntries(signatureHeader.split(',').map((p) => p.split('=')));
  const { t, v1 } = parts;

  // Replay protection: reject deliveries older than 5 minutes.
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;

  const expected = crypto
    .createHmac('sha256', signingSecret)
    .update(`${t}.${rawBody}`)
    .digest('hex');

  return v1.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}

Das Signaturgeheimnis rotieren

Verwenden Sie Neu generieren neben dem Signaturgeheimnis, um es zu rotieren — zum Beispiel nach einem vermuteten Leck. Das vorherige Geheimnis wird sofort ungültig, aktualisieren Sie daher Ihren Verifizierer mit dem neuen Wert, da sonst laufende Zustellungen ihre Signaturprüfung nicht mehr bestehen.

Wartungsfenster

Legen Sie ein bevorzugtes Wartungsfenster für störende Operationen fest, etwa das Verschieben der Daten Ihres Mandanten zwischen Storage-Shards. Wählen Sie eine UTC-Stunde (0–23); das Portal zeigt zur Vereinfachung auch die entsprechende Zeit in Ihrer lokalen Zeitzone an.

Registrierung und Zugang

Wer in Ihrem Mandanten Benutzer werden darf und unter welchen Bedingungen er sich anmelden kann.

EinstellungStandardBeschreibung
Öffentliche RegistrierungAnOb sich jeder selbst registrieren kann. Ausschalten verbirgt die Registrierungsseite und weist die Registrierungs-API ab, und das ist entscheidend: den Link allein zu verbergen würde den Endpunkt offen lassen. Verwenden Sie es, wenn Sie Benutzer selbst über SCIM, die API oder Einladungen bereitstellen.
E-Mail-Verifizierung für die Anmeldung verlangenAnEine unbestätigte Adresse kann sich nicht anmelden. Schalten Sie es aus, wenn stattdessen Ihre eigene App auf die Verifizierung prüft; der email_verified-Claim reist in beiden Fällen weiterhin im Token mit, das Signal bleibt Ihnen also erhalten.
Dynamische Client-RegistrierungAusErlaubt einem Client, sich zur Laufzeit nach RFC 7591 selbst zu registrieren, was ein KI-Agent oder MCP-Connector braucht, bevor er einen Flow starten kann. Standardmäßig aus, und das Aktivieren öffnet die Tür allein für Ihren Mandanten. Registrierungen bleiben in jedem Fall ratenbegrenzt, PKCE-pflichtig und zustimmungspflichtig.
MFA-Richtlinie für das PortalDeaktiviertMulti-Faktor für Ihr eigenes Team beim Anmelden am Portal, unabhängig von der Richtlinie für Ihre Endbenutzer eingestellt. Deaktiviert, bei der Anmeldung angeboten oder erforderlich.
Maximale BenutzerzahlKeineStandardmäßig gibt es keine Obergrenze für die Gesamtzahl der Benutzer, und kein Tarif legt eine fest. Solange die E-Mail-Adresse des Owners des Mandanten nicht verifiziert ist, gilt eine vorübergehende Obergrenze von 5 Benutzern; sie entfällt dauerhaft, sobald die Adresse verifiziert ist.

Aufbewahrung inaktiver Benutzer

Deaktivieren und anschließend löschen Sie wahlweise Konten, die ungenutzt geblieben sind, damit ein Verzeichnis nicht auf Dauer schlafende Identitäten ansammelt. Beides ist aus, solange Sie es nicht setzen, und die Löschung ist endgültig.

EinstellungStandardBeschreibung
Deaktivieren nach (Tagen Inaktivität)NieDeaktiviert ein Konto, das sich so lange nicht angemeldet hat. Der Datensatz bleibt erhalten und kann reaktiviert werden.
Löschen nach (Tagen Inaktivität)NieLöscht das Konto dauerhaft. Es gibt kein Rückgängig, richten Sie also das Warnfenster und den Webhook weiter unten ein, bevor Sie dies einschalten.
Vorwarntage7Wie viele Tage vor einer Deaktivierung oder Löschung der Warn-Webhook auslöst, damit Ihnen Zeit zum Eingreifen bleibt.
Aufbewahrungs-Webhook-Wohin diese Warnungen und die ausgeführten Aktionen gesendet werden, damit Sie die Person benachrichtigen oder das Konto offen halten können.

Audit-Export und externe Datensicherungen

Zwei Wege, Ihre Daten nach Zeitplan statt auf Anfrage herauszubekommen. Audit-Export schickt jeden abgeschlossenen Tag an Audit-Ereignissen an eine von Ihnen benannte URL, signiert, sodass Sie prüfen können, dass er von uns stammt, um damit ein SIEM oder ein Compliance-Archiv zu speisen. Externe Datensicherungen senden Kopien Ihrer täglichen und wöchentlichen Datensicherungen an ein Ziel, das Sie kontrollieren, ohne Authentifizierung, mit Basic-Authentifizierung oder mit einem Bearer-Token. Der Audit-Export wird auf der Registerkarte Export der Seite Audit-Protokoll konfiguriert, externe Datensicherungen auf der Seite Backups; beides gehört Ihnen, unabhängig von den Datensicherungen, die wir aufbewahren.

Sandbox-Umgebungen

Die Seite Umgebungen verwaltet Sandbox-Umgebungen: benannte, isolierte Umgebungen mit eigenen Benutzern, Clients, Signaturschlüsseln, MFA-Registrierungen und Grants, jeweils unter einer separaten URL erreichbar. Branding, Tarif und Abrechnung werden mit der Live-Umgebung geteilt. Verwenden Sie sie, um Konfigurationsänderungen, SSO-Integrationen und Webhook-Endpunkte zu testen, ohne Live-Benutzer zu beeinträchtigen. Standardmäßig können Sie bis zu 5 erstellen, und aktive Sandbox-Benutzer zählen zu Ihren MAU.

AktionBeschreibung
Umgebung hinzufügenErstellt eine neue Umgebung. Der Name besteht aus 1 bis 20 Kleinbuchstaben und Ziffern, und „live“ ist reserviert. Die Umgebung startet leer: Aus der Live-Umgebung wird nichts kopiert.
AktualisierenLöscht die Daten der Umgebung und setzt sie auf leer zurück.
LöschenLöscht die Sandbox-Umgebung und alle zugehörigen Daten dauerhaft.

Jede Umgebung ist erreichbar unter {name}-{slug}.authagonal.io.

Environments page listing sandbox environments with their URLs and Refresh and Delete actions

Sandbox-Umgebungssteuerungen

Abrechnung

Verwalten Sie Ihr Abonnement und Ihre Abrechnung über die Abrechnungsseite des Portals. Diese Seite gibt Ihnen einen Überblick über Ihren aktuellen Tarif und bietet Zugang zum Stripe-Abrechnungsportal für die Verwaltung von Zahlungsmethoden, Rechnungen und Tarifänderungen.

Abonnementinformationen

Die Abrechnungsseite zeigt Ihre aktuellen Abonnementdetails auf einen Blick. Sie sehen ein Statusbadge, das Ihren Abonnementstatus anzeigt — active, trialing, past_due, canceled oder unpaid — zusammen mit Ihrem Tarifnamen, dem aktuellen Abrechnungszeitraum (Start- und Enddatum) und ob Ihr Abonnement zum Ende des aktuellen Zeitraums gekündigt wird.

Abonnement verwalten

Klicken Sie auf die Schaltfläche Abonnement verwalten, um das Stripe-Abrechnungsportal in einem neuen Fenster zu öffnen. Dort können Sie Ihre Zahlungsmethoden aktualisieren, Rechnungen einsehen und herunterladen, Ihren Tarif ändern oder Ihr Abonnement kündigen.

Wenn noch kein Abonnement besteht, wird stattdessen eine Abrechnung einrichten-Handlungsaufforderung angezeigt, die Sie durch die Tarifauswahl und Eingabe der Zahlungsdaten führt.

Billing page showing subscription status, plan name, billing period, and Manage Subscription button

Die Abrechnungsseite zeigt Ihre aktuellen Abonnementdetails und bietet Zugang zu Stripe

Zahlungssicherheit

Die gesamte Abrechnung wird über Stripe abgewickelt. Ihre Zahlungsinformationen werden niemals auf Authagonal-Servern gespeichert.

Eigene Domains

Stellen Sie Ihre Authentifizierungsseiten über Ihre eigene Domain bereit (z. B. auth.ihredomain.com) anstelle der Standard-Domain {slug}.authagonal.io. Eigene Domains bieten Ihren Benutzern ein nahtloses, markenkonsistentes Authentifizierungserlebnis.

Domain hinzufügen

Geben Sie den Hostnamen ein, den Sie verwenden möchten (z. B. auth.ihredomain.com). Nach dem Hinzufügen erscheint die Domain in Ihrer Domainliste mit dem Status pending_verification.

DNS-Verifizierung

Erstellen Sie die beiden CNAME-Einträge, die das Portal für die Domain anzeigt, beide mit Ziel {slug}.authagonal.io: einen für den Hostnamen selbst, der den Datenverkehr bedient und über einen Proxy laufen darf, und einen für _authagonal-challenge. gefolgt vom Hostnamen, der den Besitz nachweist und als reiner DNS-Eintrag (ohne Proxy) angelegt sein muss. Sobald die Einträge vorhanden sind, klicken Sie zur Verifizierung auf DNS prüfen. Ausstehende Domains werden zudem automatisch erneut geprüft.

CNAME records
auth.yourdomain.com.                        CNAME  acme.authagonal.io.
_authagonal-challenge.auth.yourdomain.com.  CNAME  acme.authagonal.io.

DNS-Propagierung

Die DNS-Propagierung kann bis zu 48 Stunden dauern. Wenn die Verifizierung fehlschlägt, warten Sie und versuchen Sie es erneut.

TLS-Zertifikate

Sobald Ihre Domain verifiziert ist, benötigen Sie ein TLS-Zertifikat, damit Benutzer sicher über HTTPS verbinden können. Authagonal unterstützt zwei Optionen:

Automatisch (cert-manager) — Authagonal stellt TLS-Zertifikate automatisch über cert-manager bereit und erneuert sie. Dies ist die empfohlene Option für die meisten Benutzer. Keine zusätzliche Konfiguration erforderlich.

Eigenes Zertifikat (BYO) — Laden Sie Ihr eigenes Zertifikat und Ihren privaten Schlüssel im PEM-Format hoch. Diese Option ist nützlich, wenn Ihre Organisation Zertifikate von einer bestimmten Zertifizierungsstelle verlangt. Der Zertifikatsablauf wird verfolgt, damit Sie vor dem Ablauf erneuern können.

Domain-Status

Jede Domain zeigt ein Statusbadge an, das ihren aktuellen Zustand angibt: pending_verification (DNS noch nicht bestätigt), verified (DNS bestätigt, TLS ausstehend) oder active (voll funktionsfähig).

Domain list showing domains with status badges and verification controls

Die Domainliste zeigt jede eigene Domain und ihren aktuellen Status

BYO certificate upload form with certificate and private key PEM fields

Laden Sie Ihr eigenes TLS-Zertifikat und Ihren privaten Schlüssel im PEM-Format hoch

BYO-Zertifikatserneuerung

Halten Sie Ihr BYO-Zertifikat aktuell. Abgelaufene Zertifikate verursachen Browser-Sicherheitswarnungen für Ihre Benutzer.

Organisationen

Eine Organisation ist ein Kunde innerhalb eines Mandanten. Der Mandant bleibt die Isolationsgrenze: ein Tabellenpräfix und ein Signaturschlüssel, wobei jeder Host des Mandanten sein eigener Issuer ist. Eine Organisation unterteilt die Identitäten innerhalb des Mandanten, sodass ein Mandant viele Kundenorganisationen bedienen kann, ohne pro Kunde einen eigenen Mandanten zu benötigen.

Organisationen stehen neben den eigenen Domains (eine Domain kann auf eine Organisation festgelegt werden) und den Bereitstellungs-Apps (eine Bereitstellungs-App kann einen neuen Benutzer mit einer Organisation kennzeichnen). Das Muster „ein Mandant, viele Kunden mit eigenem Branding“, für das diese Funktion geschaffen wurde, beschreibt die Anleitung Apps für mehrere Kunden von Anfang bis Ende.

Modell und IDs

Jede Organisation hat eine stabile, unveränderliche id (in der Form org_<32 hex>), die als Token-Claim org_id ausgegeben wird, sowie einen unveränderlichen, mandantenweit eindeutigen slug, der als org_slug ausgegeben und vom Authorize-Parameter organization akzeptiert wird. IDs und Slugs teilen sich einen Namensraum für die Suche: Ein Slug, der der ID einer anderen Organisation entspricht, wird wie ein gewöhnlicher doppelter Slug als Kollision abgelehnt.

FeldÄnderbarBeschreibung
idNeinDer Claim org_id. Wird als org_ + GUID erzeugt. Der Unterstrich ist in einem Slug nicht zulässig, sodass eine neue ID nie mit einem Slug kollidieren kann.
slugNeinDer Claim org_slug und der Wert, den der Parameter organization akzeptiert. Unveränderlich, weil eine Relying Party ihn fest einkodiert.
nameJaDer Claim <code>org_name</code>. Frei bearbeitbar.
metadataJaFrei gestaltbare Schlüssel-Wert-Paare unter der Kontrolle des Mandanten. Werden nie in einem Token ausgegeben, es sei denn, der Claim-Satz eines Scopes gibt einen davon ausdrücklich frei.
brandingJsonJaJSON-Objekt, das Feld für Feld über das Branding des Mandanten gelegt wird. Siehe Branding-Überschreibung weiter unten.
domainsNur über die Domain-EndpunkteDie E-Mail-Domains, die die Organisation beansprucht hat, jeweils mit dem DNS-Eintrag, der sie belegt. Änderungen erfolgen nur über die Domain-Endpunkte weiter unten, nie über ein Update.

Mitgliedschaften

Eine Mitgliedschaft ist die Many-to-many-Verknüpfung zwischen einem Benutzer und einer Organisation, eine Zeile pro Paar (Organisation, Benutzer). Ein Benutzer kann mehrere haben. Die Mitgliedschaftszeile, nicht das ältere Organisationskennzeichen am Benutzer, berechtigt dazu, sich als Organisation anzumelden.

StatusBerechtigt zu Tokens?
invitedEingeladen, aber noch nicht angenommen. Berechtigt nicht zur Token-Ausstellung.
activeEin Mitglied in gutem Stand. Der einzige Status, der zur Token-Ausstellung berechtigt.
suspendedMitgliedschaft entzogen, ohne den Datensatz zu löschen. Berechtigt nicht zur Token-Ausstellung.

Die roles einer Mitgliedschaft stammen aus dem bestehenden Rollenkatalog des Mandanten und werden mit dem Claim roles vereinigt. Das geschieht aber nur, wenn die Organisation von der Anfrage ausdrücklich ausgewählt wurde (siehe Auswahl der Organisation für Tokens) und nur aus einer aktiven Mitgliedschaftszeile. Eine Rolle, die in einer Organisation gehalten wird, gelangt nie in einen Token, der für eine andere Organisation ausgestellt wird.

In eine Organisation einladen

POST /api/v1/users/invite akzeptiert optional organizationId und organizationRoles. Ein einziger Aufruf legt das Konto mit einer Mitgliedschaft im Status invited an und versendet eine Einladungs-E-Mail mit dem Branding der Organisation. Der Link öffnet sich auf der festgelegten eigenen Domain der Organisation, sofern sie eine hat. Sobald die Person annimmt, wird die Mitgliedschaft active. Eine Organisation anzugeben erfordert die Rolle Owner oder Admin.

SCIM-Bereitstellung in eine Organisation

Ein SCIM-Token kann an eine Organisation gebunden werden (organizationId bei POST /api/v1/scim/tokens oder die Organisationsauswahl beim Erstellen eines Tokens). Die ID muss eine Organisation des Mandanten bezeichnen. Jeder Benutzer, den dieser Token anlegt, wird ein Mitglied im Status active und trägt die Organisation als org_id. Die Bindung wirkt nur bei der Erstellung und entscheidet über die Mitgliedschaft, nicht über den Zugriff: Zwei Tokens auf einem Client sehen weiterhin gegenseitig ihre Benutzer. Wird ein Benutzer auf irgendeinem Weg gelöscht, werden auch seine Mitgliedschaften entfernt.

Richtlinien-Flags

enabled (standardmäßig an): Eine deaktivierte Organisation stellt für sich keine Tokens aus. Das wird sowohl beim Authorize als auch bei jedem Refresh geprüft, sodass das Deaktivieren laufende Sitzungen bei ihrer nächsten Rotation beendet und nicht nur neue Anmeldungen blockiert.

requireMembershipForTokens (standardmäßig an): ob ein Benutzer eine aktive Mitgliedschaft besitzen muss, um einen Token für diese Organisation zu erhalten. Das greift nur bei einer ausdrücklichen Auswahl (eine Anfrage, die die Organisation nennt, ein Refresh, der sie mitführt, eine auf die Organisation beschränkte Verbindung oder ein Client, der auf genau eine beschränkt ist). Eine Organisation, die lediglich vom älteren Kennzeichen des Kontos übernommen wird, unterliegt diesem Flag nie.

allowAutoMembership (standardmäßig aus) lässt einen Benutzer ohne Einladung beitreten, wenn seine bestätigte E-Mail-Adresse zu einer der verifizierten Domains der Organisation gehört. Das wird beim Authorize und bei jedem Refresh durchgesetzt. Siehe E-Mail-Domains und automatische Mitgliedschaft weiter unten.

E-Mail-Domains und automatische Mitgliedschaft

Eine Organisation beansprucht eine E-Mail-Domain und belegt ihre Kontrolle darüber mit einem DNS-TXT-Eintrag. Ist allowAutoMembership aktiv, wird ein Benutzer, dessen bestätigte E-Mail-Adresse zu dieser Domain gehört, beim ersten Anmelden als die Organisation deren Mitglied.

  1. Beanspruchen. POST /api/v1/organizations/{id}/domains mit der Domain. Die Antwort ist 201 mit recordName (_authagonal-org.acme.com) und recordValue (authagonal-org-verify=<token>). Der Token ist zufällig und gilt pro Beanspruchung.
  2. Eintrag veröffentlichen. Fügen Sie im DNS der Domain einen TXT-Eintrag mit diesem Namen und genau diesem Wert hinzu.
  3. Verifizieren. POST /api/v1/organizations/{id}/domains/{domain}/verify schlägt den Eintrag nach. Bei einem Treffer folgt 200 mit verified: true. Bei einem Fehlschlag folgt 409 verification_failed, nie 200 mit verified: false, sodass ein Client, der auf Erfolg wartet, einen Fehlschlag nicht für einen Erfolg halten kann.
  4. Entfernen. DELETE /api/v1/organizations/{id}/domains/{domain} liefert 204. Bestehende Mitgliedschaften bleiben erhalten, nur künftige automatische Beitritte entfallen.
POST /api/v1/organizations/{id}/domains
POST /api/v1/organizations/org_7fa2c9e1.../domains
Content-Type: application/json

{ "domain": "acme.com" }

201 Created
{
  "domain": "acme.com",
  "verified": false,
  "verifiedAt": null,
  "createdAt": "2026-10-03T01:02:03Z",
  "recordName": "_authagonal-org.acme.com",
  "recordValue": "authagonal-org-verify=Qm9...base64url"
}

Ablehnungen: 400 domain_invalid (kein reiner DNS-Name), 409 domain_exists (bereits bei dieser Organisation), 409 domain_taken (eine andere Organisation im Mandanten hält sie), 404 organization_not_found und 404 domain_not_found. Eine Domain gehört pro Mandant höchstens zu einer Organisation, und das wird beim Verifizieren erneut geprüft.

Die Regel für die automatische Mitgliedschaft

Der Selektor lässt einen Benutzer ohne aktive Mitgliedschaft zu, wenn alle folgenden Bedingungen erfüllt sind:

  • Die Organisation wurde ausdrücklich ausgewählt: durch einen mitgeführten Refresh-Grant, eine auf die Organisation beschränkte Verbindung, den Parameter organization (eine Domain-Festlegung liefert ihn) oder einen Client, der auf genau eine Organisation beschränkt ist. Das ältere Kennzeichen des Kontos führt nie zu einem automatischen Beitritt.
  • Die Organisation ist aktiviert und allowAutoMembership ist an.
  • Die E-Mail-Adresse des Benutzers ist bestätigt, denn jeder kann sich als [email protected] registrieren.
  • Der Teil der E-Mail-Adresse nach dem letzten @, in Kleinbuchstaben, ist exakt gleich einer der verifizierten Domains der Organisation. Subdomains werden nicht abgeglichen: Eine verifizierte acme.com lässt [email protected] nicht zu. Beanspruchen und verifizieren Sie jede Subdomain einzeln.

Was geschrieben wird, bevor die Mitgliedschaftsprüfung läuft: Ohne Zeile entsteht eine neue Mitgliedschaft im Status active ohne Rollen. Eine Zeile im Status invited wird auf active hochgestuft, ihre Rollen bleiben erhalten. Eine Zeile im Status active bleibt unverändert. Eine Zeile im Status suspended wird nie hochgestuft.

Das Löschen eines Mitglieds hält es nicht fern

Solange allowAutoMembership an ist, tritt ein gelöschtes Mitglied, das weiterhin die Voraussetzungen erfüllt, beim nächsten Authorize oder Refresh wieder bei. Um einen qualifizierten Benutzer fernzuhalten, setzen Sie seine Mitgliedschaft auf suspended, den einen Status, den die Regel nie ändert.

Auswahl der Organisation für Tokens

Welcher Organisation eine Anfrage zugeordnet wird, wird an genau einer Stelle entschieden, sodass die Antwort bei /connect/authorize, bei jedem Refresh und beim Device-Grant identisch ist. Vorrang, höchster zuerst:

#QuelleVerhalten
1Mitgeführter Grant (Refresh)Die Organisation, für die ein früherer Token ausgestellt wurde. Existiert sie nicht mehr, wird der Refresh selbst abgelehnt, statt auf etwas anderes zurückzufallen.
2Auf eine Organisation beschränkte VerbindungDie Sitzung wurde über eine SAML- oder OIDC-Verbindung angemeldet, die zu einer Organisation gehört, sodass diese Organisation ausgewählt ist. Das ist die einzige Quelle, die belegt statt behauptet ist. Eine Anfrage, die eine andere Organisation nennt, wird abgelehnt, ebenso eine Verbindung, deren Organisation nicht mehr existiert.
3organizationWird zuerst als Slug, dann als ID aufgelöst. Eine Domain-Festlegung erreicht denselben Zweig: Die Middleware hängt sie an, bevor die Anfrage ausgewertet wird. Genannt und nicht gefunden führt zu einer harten Ablehnung, nie zu einem stillen Rückfall.
4Client auf genau eine Organisation beschränktAutomatisch ausgewählt: Eine Anwendung pro Kunde registriert ihre eine Organisation einmal und sendet nie einen Parameter. Ist der Client auf <em>mehr</em> als eine beschränkt und kommt kein Hinweis, wird die Anfrage mit <code>account_selection_required</code> abgelehnt.
5Älteres Organisationskennzeichen des KontosEine einzelne flache Zeichenkette, die per ID in einer einzigen Abfrage aufgelöst wird, nicht durch einen Scan der Mitgliedschaften des Benutzers. Bezeichnet sie keine echte Organisationszeile, wird sie wörtlich und ohne Prüfung ausgegeben, genau wie vor der Einführung von Organisationen. Sie ist nie eine ausdrückliche Auswahl und führt daher nie zu einem automatischen Beitritt.
6Keines der genanntenÜberhaupt keine Organisation im Token: kein Claim <code>org_id</code>, <code>org_slug</code> oder <code>org_name</code>.

Mitgliedschaften sind nie der Hinweis

Ein Benutzer mit mehreren aktiven Mitgliedschaften und einer Anfrage, die keine nennt, verhält sich identisch zu einem Benutzer ohne Mitgliedschaften: Die Mitgliedschaftstabelle wird nie herangezogen, um eine Vorgabe zu wählen. Die Auswahl fällt direkt auf das ältere Kennzeichen des Kontos (Zeile 5), und ist auch das leer, trägt der Token gar keine Organisation. Mitgliedschaften spielen erst eine Rolle, nachdem eine Organisation bereits ausdrücklich genannt wurde. Dann wird requireMembershipForTokens geprüft und, falls zutreffend, ein automatischer Beitritt versucht.

Domain-Festlegung

Eine eigene Domain kann auf eine Organisation festgelegt werden, sodass diese Domain zum eigenen Eingang der Organisation wird. Die Festlegung wird von der Middleware zur Mandantenauflösung sowohl für GET /connect/authorize (an den Query-String angehängt) als auch für POST /connect/par durchgesetzt (dort wird stattdessen der übermittelte Body umgeschrieben, da PAR seine Parameter aus der gespeicherten Nutzlast liest). Den vollständigen Mechanismus beschreibt Eigene Domains.

PUT /api/v1/custom-domains/{domain}/organization
PUT /api/v1/custom-domains/auth.acme.com/organization
Content-Type: application/json

{ "organizationId": "org_7fa2c9e1..." }

Eine festgelegte Domain lehnt eine widersprüchliche Anfrage ab

Eine Anfrage, die eine andere Organisation als die Festlegung nennt, wird direkt mit 400 access_denied abgelehnt, noch bevor eine Anmeldeseite angezeigt wird. Ohne das könnte eine Relying Party einen eigenen organization-Parameter senden, und die Festlegung wäre rein dekorativ.

Auf Organisationen beschränkte Verbindungen

Eine SAML- oder OIDC-Verbindung kann zu einer Organisation gehören. Die Anmeldung darüber wählt diese Organisation aus und legt eine Mitgliedschaft im Status active an, wenn der Benutzer keine hat. Eine Zeile im Status invited wird angenommen: Sie wird active und behält ihre Rollen und den Einladenden, sodass ein Eingeladener, der sich über seinen IdP anmeldet, die E-Mail nie braucht. Ein Mitglied im Status suspended bleibt gesperrt und wird bei der Token-Ausstellung abgelehnt. Das hängt weder von allowAutoMembership noch von Domains ab, denn die Organisation wurde bereits durch die Verbindung gewählt.

Der Organisationsname auf der Anmeldeseite

Die Anmeldeseite zeigt unter dem App-Namen Anmeldung bei {name}. Der Name stammt von derselben Organisation, von der auch das Branding der Seite stammt: zuerst die Organisation der festgelegten Domain, dann die Organisation, die die Authorize-Anfrage nennt, dann die einzige beschränkte Organisation des Clients. Er wird ausgeblendet, wenn es keine Organisation gibt oder wenn der Name der Organisation dem App-Namen entspricht, sodass die Kopfzeile nie „Acme / Anmeldung bei Acme“ lautet.

Branding-Überschreibung

Das brandingJson einer Organisation wird für die Anmeldeseite Feld für Feld über das Branding des Mandanten gelegt: Ein vorhandener Schlüssel mit Wert überschreibt, ein fehlender oder leerer Schlüssel erbt, und ein unbekannter Schlüssel wird ignoriert. Fehlerhaftes JSON fällt auf das eigene Branding des Mandanten zurück und protokolliert eine Warnung, die Seite lädt aber immer.

Der Tab Branding bearbeitet alle 21 zusammenführbaren Felder: Erscheinungsbild (appName, logoUrl, primaryColor, customCssUrl), Farben für den hellen und dunklen Modus, E-Mail-Farben, supportEmail, showForgotPassword, poweredBy und languages. Jedes Feld erbt entweder den Wert des Mandanten, als Hinweis angezeigt, oder überschreibt ihn, mit einer Schaltfläche Löschen, die den Schlüssel entfernt.

showRegistration kann nicht überschrieben werden

Die Einstellung des Mandanten für die öffentliche Registrierung hat bereits entschieden, ob eine Registrierung angeboten wird, und der Registrierungsendpunkt setzt das unabhängig vom Branding durch. Eine Organisation ist für diese Entscheidung nicht maßgeblich, daher ist dieses eine Feld von der Zusammenführung ausgenommen und hat im Tab Branding kein Bedienelement.

Nachtragen aus dem älteren Organisationskennzeichen

Bevor es Organisationen gab, konnte ein Benutzer ein Freitext-Organisationskennzeichen ohne zugehörigen Datensatz tragen. POST /api/v1/organizations/backfill überführt das in echte Organisationen und Mitgliedschaften, gruppiert nach jedem einzelnen älteren Wert. Es handelt sich um einen Probelauf, sofern der Body nicht { "dryRun": false } lautet.

  • Begrenzt: durchsucht pro Aufruf höchstens 50.000 Benutzer. Eine Antwort mit truncated bedeutet, dass Sie den Aufruf erneut ausführen sollten. Bereits migrierte Benutzer werden bei der Wiederholung übersprungen.
  • Idempotent: Ein bereits migrierter älterer Wert wird über einen internen Stempel erkannt, nicht über den (bearbeitbaren) Anzeigenamen der Organisation. Eine spätere Umbenennung der entstandenen Organisation führt daher beim nächsten Lauf nicht zu einem Duplikat.
Beispielantwort (Probelauf)
{
  "dryRun": true,
  "organizationsCreated": 3,
  "membershipsCreated": 41,
  "usersSkipped": 0,
  "organizations": [
    { "legacyValue": "acme-corp", "slug": "acme-corp", "users": 22 }
  ],
  "truncated": false
}

Rundgang durch die Portal-Oberfläche

Die Seite Organisationen listet alle Organisationen des Mandanten auf, jeweils 50 mit einer Schaltfläche Mehr laden. Sie bietet Neue Organisation (nur Slug und Name; Richtlinien-Flags, Domains und Branding werden anschließend gesetzt) und einen Ablauf Backfill aus Feld der Legacy-Organisation, der das obige Nachtragen zuerst als Vorschau und anschließend mit Anwenden ausführt.

Organizations list showing slug, name, and created-date columns, with New Organisation and Backfill from legacy organisation field controls

Die Organisationsliste zeigt jede Kundenorganisation des Mandanten mit Slug, Name und Erstellungsdatum

Die Detailseite jeder Organisation hat drei Tabs: Allgemein (Name, schreibgeschützter Slug, die drei Richtlinien-Schalter, eine Karte E-Mail-Domains zum Hinzufügen, Verifizieren und Entfernen von E-Mail-Domains und zum Kopieren des TXT-Eintrags sowie ein Löschen, das die Eingabe des Slugs zur Bestätigung verlangt), Branding (jedes überschreibbare Feld, das entweder den Wert des Mandanten erbt oder ihn überschreibt) und Mitglieder (Hinzufügen per E-Mail, mit dem Angebot einer Einladung, wenn noch kein Konto existiert, Statusänderung und Entfernen pro Zeile, mit Mehr laden).

Organization detail page's Members tab showing invited, active, and suspended member rows with per-row status control

Der Tab Mitglieder listet jede Mitgliedschaft mit ihrem Status und einem Bedienelement pro Zeile zum Ändern oder Entfernen

Organization detail page's Branding tab with each overridable field showing either the tenant's inherited value or an override with a Clear control

Der Tab Branding überschreibt das Branding der Anmeldeseite des Mandanten für diese Organisation Feld für Feld

Die Seite Domains enthält die Auswahl Domain → Organisation: Jede Domain-Karte hat ein eingebettetes Dropdown mit den Organisationen des Mandanten sowie der Option „Mandant (keine)“, die die Festlegung aufhebt. Die Änderung wird sofort übernommen. Dieselbe Auswahl erscheint beim Hinzufügen einer Domain.

Domain card showing the inline organisation selector that pins a custom domain to one organisation

Die eingebettete Organisationsauswahl auf einer Domain-Karte legt diese eigene Domain auf eine Organisation fest

Audit-Ereignisse

organization.created · organization.updated · organization.deleted · organization.member.added · organization.member.invited · organization.member.joined · organization.member.updated · organization.member.removed · organization.domain_added · organization.domain_verified · organization.domain_removed · organization.backfill · domain.organization_set

Seitenweise Abruf

Die Organisationsliste und die Mitgliederliste werden per Cursor seitenweise abgerufen und antworten mit { items, nextCursor }. Übergeben Sie limit (Standard 50, begrenzt auf 1 bis 200) und, nach der ersten Seite, den nextCursor der vorherigen Antwort unverändert als cursor. Ein nextCursor von null kennzeichnet die letzte Seite. Der Cursor ist eine opake Keyset-Position über der Organisations-ID (bei Mitgliedern über der Benutzer-ID), sodass das Hinzufügen oder Entfernen von Zeilen zwischen den Aufrufen keine Seite verschieben oder wiederholen kann. Ein Cursor, den die Liste nicht ausgegeben hat, führt zu 400 invalid_cursor.

Organisationen über einen KI-Assistenten verwalten

Das gehostete Portal-MCP stellt dreizehn Organisations-Tools bereit, die alle die Rolle Tenant-Admin erfordern: Organisationen auflisten, abrufen, erstellen, aktualisieren und löschen; Mitglieder auflisten, hinzufügen, aktualisieren und entfernen; E-Mail-Domains hinzufügen, verifizieren und entfernen; und die Organisationen eines Benutzers auflisten. Sie rufen dieselben Operationen auf wie die obige API, sodass ein Tool nicht von seiner Route abweichen kann. Siehe Ihr Portal über einen KI-Assistenten bedienen.

Ein Issuer pro Host

Jeder Host eines Mandanten ist sein eigener OIDC-Issuer. Wurde der Request-Host über die Domain-Tabelle des Mandanten aufgelöst, ist der Issuer, ebenso wie jede vom Discovery-Dokument beworbene Endpunkt-URL, https://{host}. Jede aktive eigene Domain bestätigt also ihr eigenes iss, und der kanonische Mandanten-Host bleibt unverändert. Signaturschlüssel gelten pro Mandant, daher liefert jeder Host denselben Schlüsselsatz. Dadurch kann ein Mandant mehrere Kunden bedienen, jeden auf seiner eigenen Domain mit eigenem Branding, festgelegt auf seine eigene Organisation. Siehe Eigene Domains.

E-Mail-Konfiguration

Konfigurieren Sie, wie Ihr Mandant Transaktions-E-Mails sendet, etwa für Verifizierung, Passwort-Reset und Einladungen. Wählen Sie zwischen dem gemeinsamen Standardabsender, einer verifizierten eigenen Domain über Resend oder Ihrem eigenen SMTP-Server.

Email settings showing provider options (default, Resend domain, custom SMTP) and a test-send

Lokalisierte E-Mails

Transaktions-E-Mails werden in der bevorzugten Sprache des Empfängers gesendet. E-Mails für Verifizierung, Passwort-Reset, bestehendes Konto, Willkommen, Einladung, Kontolöschung, Support und Abrechnung sind in elf Sprachen vorlagenbasiert: Englisch, Deutsch, Französisch, Spanisch, Portugiesisch, Vietnamesisch, vereinfachtes Chinesisch, Japanisch, Arabisch, Hindi und Afrikaans. Existiert für die Sprache des Empfängers keine Vorlage, fällt die E-Mail auf Englisch zurück.

Die Sprache wird beim Versand aus der gespeicherten Präferenz des Empfängers ermittelt. Diese Präferenz kann aus mehreren Quellen stammen:

  • Registrierung und Anmeldung — erfasst aus der Sprache, die der Benutzer auf den gehosteten Anmeldebildschirmen gewählt hat.
  • Die Benutzer-Seite im Portal — von einem Administrator beim Erstellen oder Bearbeiten eines Benutzers festgelegt.
  • SCIM-Provisionierung: abgebildet aus preferredLanguage (oder locale) des IdP, wenn Benutzer per SCIM synchronisiert werden.
  • Die Self-Service-Kontoseite — vom Benutzer selbst unter /login/account gewählt.

Keine Konfiguration erforderlich

Die Lokalisierung erfolgt automatisch und gilt für jeden Provider-Modus (Standard, Resend-eigene-Domain und SMTP). Es muss nichts aktiviert werden.

E-Mail-Anbieter

AnbieterBeschreibungEinrichtung
Authagonal (Default)E-Mails werden von [email protected] über unsere gemeinsame Resend-Infrastruktur gesendet.Keine Konfiguration erforderlich — funktioniert sofort.
Custom Domain (Resend)E-Mails werden von Ihrer eigenen verifizierten Domain über Resend gesendet.Domain registrieren, DNS-Einträge hinzufügen, Eigentümerschaft verifizieren.
Custom SMTPE-Mails werden über Ihren eigenen SMTP-Server gesendet.SMTP-Host, -Port, Zugangsdaten und TLS-Einstellungen angeben.

Absenderidentität

Absender-E-Mail und -Name werden über alle Anbieter-Modi hinweg geteilt. Die Absender-E-Mail ist für die Anbieter Eigene Domain (Resend) und Eigener SMTP-Server erforderlich; der Absendername fällt auf den App-Namen aus dem Branding zurück, wenn leer.

FeldBeschreibung
emailSenderEmailDie From-Adresse für ausgehende E-Mails. Muss im Modus Eigene Domain (Resend) auf einer verifizierten Domain liegen.
emailSenderNameAnzeigename, der im Posteingang des Empfängers angezeigt wird.

Resend Custom Domain

Verifizieren Sie Ihre Versanddomäne einmalig bei Resend und verwenden Sie sie dann als Absenderadresse für diesen Mandanten. Die DNS-Einträge (SPF, DKIM) werden im Bereich Eigene Absenderdomain unter Einstellungen → E-Mail angezeigt; Resend prüft sie, wenn Sie auf <strong>Verifizierung prüfen</strong> klicken.

Eigenes SMTP

Bringen Sie Ihren eigenen SMTP-Server mit — nützlich für interne Relays, Anbieter ohne Resend-Abdeckung oder regulatorische Bindung.

FeldBeschreibung
smtpHostSMTP-Server-Hostname (z. B. smtp.example.com).
smtpPortVerbindungsport, Standard 587. TLS wird per STARTTLS ausgehandelt; implizites TLS auf Port 465 wird nicht unterstützt. Verwenden Sie 25 für nicht authentifizierte interne Relays.
smtpUsernameAuth-Benutzername (optional — leer lassen für nicht authentifizierte Relays).
smtpPasswordAuth-Passwort. Verschlüsselt im Tenant-Settings-Secret gespeichert.
smtpUseTlsTLS erforderlich. Lassen Sie es aktiviert, es sei denn, Sie zielen auf ein vertrauenswürdiges internes Relay ab.

Eigene Versanddomäne

Mit dem Anbieter Eigene Domain (Resend) können Sie Ihre eigene Domain registrieren, damit E-Mails von Ihrer Marke (z. B. [email protected]) statt @authagonal.io gesendet werden.

  1. Gehen Sie zu Einstellungen → E-Mail und wählen Sie den Anbieter Eigene Domain (Resend).
  2. Geben Sie Ihren Domainnamen ein und klicken Sie auf Domain registrieren.
  3. Fügen Sie die angezeigten DNS-Einträge (DKIM, SPF und Return-Path) zu Ihrem Domain-DNS hinzu.
  4. Klicken Sie auf Verifizierung prüfen — sobald das DNS propagiert ist (meist 1–10 Minuten), wechselt der Domain-Status auf verifiziert.

DNS-Propagation

DNS-Änderungen können bis zu 48 Stunden brauchen, um sich global zu verbreiten, die meisten Anbieter aktualisieren jedoch innerhalb von Minuten. Sie können die Verifizierung beliebig oft prüfen.

Testen

Verwenden Sie die Schaltfläche Test-E-Mail senden unter Einstellungen → E-Mail, um Ihre Konfiguration zu überprüfen. Eine Test-E-Mail wird mit den aktuell gespeicherten Einstellungen an Ihre Admin-E-Mail-Adresse gesendet.

Audit-Protokoll

Das Audit-Protokoll bietet eine schreibgeschützte Aufzeichnung aller administrativen Aktionen, die auf Ihrem Mandanten durchgeführt wurden. Jede über das Portal oder die API vorgenommene Änderung wird mit vollständigem Kontext erfasst und bietet einen lückenlosen Nachweis für Compliance und Fehlerbehebung.

Protokollspalten

SpalteBeschreibung
ZeitstempelDatum und Uhrzeit, zu der die Aktion ausgeführt wurde
AkteurDie E-Mail-Adresse des Administrators, der die Aktion ausgeführt hat, oder "system" für automatisierte Aktionen
AktionDie Art der ausgeführten Aktion (z. B. Client erstellt, Einstellungen aktualisiert)
EntitätDas Ziel der Aktion im Format typ:id (z. B. client:my-app)
DetailZusätzlicher Kontext zur Änderung

Erfasste Aktionen

Die folgenden administrativen Aktionen werden im Audit-Protokoll erfasst:

KategorieAktionen
ClientsClient erstellt, Client aktualisiert, Client gelöscht
SSO-VerbindungenSAML-Verbindung erstellt, SAML-Verbindung gelöscht, OIDC-Verbindung erstellt, OIDC-Verbindung gelöscht
BenutzerBenutzer erstellt, Benutzer aktualisiert
EinstellungenEinstellungen aktualisiert, Branding aktualisiert
DomainsDomain hinzugefügt, Domain verifiziert, Domain gelöscht
SCIMSCIM-Token erstellt, SCIM-Token widerrufen
RollenRolle erstellt, Rolle aktualisiert, Rolle gelöscht
GruppenGruppe erstellt, Gruppe gelöscht
TeamTeammitglied eingeladen, Teammitglied entfernt
Audit log table showing timestamped administrative actions with actor, action, entity, and detail columns

Das Audit-Protokoll bietet eine vollständige Aufzeichnung aller administrativen Aktionen

Aufbewahrung

Audit-Protokolle werden 365 Tage lang aufbewahrt und können weder geändert noch gelöscht werden. Um sie länger aufzubewahren, aktivieren Sie den automatischen Export auf der Registerkarte Export der Seite Audit-Protokoll.

Datensicherungen

Authagonal sichert Ihre Mandantendaten automatisch stündlich. Datensicherungen umfassen alle Benutzer, Gruppen, Rollen, Clients, SSO-Verbindungen, SCIM-Tokens, Branding und Einstellungen. Sie können den Sicherungsverlauf einsehen und die neueste vollständige Datensicherung auf der Seite Datensicherungen herunterladen.

Backups page showing backup history with timestamps, types, and entity counts

So funktionieren Datensicherungen

  • Einmal täglich werden die stündlichen inkrementellen Sicherungen zu einer neuen vollständigen Datensicherung zusammengefasst, und sonntags werden die täglichen vollständigen Sicherungen zu einer wöchentlichen Datensicherung zusammengefasst. Sieben tägliche und vier wöchentliche Datensicherungen werden aufbewahrt.
  • Inkrementelle Datensicherungen laufen stündlich und erfassen nur die Zeilen, die sich seit der letzten Datensicherung geändert haben.
  • Datensicherungen werden in Azure Blob Storage mit der gleichen Managed Identity gespeichert, die Ihr Mandant verwendet.
  • Gelöschte Datensätze werden über Tombstones verfolgt und aus Auditgründen in Datensicherungen eingeschlossen.

Datensicherungen herunterladen

Klicken Sie auf „Neueste herunterladen", um eine ZIP-Datei mit der neuesten Vollsicherung zusammengeführt mit allen nachfolgenden inkrementellen Datensicherungen zu erhalten. Jede Tabelle wird als JSONL-Datei exportiert (ein JSON-Objekt pro Zeile).

Backup-Format

Datensicherungen werden als JSONL (JSON Lines) exportiert — eine Entität pro Zeile pro Tabelle. Dieses Format ist einfach zu parsen, zu diffen und in andere Systeme zu importieren.

Bereitstellungs-Apps

Provisioning-Apps sind Ihre eigenen Dienste. Authagonal ruft sie auf, sobald ein Benutzer angelegt wird, damit sie ein Konto einrichten, eine Lizenz zuweisen, über die Zugehörigkeit des Benutzers zu einer Organisation entscheiden oder die Registrierung ganz ablehnen können.

Funktionsweise

Wird ein Benutzer angelegt, ruft Authagonal die Callback-URL Ihrer Provisioning-App nach dem Muster TCC (Try/Confirm/Cancel) auf. Jede App muss in der Try-Phase zustimmen, bevor eine davon festgeschrieben wird. So können sich mehrere nachgelagerte Systeme einig werden oder eines kann ein Veto einlegen, ohne dass halb angelegte Konten zurückbleiben.

PhaseEndpunktZweck
/tryPOST {callbackUrl}/tryPrüft, ob die App den Benutzer verarbeiten kann. 200 zurückgeben, um zu akzeptieren, oder 4xx, um abzulehnen.
/confirmPOST {callbackUrl}/confirmBestätigt den Vorgang, nachdem alle Apps die /try-Phase akzeptiert haben.
/cancelPOST {callbackUrl}/cancelMacht den Vorgang rückgängig, wenn eine andere App während der /try-Phase fehlschlägt.

Wann das Provisioning ausgeführt wird

Das Provisioning läuft auf jedem Pfad, der einen Benutzer anlegt, nicht nur bei der Selbstregistrierung. Bereits provisionierte Kombinationen aus App und Benutzer werden übersprungen, sodass eine App jeden Benutzer genau einmal sieht.

ErstellungspfadWann er ausgelöst wird
POST /api/auth/registerSelbstregistrierung
SAML-ACS-CallbackErste SSO-Anmeldung eines neuen Benutzers (JIT)
OIDC-CallbackErste SSO-Anmeldung eines neuen Benutzers (JIT)
POST /scim/v2/UsersEin Connector provisioniert einen Benutzer aus dem Verzeichnis des Kunden
Benutzererstellung in Portal und AdminEin Operator legt einen Benutzer manuell an oder lädt ihn ein

Die Try-Anfrage

Authagonal sendet dieses JSON per POST an <code>{callbackUrl}/try</code>. Felder ohne Wert werden weggelassen und nicht als null gesendet.

FeldTypBeschreibung
transactionIdstringIdentifiziert diese Provisioning-Transaktion. Derselbe Wert wird an /confirm und /cancel gesendet. Halten Sie Ihre Arbeit also unter diesem Wert bereit und schreiben Sie sie fest oder verwerfen Sie sie, sobald dieser Aufruf eintrifft.
userIdstringDie Authagonal-ID des Benutzers. Dies ist das Subject, das Sie in seinen Tokens sehen.
emailstringDie E-Mail-Adresse des Benutzers.
firstNamestringVorname, sofern der Erstellungspfad einen geliefert hat.
lastNamestringNachname, sofern der Erstellungspfad einen geliefert hat.
organizationIdstringDie Organisation, in der sich der Benutzer bereits befindet, sofern vorhanden. Nur enthalten, wenn zuvor etwas eine Organisation zugewiesen hat. Bei einer ersten Registrierung fehlt das Feld, und das ist Ihr Signal, eine zuzuweisen.
customAttributesobjectDie gespeicherten benutzerdefinierten Attribute des Benutzers. Bei einem per SSO angelegten Benutzer gehört dazu federated_connection, der Name der Verbindung, die für ihn gebürgt hat.

Der häufige Fall, für den sich Planung lohnt, ist ein über SSO eintreffender Benutzer: Er hat noch keine Organisation, und federated_connection sagt Ihnen, von welchem Ihrer Kunden er kommt.

Try-Anfrage für einen Benutzer, der über eine SSO-Verbindung eintrifft
{
  "transactionId": "8f14e45fceea167a5a36dedd4bea2543",
  "userId": "0f6b1c8e-3d2a-4f51-9e77-2c1a4b5d6e7f",
  "email": "[email protected]",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "customAttributes": {
    "federated_connection": "acme-okta"
  }
}

Die Try-Antwort

Ihre App antwortet mit 200 und einem JSON-Body. Der Body ist nicht nur eine Bestätigung: Über ihn weist eine nachgelagerte App die Organisation und die Attribute zu, die in den Tokens des Benutzers landen.

FeldTypBeschreibung
approvedbooleanOb diese App den Benutzer akzeptiert. Fehlt das Feld, gilt true. False lehnt die Registrierung ab, und das neue Konto wird gelöscht.
reasonstringWarum der Benutzer abgelehnt wurde. Wird dem Aufrufer des Erstellungspfads angezeigt.
organizationIdstringDie Organisation, zu der dieser Benutzer gehört. Sie wird am Benutzer gespeichert und als Claim org_id in dessen Tokens ausgegeben. Sie wird nur übernommen, wenn der Benutzer noch keine hat. Damit gewinnt die App, die zuerst antwortet, und spätere Apps sehen diese Zuweisung.
customAttributesobjectAttribute, die schlüsselweise mit dem Benutzer zusammengeführt werden. In Tokens ausgegeben werden sie über die UserClaims-Konfiguration eines Scopes.
emailVerifiedbooleanIhre App bürgt dafür, dass sie diese Adresse verifiziert hat, etwa durch das Einlösen einer an sie gesendeten Einladung. Authagonal markiert das Konto als bestätigt und verschickt keine eigene Bestätigungs-E-Mail.
Try-Antwort, die eine Organisation zuweist
{
  "approved": true,
  "organizationId": "org_acme",
  "customAttributes": { "org_role": "member" }
}

Daher stammt org_id

Das Organisationskennzeichen des Kontos, und damit der Claim org_id, wenn eine Anfrage keine Organisation nennt, ist genau das, was Ihre Provisioning-App als organizationId zurückgegeben hat. Ist es die ID einer Organisation im Mandanten, tragen Tokens org_id, org_slug und org_name dieser Organisation, und eine deaktivierte Organisation verweigert die Anmeldung. Jeder andere Wert wird unverändert als org_id ausgegeben, ohne Eindeutigkeitsregel und ohne Formatvorgabe. Die Rückgabe einer Organisations-ID erstellt keine Mitgliedschaft. Sie können das Kennzeichen auch direkt mit PUT /api/v1/users/{userId} setzen und mit GET /api/v1/users?organizationId= danach filtern.

Benutzer mit der richtigen Organisation kennzeichnen

Entscheiden Sie über die Organisation hier, an einer Stelle, statt an jedem einzelnen Erstellungspfad. Ein SSO-Benutzer bringt federated_connection mit. Das benennt die Verbindung, die ihn authentifiziert hat, und damit den Kunden, und es bleibt richtig, wenn ein Kunde mehrere E-Mail-Domains föderiert. Ein eingeladener Benutzer hat keine Verbindung, ordnen Sie ihn deshalb über die von Ihnen ausgestellte Einladung zu. Beide Pfade erreichen /try, bevor der Benutzer existiert, sodass eine einzige Logik beide abdeckt und es keine zwei Regeln gibt, die auseinanderdriften können.

Die Organisation im Try-Callback auflösen
// POST {callbackUrl}/try
app.post('/provisioning/try', async (req, res) => {
  const { email, customAttributes } = req.body;

  // An SSO user carries the connection that vouched for them. That is the
  // customer, and it stays right when one customer has several domains.
  const connection = customAttributes?.federated_connection;

  const org = connection
    ? await orgByConnection(connection)
    : await orgByPendingInvite(email);

  if (!org) return res.json({ approved: false, reason: 'No organization for this user' });

  // Stamped on the user and emitted as org_id on every token from now on.
  res.json({ approved: true, organizationId: org.id });
});

Eine Ablehnung löscht das Konto

Antwortet eine App mit approved: false, wird der soeben angelegte Benutzer gelöscht, damit kein halb provisioniertes Konto zurückbleibt. Die API-Erstellungspfade geben 422 mit Ihrer reason zurück, die SAML- und OIDC-Callbacks geben 400 zurück. Geben Sie approved: true für einen Benutzer zurück, für den Sie nichts zu tun haben.

Bereitstellungs-App hinzufügen

Um eine Bereitstellungs-App hinzuzufügen, geben Sie App-Name und Callback-URL an, optional einen API-Schlüssel und optional ein Try-Timeout (Sekunden, Standard 60, Bereich 5 bis 300; Confirm und Cancel verwenden ein festes kurzes Timeout). Der API-Schlüssel wird als Bearer-Token im Authorization-Header jeder Webhook-Anfrage gesendet, sodass Ihre App Anfragen von Authagonal authentifizieren kann.

Testen

Klicken Sie auf Testen neben einer Bereitstellungs-App, um eine Testanfrage an Ihre Callback-URL zu senden. Die Testergebnisse zeigen den HTTP-Statuscode und den Antworttext, damit Sie überprüfen können, ob Ihre App Webhooks korrekt empfängt und verarbeitet.

Provisioning apps page showing configured apps with test results displaying HTTP status and response body

Bereitstellungs-Apps testen, um Webhook-Zustellung und Antwortverarbeitung zu überprüfen

Tarif-Limits

Die maximale Anzahl an Bereitstellungs-Apps ist pro Mandant konfigurierbar, mit einem Standardlimit von 6. Dieses Limit kann von einem Administrator angepasst werden, wenn Ihr Workflow zusätzliche Bereitstellungsziele erfordert.

API-Schlüssel-Authentifizierung

Wenn ein API-Schlüssel gesetzt ist, wird er als Bearer-Token im Authorization-Header gesendet. Verwenden Sie dies, um Webhook-Anfragen von Authagonal zu authentifizieren.

Team

Die Teamseite verwaltet Portal-Administratoren: die Personen, die über das Verwaltungsportal auf Ihren Mandanten zugreifen und ihn konfigurieren können. Jedes Teammitglied hat eine Rolle (Owner, Admin, Developer oder Support), die festlegt, was es ändern darf.

Administratorenliste

Die Administratorenliste zeigt den Namen, die E-Mail-Adresse, die Rolle und das Hinzufügedatum jedes Teammitglieds. Ein "Sie"-Indikator wird neben der Zeile des aktuellen Benutzers angezeigt, damit Sie Ihr eigenes Konto leicht identifizieren können.

Administratoren einladen

Um ein neues Teammitglied einzuladen, geben Sie dessen E-Mail-Adresse, Namen und Rolle an. Die Person erhält eine E-Mail mit einem Link, um ihr Passwort festzulegen und ihr Konto zu aktivieren; der Link ist 7 Tage gültig.

Einladungsfelder

Admin-Einladungen erstellen ein ausstehendes Konto und senden dem Eingeladenen per E-Mail einen Aktivierungslink.

FeldBeschreibung
emailE-Mail-Adresse des neuen Admins. Muss im Mandanten eindeutig sein.
nameAnzeigename in der Adminliste.
roleZu vergebende Rolle: tenant:admin, tenant:developer oder tenant:support. Standard ist tenant:admin. Die Owner-Rolle kann nicht per Einladung vergeben werden.

Administratoren entfernen

Der Owner des Mandanten kann neben einem Teammitglied auf Entfernen klicken, um dessen Zugriff zu widerrufen. Ein Bestätigungsdialog wird angezeigt, bevor die Entfernung abgeschlossen wird. Sie können sich nicht selbst entfernen, und der Mandant behält immer seinen Owner.

Team page showing the admin list with name, email, date added columns, a You indicator, and invite/remove controls

Portal-Administratoren über die Teamseite verwalten

Eigentümerschaft

Jeder Mandant hat einen Owner. Nur der Owner kann Teammitglieder entfernen oder die Eigentümerschaft übertragen, und zwar über Zum Owner machen bei einem anderen Mitglied; der bisherige Owner wird dann Admin.

Support

Eröffnen Sie ein Support-Ticket beim Authagonal-Team, ohne das Portal zu verlassen. Jedes Ticket ist eine verkettete Konversation, sodass Sie und unser Team vom ersten Bericht bis zur Lösung auf demselben Stand bleiben.

Ihre Tickets

Die Support-Seite listet jedes Ticket auf, das Sie eingereicht haben — die neueste Aktivität zuerst. Am Status-Badge erkennen Sie auf einen Blick, was bei Ihnen liegt und was bei uns.

Support ticket list showing each ticket's subject, status badge, priority, and last-activity time, with a New ticket button

Ihre Support-Tickets mit Betreff, Status, Priorität und letzter Aktivität

  • Jede Zeile zeigt den Betreff, den aktuellen Status (offen, ausstehend, gelöst oder geschlossen), die Priorität und den Zeitpunkt der letzten Aktivität.
  • Klicken Sie auf Neues Ticket, um eines zu eröffnen, und geben Sie ihm dann einen Betreff, eine Priorität und Ihre erste Nachricht.
  • Farbcodierte Status-Badges machen es einfach, die Liste nach Tickets zu durchsuchen, die Ihre Aufmerksamkeit brauchen.

Ein Ticket-Verlauf

Beim Öffnen eines Tickets sehen Sie die vollständige Konversation. Antworten erscheinen der Reihe nach, und neue Nachrichten unseres Teams tauchen ohne erneutes Laden der Seite auf.

Support ticket thread showing the conversation between the customer and the Authagonal team with a reply box and file attachment control

Ein Ticket-Verlauf zwischen Ihnen und dem Authagonal-Team

  • Verkettete Nachrichten zwischen Ihnen und dem Authagonal-Team werden in chronologischer Reihenfolge angezeigt.
  • Antworten Sie direkt inline und hängen Sie Dateien an, um Logs, Screenshots oder Konfigurationen zu teilen.
  • Der Verlauf aktualisiert sich live, sodass eine Antwort unseres Teams erscheint, sobald sie gesendet wird.
  • Wenn Sie stattdessen auf eine Benachrichtigungs-E-Mail antworten, wird Ihre Nachricht automatisch in den Verlauf eingefügt.

Wie Antworten Sie erreichen

Das Authagonal-Team bearbeitet Tickets von der Admin-Seite aus. Sie werden per E-Mail benachrichtigt, wann immer das Team antwortet, sodass Sie das Portal nicht offen halten müssen, um bei einer Konversation auf dem Laufenden zu bleiben.

Support-Desk für Ihre Benutzer

Getrennt von dem Support, den Sie von uns erhalten, kann Authagonal einen Support-Desk für Ihre Endbenutzer betreiben. Sie eröffnen Tickets auf ihren Kontoseiten unter dem eigenen gebrandeten Host Ihres Mandanten, und Ihr Team beantwortet sie im Portal.

Es gibt ihn, weil genau die Leute, die sich nicht anmelden können, ein Support-Werkzeug nicht erreichen, das eine Anmeldung verlangt. Der Desk sitzt neben den Login-Seiten, ein ausgesperrter Benutzer hat also weiterhin einen Weg hinein, und jedes Ticket kommt bereits an ein echtes Konto in Ihrem Verzeichnis gebunden an, statt an irgendeine Adresse, die jemand eingetippt hat.

Einschalten

Öffnen Sie im Portal Kundensupport, wechseln Sie zur Registerkarte Einstellungen und aktivieren Sie Kundensupport aktivieren. Die Registerkarte steht Ownern und Admins zur Verfügung. Bis Sie das tun, ist für Ihre Benutzer nichts davon sichtbar.

EinstellungWas sie bewirkt
Kundensupport aktivierenDer Hauptschalter. Aus sind sowohl die Endbenutzerseiten als auch der Posteingang Ihrer Support-Mitarbeiter verborgen, und ihre APIs antworten mit 404.
Anfragen von abgemeldeten Besuchern zulassenErlaubt einem abgemeldeten Besucher, ein Ticket zu eröffnen, was der ausgesperrte Fall ist. Durch eine Bot-Prüfung geschützt, und der Austausch läuft per E-Mail plus einem privaten Link weiter, da es kein Konto zum Anmelden gibt.
E-Mail-BenachrichtigungenWer per E-Mail benachrichtigt wird, wenn ein Ticket eintrifft oder ein Benutzer antwortet: niemand, bestimmte Adressen oder Ihr gesamtes Support-Team (Owner, Admins und Support), damit niemand den Posteingang beobachten muss.
Default customer languageDie Sprache, die für einen Benutzer angenommen wird, wenn wir seine noch nicht kennen, für seine Tickets und E-Mails. Die eigene gespeicherte Sprache eines Benutzers hat immer Vorrang, und ist nichts festgelegt, gilt Englisch. Diese Einstellung befindet sich auf der Registerkarte <strong>Allgemein</strong> der Einstellungen.
Support-Webhook-URLEine URL, an die Ticket-Ereignisse per POST gesendet werden, um sie in Ihre eigenen Werkzeuge zu übernehmen.

Im kostenlosen Tarif nicht enthalten

Der Support-Desk ist die eine Fähigkeit, die der kostenlose Tarif nicht enthält, weil eingehende E-Mails und Übersetzung echte Kosten pro Nutzung verursachen. Jeder kostenpflichtige Tarif hat ihn. Authentifizierungsfunktionen werden nie auf diese Weise beschränkt: Single Sign-on, SCIM, Multi-Faktor, eigene Domains, Branding und Audit sind in jedem Tarif enthalten, auch im kostenlosen.

Was Ihre Benutzer sehen

Angemeldete Benutzer erhalten auf ihren Kontoseiten unter Ihrem Mandanten-Host einen Support-Bereich mit Ihrem Branding. Sie können ein Ticket eröffnen, alles einsehen, was sie eröffnet haben, und in einem Verlauf antworten. Antworten Ihres Teams kommen zusätzlich per E-Mail an, ein Benutzer muss also nicht ständig nachsehen.

Sind anonyme Tickets aktiviert, kann auch jemand, der sich nicht anmelden kann, eines eröffnen. Er gibt eine E-Mail-Adresse und seine Nachricht an und erhält einen privaten Link zur Konversation zurück. Dieser Link ist der einzige Zugang, behandeln Sie ihn also wie ein Credential: er ist nicht zu erraten, und wer ihn hat, kann diesen einen Verlauf lesen und darin antworten.

Der Posteingang für Ihre Support-Mitarbeiter

Ihr Team antwortet über Kundensupport im Seitenmenü des Portals. Das ist ein anderer Ort als Ihre eigenen Tickets bei uns, und er steht der Rolle tenant:support und höher offen, Sie können einem Mitarbeiter also Zugang zum Desk geben, ohne ihm den Rest des Portals zu geben.

AktionWas sie bewirkt
AntwortenIn den Verlauf schreiben. Der Benutzer erhält eine E-Mail und sieht es live, wenn er die Seite offen hat.
ZuweisenEin Ticket einem namentlich benannten Mitglied Ihres Teams geben, damit nicht zwei Personen dasselbe beantworten.
Status und PrioritätEin Ticket durch offen, ausstehend, gelöst und geschlossen bewegen und markieren, wie dringend es ist. Geschlossene Tickets werden nach einer Aufbewahrungsfrist gelöscht, statt für immer aufbewahrt zu werden.
Interne NotizenNotizen, die nur für Ihr Team sichtbar sind, nie für den Benutzer. Änderungen und Löschungen werden im Audit-Protokoll festgehalten.
Im Namen eines Benutzers eröffnenEinen Verlauf mit einem Ihrer Benutzer beginnen, indem Sie ihn aus Ihrem Verzeichnis auswählen, für den Fall, dass die Konversation woanders begonnen hat.
An Authagonal eskalierenStellt sich heraus, dass ein Ticket Authagonal betrifft und nicht Ihr Produkt, eskalieren Sie es. Das eröffnet ein verknüpftes Ticket bei unserem Team, wahlweise mit dem bisherigen Verlauf, und verbindet beide, sodass Sie beiden folgen können. Ein Ticket kann nur einmal eskaliert werden.

Benutzer schreiben in ihrer eigenen Sprache

Ein Ticket wird in der Sprache gespeichert, in der der Benutzer es geschrieben hat, und jede Person im Verlauf liest es in ihrer eigenen. Ihr Mitarbeiter sieht eine Nachricht, die in seine Portalsprache übersetzt ist, der Benutzer sieht Ihre Antwort in seine übersetzt, und der Originaltext wird immer daneben aufbewahrt. Die Sprache wird aus der ersten Nachricht erkannt und am Ticket festgehalten. Übersetzungen werden einmal pro Sprache berechnet und wiederverwendet, ein langer Verlauf übersetzt sich also nicht immer wieder neu.

Zeitzonen

Ein Ticket hält die Zeitzone fest, aus der der Benutzer es eröffnet hat. Jede Nachricht zeigt dann dessen Ortszeit neben Ihrer, sodass eine Antwort um 14:32 als die 02:32 zu lesen ist, die sie für die wartende Person tatsächlich war. Nichts wird angezeigt, wenn die Zone unbekannt ist, etwa bei einem Ticket, das per E-Mail kam, oder wenn sie mit Ihrer übereinstimmt.

Webhooks

Setzen Sie eine Support-Webhook-URL, um Ticket-Ereignisse zu erhalten, sobald sie eintreten, etwa um einen Alarm auszulösen oder Tickets in Ihr eigenes System zu spiegeln. Die Payloads sind signiert, sodass Sie prüfen können, dass sie von uns stammen.

EreignisWas sie bewirkt
support.ticket.createdEin Benutzer hat ein Ticket eröffnet.
support.ticket.messageEine Nachricht wurde in einem Verlauf gepostet, von einem Benutzer oder von einem Ihrer Support-Mitarbeiter. fromStaff in der Payload gibt an, von wem.
support.ticket.status_changedDer Status eines Tickets hat sich geändert, zum Beispiel auf gelöst.
support.ticket.assignedEin Ticket wurde einem Teammitglied zugewiesen.

Importieren & migrieren

Migrieren Sie ein bestehendes Identitätssystem in Ihren Authagonal-Mandanten. Zwei Quellen werden unterstützt — Duende IdentityServer (eine SQL-Server-Datenbank) und Auth0 (die Management API). Jede führt eine schreibgeschützte Vorschau aus, damit Sie genau prüfen können, was kopiert wird, bevor Sie etwas übernehmen.

Import aus Duende IdentityServer

Migrieren Sie Clients, Scopes, Benutzer und Rollen aus einer bestehenden Duende-IdentityServer-SQL-Server-Datenbank in Ihren Authagonal-Mandanten. Der Import läuft in zwei Phasen — Vorschau und Commit — damit Sie prüfen können, was kopiert wird, bevor etwas geschrieben wird.

Was importiert wird

Der Importer liest aus Duendes ConfigurationDb und den ASP.NET-Identity-Tabellen und schreibt die zugeordneten Zeilen in Ihren Mandanten. Kurzlebige Artefakte wie Persisted Grants, Device Codes und Signaturschlüssel werden übersprungen.

EntitätQuelltabellenHinweise
ClientsClients, ClientSecrets, ClientGrantTypes, ClientScopes, ClientRedirectUrisDeaktivierte Clients werden deaktiviert importiert. Abgelaufene Secrets werden übersprungen.
GeltungsbereicheApiScopes, ApiResources, IdentityResourcesBenutzer-Claim-Zuordnungen werden übernommen, soweit erkannt.
BenutzerAspNetUsers, AspNetUserClaimsPasswort-Hashes (ASP.NET Identity V3) werden unverändert kopiert und beim ersten Login neu gehasht.
RollenAspNetRoles, AspNetUserRolesRollenzuweisungen bleiben erhalten.
Externe AnmeldungenAspNetUserLoginsZur Referenz gespeichert; externe IdPs nach dem Import über SSO neu verbinden.

Vorschau vor Commit

Fügen Sie Ihren Verbindungs-String zur ConfigurationDb / IdentityDb ein und klicken Sie auf Vorschau starten. Die Vorschau öffnet eine Read-only-Verbindung und zählt jede Zeile, die importiert würde. Es wird nichts geschrieben.

  • Anzahl der Entitäten für Clients, Geltungsbereiche, Benutzer, Rollen und Rollenzuweisungen.
  • Kollisionswarnungen, wenn der Ziel-Mandant bereits Clients (Clients mit übereinstimmender ClientId werden überschrieben), Rollen oder Geltungsbereiche (übereinstimmende Namen werden übersprungen) besitzt.
  • Warnungen für unbekannte Tabellen und nicht zugeordnete Spalten, damit klar ist, was verworfen wird.
Import preview panel showing entity counts and warnings before committing the import

Vorschaupanel mit Zählern und Warnungen

Passwort-Hashes

Duende speichert Passwörter im ASP.NET-Identity-V3-Format (PBKDF2). Authagonals PasswordHasher verifiziert dieses Format direkt und rehasht bei der ersten erfolgreichen Anmeldung in das native Format — Benutzer behalten ihre bestehenden Passwörter ohne Reset-Flow.

Abgleich der Benutzer-ID

Wenn ein Benutzer, der bereits in diesem Mandanten vorhanden ist, dieselbe E-Mail wie ein eingehender Datensatz hat, rotiert der Import die userId dieses Kontos vor dem Import auf den Quell-sub, damit die importierten Rollen, Anmeldungen und Claims dem bestehenden Konto zugeordnet werden und Apps, die den Benutzer bereits über seinen Quell-sub referenzieren, nach der Umstellung weiterhin auflösen. Das bestehende Passwort und Profil des Kontos bleiben erhalten; die Quell-Rollen werden darüber zusammengeführt. Die Vorschau listet jedes Konto auf, das abgeglichen wird, bevor Sie den Import bestätigen.

Import ausführen

Klicken Sie nach Prüfung der Vorschau auf Import starten. In der Commit-Phase werden Clients, Geltungsbereiche, Benutzer, Rollen und externe Anmelde-Referenzen in Ihre Mandanten-Stores geschrieben. Clients mit übereinstimmender clientId werden überschrieben; Einträge mit übereinstimmendem scope name, email oder role name werden übersprungen, sodass der Importer mehrfach ausführbar ist.

Was nicht importiert wird

  • Persisted Grants, Device Codes, Server-Side Sessions — kurzlebig, werden automatisch neu erzeugt.
  • Signaturschlüssel — Authagonal gibt pro Mandant eigene Schlüssel aus.
  • Eigene Spalten und Tabellen — alles außerhalb des Duende-Standardschemas wird als Warnung ausgegeben, damit klar ist, dass diese Daten verworfen werden.
  • Deaktivierte Clients — werden deaktiviert importiert; bei Bedarf über die Seite Clients wieder aktivieren.

Nicht im Sandbox-Modus verfügbar

Der Import läuft nur gegen den Live-Mandanten. Verlassen Sie den Sandbox-Modus vor dem Import.

Import aus Auth0

Verbinden Sie Authagonal mit der Management API Ihres Auth0-Mandanten und übernehmen Sie Ihre Anwendungen, APIs, Rollen, Benutzer und Enterprise-Verbindungen. Importierte Benutzer- und Anwendungs-IDs bleiben erhalten, sodass bestehende sub- und client_id-Referenzen nach dem Umzug weiterhin aufgelöst werden.

Was Sie benötigen

Erstellen Sie in Auth0 eine Machine-to-Machine-Anwendung, die für die Management API autorisiert ist und über folgende Lese-Scopes verfügt: read:users, read:clients, read:resource_servers, read:roles, read:connections, read:client_grants. Tragen Sie deren Domain, Client-ID und Client-Secret in das Importformular ein — sie werden ausschließlich für den Import verwendet.

Was importiert wird

EntitätQuelltabellenHinweise
Anwendungenclients, client-grantsPublic vs. confidential wird automatisch erkannt. Client-Secrets werden neu gehasht, damit sie weiter funktionieren.
APIs & Geltungsbereicheresource-serversAudiences und Geltungsbereiche werden jedem Client aus seinen Grants zugewiesen.
Rollenroles + ZuweisungenPro-Benutzer-Rollenzuweisungen bleiben erhalten.
Benutzerusers + identitiesProfile und Metadaten werden übertragen; Social-/Enterprise-Identitäten werden zu verknüpften Logins.
Verbindungenconnections (OIDC)Enterprise-OIDC-Verbindungen werden zu föderierten Providern. SAML-, Social- und Datenbank-Verbindungen werden mit einer Warnung übersprungen.

Passwörter

Die Management API von Auth0 gibt niemals Passwort-Hashes zurück. Wenn Sie über Auth0s support-gestützten Bulk-Passwortexport (NDJSON) verfügen, stellen Sie diesen bereit — bcrypt-Hashes werden unverändert importiert und Ihre Benutzer behalten ihre Passwörter ohne Reset. Diese Datei enthält außerdem Ihren vollständigen Benutzerbestand und hebt damit Auth0s Listenlimit von 1.000 Benutzern in der API auf. Ohne sie werden Benutzer als Profile importiert und legen beim ersten Login ein neues Passwort fest.

Gleiche Vorschau, Rotation und Limits

Die oben beschriebene Vorschau, die Rotation der owner-userId, der wiederholbare Commit und die Sandbox-Einschränkung gelten auch für Auth0-Importe.

API-Referenz

Jeder Mandant stellt einen standardkonformen OIDC-Server unter https://{slug}.authagonal.io bereit. Alle Endpunkte folgen den OAuth 2.0- und OpenID Connect-Spezifikationen. Diese Referenz deckt jeden Endpunkt ab, mit dem Ihre Anwendung möglicherweise interagieren muss.

OIDC Authorization Code Flow with PKCE: sequence diagram showing the 9-step flow between your app, the browser, and Authagonal

Authorization Code Flow mit PKCE

OIDC-Ermittlung & JWKS

Das Discovery-Dokument ermöglicht es OIDC-Client-Bibliotheken, sich automatisch zu konfigurieren. Für keinen der beiden Endpunkte ist eine Authentifizierung erforderlich.

GET /.well-known/openid-configuration

Gibt das OpenID Provider Configuration-Dokument zurück. Die Antwort enthält alle Metadaten, die Ihr Client für die Interaktion mit diesem Mandanten benötigt.

FeldBeschreibung
issuerDie Issuer-URL des Mandanten
authorization_endpointURL für Autorisierungsanfragen
token_endpointURL für den Token-Austausch
userinfo_endpointURL zum Abrufen von Benutzer-Claims
jwks_uriURL für das JSON Web Key Set
revocation_endpointURL für Token-Widerruf
introspection_endpointURL für Token-Introspection
end_session_endpointURL für Logout / Sitzungsbeendigung
device_authorization_endpointURL für Geräteautorisierungsanfragen
pushed_authorization_request_endpointURL des Pushed Authorization Request-Endpunkts (RFC 9126).
require_pushed_authorization_requestsOb der Mandant PAR global vorschreibt. Auch wenn dies false ist, können einzelne Clients RequirePushedAuthorizationRequests = true setzen.
scopes_supportedListe der unterstützten Geltungsbereiche
response_types_supportedUnterstützte Antworttypen
grant_types_supportedUnterstützte Grant-Typen
code_challenge_methods_supportedUnterstützte PKCE-Methoden (S256)
backchannel_logout_supportedOb Back-Channel-Logout unterstützt wird

GET /.well-known/openid-configuration/jwks

Gibt das JSON Web Key Set zurück, das zur Überprüfung von Token-Signaturen verwendet wird. Die Antwort enthält ein keys-Array mit öffentlichen EC-P-256-Schlüsseln (Tokens werden mit ES256 signiert), die jeweils die Felder kty (EC), use, kid, alg, crv, x und y enthalten.

Fetch discovery document
curl https://acme.authagonal.io/.well-known/openid-configuration

Autorisierungsendpunkt

GET /connect/authorize

Leitet einen Authorization-Code-Flow ein. Der Benutzer muss eine aktive Sitzung haben, andernfalls wird er zur Anmeldeseite weitergeleitet. Bei Erfolg wird der Benutzer mit einem Authorization Code zu Ihrer Anwendung zurückgeleitet.

ParameterErforderlichBeschreibung
response_typeJaMuss "code" sein
client_idJaIhr registrierter Client-Bezeichner
redirect_uriJaMuss exakt mit einer registrierten Redirect-URI übereinstimmen
scopeJaLeerzeichen-getrennte Liste von Geltungsbereichen (z. B. "openid profile email")
stateEmpfohlenOpaker Wert für CSRF-Schutz, wird unverändert in der Weiterleitung zurückgegeben
code_challengeErforderlich bei PKCEBase64url-kodierter SHA-256-Hash des code_verifier
code_challenge_methodErforderlich bei PKCEMuss "S256" sein
nonceOptionalWert, der an das ID-Token gebunden wird, zum Schutz vor Replay-Angriffen
login_hintOptionalDas E-Mail-Feld auf der Anmeldeseite vorausfüllen

Erfolgsantwort: 302-Weiterleitung zu redirect_uri mit code- und state-Query-Parametern.

Fehlerantwort: 302-Weiterleitung mit error-, error_description- und state-Query-Parametern.

PKCE erforderlich

PKCE ist standardmäßig für alle Clients erforderlich. Generieren Sie einen code_verifier (eine zufällige Zeichenkette mit 43 oder mehr Zeichen), hashen Sie ihn mit SHA-256 und kodieren Sie das Ergebnis in Base64url, um den code_challenge zu erstellen.

Pushed Authorization Requests (PAR)

RFC 9126. Statt jeden Authorize-Parameter in die URL zu packen, sendet Ihr Client diese per POST an /connect/par mit normaler Client-Authentifizierung und erhält eine kurzlebige opake request_uri zurück. Der Browser ruft anschließend /connect/authorize?client_id=...&request_uri=... auf — sonst landet nichts in Browser-Historie, Server-Logs oder Referer-Headern, und der Server hat die Parameter unter Client-Authentifizierung bereits integritätsgeprüft.

POST /connect/par

Die Client-Authentifizierung ist identisch zu /connect/token: HTTP Basic mit client_id/client_secret oder formularkodierte Anmeldedaten. Public Clients senden ohne Secret. Der Body trägt dieselben Parameter, die Sie normalerweise an /connect/authorize schicken würden; request_uri selbst wird abgelehnt (das Verketten eines PAR ist laut §2.1 der Spezifikation verboten). Liefert 201 Created.

ParameterErforderlichBeschreibung
client_idJaIhre Client-ID. Muss mit dem authentifizierten Client übereinstimmen.
client_secretVertrauliche ClientsIhr Client-Secret. Erforderlich für vertrauliche Clients.
response_typeJaMuss "code" sein
redirect_uriJaMuss exakt mit einer registrierten Redirect-URI übereinstimmen
scopeJaLeerzeichen-getrennte Liste von Geltungsbereichen (z. B. "openid profile email")
code_challengeErforderlich bei PKCEBase64url-kodierter SHA-256-Hash des code_verifier
code_challenge_methodErforderlich bei PKCEMuss "S256" sein
stateEmpfohlenOpaker Wert für CSRF-Schutz, wird unverändert in der Weiterleitung zurückgegeben
nonceOptionalWert, der an das ID-Token gebunden wird, zum Schutz vor Replay-Angriffen

Antwort

FeldBeschreibung
request_uriEinmalige opake Referenz, z. B. <code>urn:ietf:params:oauth:request_uri:abc123…</code>. Übergeben Sie sie als <code>request_uri</code> an <code>/connect/authorize</code>.
expires_inLebensdauer der <code>request_uri</code> in Sekunden. Standard ist 90 — typischer Wert von Referenz-IdPs.

Beim folgenden GET /connect/authorize?client_id=…&request_uri=… werden alle weiteren Parameter aus dem gepushten Payload gezogen; zusätzliche Query-Parameter werden ignoriert. Die client_id beim Authorize-Aufruf muss mit dem Client übereinstimmen, der die Anfrage gepusht hat. Sobald sie konsumiert ist (oder expires_in abläuft), wird die request_uri aus dem Speicher entfernt.

PAR pro Client erzwingen

Aktivieren Sie Pushed Authorization Requests erzwingen bei einem Client (Portal, Clients, Client öffnen, Registerkarte Sicherheit), um einfache /connect/authorize-Aufrufe von ihm abzulehnen. Die empfohlene Konfiguration für hochsensible Clients kombiniert RequirePushedAuthorizationRequests = true mit PKCE, was die URL-Leiste vollständig als Angriffsfläche eliminiert.
Push an authorization request and follow up
# 1. Push parameters (server returns request_uri + expires_in)
curl -X POST https://acme.authagonal.io/connect/par \
  -u "my-app:CLIENT_SECRET" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "response_type=code" \
  -d "redirect_uri=https://app.example.com/callback" \
  -d "scope=openid profile email" \
  -d "state=$(openssl rand -hex 16)" \
  -d "code_challenge=YOUR_CODE_CHALLENGE" \
  -d "code_challenge_method=S256"

# 2. Send the user to /authorize with only client_id + request_uri
# https://acme.authagonal.io/connect/authorize?client_id=my-app&request_uri=urn:ietf:params:oauth:request_uri:abc123...

Token-Endpunkt

POST /connect/token

Tauscht Anmeldedaten gegen Tokens aus. Anfragen müssen Content-Type: application/x-www-form-urlencoded verwenden. Die Client-Authentifizierung kann über HTTP Basic Auth (Authorization: Basic base64(client_id:client_secret)) oder als Formular-Body-Parameter (client_id + client_secret) bereitgestellt werden.

Authorization Code Grant

ParameterErforderlichBeschreibung
grant_typeJa"authorization_code"
codeJaDer Authorization Code aus der Weiterleitung
redirect_uriJaMuss mit der in der Autorisierungsanfrage verwendeten URI übereinstimmen
code_verifierErforderlich bei PKCEDie ursprüngliche Zufallszeichenkette, die zur Generierung des code_challenge verwendet wurde
client_idJaIhr Client-Bezeichner (wenn nicht Basic Auth verwendet wird)
client_secretVertrauliche ClientsIhr Client-Secret (wenn nicht Basic Auth verwendet wird)

Refresh Token Grant

ParameterErforderlichBeschreibung
grant_typeJa"refresh_token"
refresh_tokenJaDas auszutauschende Refresh-Token
client_idJaIhr Client-Bezeichner
client_secretVertrauliche ClientsIhr Client-Secret

Client Credentials Grant

ParameterErforderlichBeschreibung
grant_typeJa"client_credentials"
client_idJaIhr Client-Bezeichner
client_secretJaIhr Client-Secret
scopeOptionalLeerzeichen-getrennte Geltungsbereiche zum Anfordern

Device Code Grant

ParameterErforderlichBeschreibung
grant_typeJa"urn:ietf:params:oauth:grant-type:device_code"
device_codeJaDer Device Code aus der Geräteautorisierungsantwort
client_idJaIhr Client-Bezeichner
client_secretVertrauliche ClientsIhr Client-Secret

Token-Antwort:

FeldBeschreibung
access_tokenDas Access-Token für API-Aufrufe
token_type"Bearer"
expires_inToken-Lebensdauer in Sekunden
id_tokenOpenID Connect ID-Token (wenn der openid-Scope angefordert wird)
refresh_tokenRefresh-Token (wenn der offline_access-Scope gewährt wird)
Exchange authorization code with PKCE
curl -X POST https://acme.authagonal.io/connect/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code" \
  -d "code=AUTHORIZATION_CODE" \
  -d "redirect_uri=https://app.example.com/callback" \
  -d "client_id=my-app" \
  -d "code_verifier=YOUR_CODE_VERIFIER"

UserInfo-Endpunkt

GET /connect/userinfo

Gibt Claims über den authentifizierten Benutzer zurück. Erfordert ein gültiges Access-Token mit dem openid-Geltungsbereich.

FeldTypBeschreibung
substringEindeutiger Benutzerbezeichner
emailstringE-Mail-Adresse des Benutzers
email_verifiedbooleanOb die E-Mail verifiziert wurde
given_namestringVorname
family_namestringNachname
namestringVollständiger Anzeigename
phone_numberstringTelefonnummer (falls angegeben). Wird unter dem Geltungsbereich <code>phone</code> ausgegeben.
org_idstringDie Organisation, zu der der Benutzer gehört. Wird von Ihrer eigenen Provisioning-App zugewiesen (siehe Provisioning-Apps) oder mit PUT /api/v1/users/{userId} gesetzt; Authagonal leitet sie niemals ab. Wird unter dem Scope profile freigegeben und fehlt, wenn der Benutzer keine hat.
rolesstring[]Array der zugewiesenen Rollen. Wird nur ausgegeben, wenn das Token den Geltungsbereich <code>roles</code> enthält.
groupsobject[]Array der Gruppenmitgliedschaften, jeweils mit id und name. Wird nur ausgegeben, wenn das Token den Geltungsbereich <code>groups</code> enthält.
Fetch user info
curl https://acme.authagonal.io/connect/userinfo \
  -H "Authorization: Bearer ACCESS_TOKEN"

Token Introspection (RFC 7662)

POST /connect/introspect

Validiert ein Token und gibt seine Metadaten zurück. Erfordert Client-Anmeldedaten (Basic Auth oder Formular-Body-Parameter).

ParameterErforderlichBeschreibung
tokenJaDas zu untersuchende Token
token_type_hintOptionalHinweis auf den Token-Typ (z. B. "refresh_token")

Antwort für aktives Token:

FeldBeschreibung
activetrue
subSubjekt (Benutzer-ID)
client_idClient, für den das Token ausgestellt wurde
scopeLeerzeichen-getrennte gewährte Geltungsbereiche
issAussteller
expAblaufzeit (Unix-Zeitstempel)
iatAusstellungszeit (Unix-Zeitstempel)
audZielgruppe
token_typeToken-Typ (z. B. "Bearer")

Antwort für inaktives Token: { "active": false }

Immer 200 OK

Gemäß RFC 7662 antwortet der Introspection-Endpunkt für jedes Token mit 200 OK, sodass er nicht zur Enumeration von Tokens verwendet werden kann. Ein ungültiges, abgelaufenes oder widerrufenes Token gibt einfach active: false zurück. Die einzige Ausnahme betrifft den Aufrufer selbst: Ein Client, dessen Authentifizierung fehlschlägt, erhält 401 invalid_client.
Introspect a token
curl -X POST https://acme.authagonal.io/connect/introspect \
  -u "my-app:CLIENT_SECRET" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "token=ACCESS_OR_REFRESH_TOKEN"

Token-Widerruf (RFC 7009)

POST /connect/revocation

Widerruft ein zuvor ausgestelltes Token. Erfordert Client-Anmeldedaten.

ParameterErforderlichBeschreibung
tokenJaDas zu widerrufende Token
token_type_hintOptionalHinweis auf den Token-Typ (z. B. "refresh_token")

Der Endpunkt gibt gemäß der RFC 7009-Spezifikation immer 200 OK zurück, auch für ungültige oder bereits widerrufene Tokens.

Access- und Refresh-Tokens

Sowohl Refresh-Tokens als auch Access-Tokens können widerrufen werden. Der Widerruf eines Refresh-Tokens widerruft auch die daraus ausgestellten Access-Tokens. Ein widerrufenes Access-Token wird von Introspection und Userinfo abgelehnt, aber ein Resource Server, der das JWT lokal validiert, akzeptiert es weiterhin bis zu seinem Ablauf; halten Sie die Lebensdauer von Access-Tokens daher kurz.

Geräteautorisierung (RFC 8628)

POST /connect/deviceauthorization

Leitet den Geräteautorisierungsflow für eingabebeschränkte Geräte ein (CLIs, Smart-TVs, IoT-Geräte). Das Gerät zeigt dem Benutzer einen Code an, der die Anfrage dann auf einem separaten Gerät mit Browser genehmigt.

ParameterErforderlichBeschreibung
client_idJaIhr Client-Bezeichner
client_secretVertrauliche ClientsIhr Client-Secret
scopeOptionalLeerzeichen-getrennte Geltungsbereiche (Standard: "openid")

Antwort:

FeldBeschreibung
device_codeGeräte-Verifizierungscode (für Polling verwendet)
user_codeBenutzercode im Format XXXX-XXXX
verification_uriURL, die der Benutzer besucht, um den Code einzugeben
verification_uri_completeURL mit vorausgefülltem user_code
expires_inStandardmäßig 300 (Sekunden, der Code ist also 5 Minuten gültig). Pro Client einstellbar.
interval5 (Sekunden — minimales Polling-Intervall)

Genehmigungsablauf: Der Benutzer besucht die verification_uri, gibt den user_code ein und genehmigt die Anfrage. Währenddessen pollt das Gerät den Token-Endpunkt mit dem device_code.

Polling-Fehlercodes:

FehlerBedeutung
authorization_pendingDer Benutzer hat noch nicht genehmigt — weiter pollen
expired_tokenDer Device Code ist abgelaufen — Flow neu starten
access_deniedDer Benutzer hat die Autorisierungsanfrage abgelehnt
Request device authorization
curl -X POST https://acme.authagonal.io/connect/deviceauthorization \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id=my-cli" \
  -d "scope=openid profile email"

Sitzung beenden / Logout

GET POST /connect/endsession

Meldet die aktuelle Benutzersitzung ab, benachrichtigt jeden Client mit registrierter Back-Channel- oder Front-Channel-Logout-URI und widerruft die an diese Sitzung gebundenen Grants. Ohne einen id_token_hint, der zur aktuellen Sitzung passt, wird der Benutzer zuerst gebeten, die Abmeldung zu bestätigen.

ParameterErforderlichBeschreibung
id_token_hintOptionalDas ID-Token — wird zur Validierung der post_logout_redirect_uri verwendet
post_logout_redirect_uriOptionalWohin nach dem Logout weitergeleitet wird (muss registriert sein)
stateOptionalOpaker Wert, der in der Weiterleitung zurückgegeben wird

Wenn eine gültige post_logout_redirect_uri angegeben wird und mit einer registrierten URI übereinstimmt, erhält der Benutzer eine 302-Weiterleitung. Andernfalls bestätigt eine JSON-Antwort, dass die Sitzung beendet wurde.

Back-Channel-Logout

Wenn sich ein Benutzer abmeldet, sendet Authagonal ein signiertes JWT an die BackChannelLogoutUri jedes Clients. Das JWT enthält sub, aud, iss und den http://schemas.openid.net/event/backchannel-logout-Event-Claim. Ihre Anwendung sollte die lokale Sitzung des Benutzers ungültig machen, wenn sie diese Benachrichtigung erhält.

SCIM 2.0 API-Referenz

Authagonal unterstützt das SCIM 2.0-Protokoll für die automatisierte Benutzer- und Gruppenbereitstellung. Identity Provider wie Okta, Azure AD und OneLogin können diese API verwenden, um Ihren Authagonal-Mandanten mit Ihrem Unternehmensverzeichnis synchron zu halten.

Basis-URL: https://{slug}.authagonal.io/scim/v2

Authentifizierung: Alle Anfragen erfordern ein Bearer-Token. Generieren Sie ein SCIM-Token im Portal auf der Seite SCIM: Wählen Sie den Client aus, für den Ihr IdP bereitstellt, und klicken Sie dann auf Token erstellen.

Allgemeine Header:

HeaderWert
AuthorizationBearer SCIM_TOKEN
Content-Typeapplication/scim+json

Listen-Endpunkte akzeptieren count (Standard 100, max. 200; 0 gibt nur die Gesamtzahl zurück) und Filterung über den filter-Parameter (z. B. userName eq "[email protected]"). Benutzer werden mit cursor paginiert: Übergeben Sie den nextCursor der vorherigen Antwort. Gruppen akzeptieren entweder startIndex (1-basiert) oder cursor.

Benutzer

GET /scim/v2/Users: Benutzer mit optionaler Paginierung und Filterung auflisten.

Query-ParameterBeschreibung
startIndexFür Benutzer wird nur 1 akzeptiert; paginieren Sie stattdessen mit cursor. Ein größerer Wert gibt 400 invalidValue zurück.
cursorOpaker Paginierungs-Cursor: Übergeben Sie den nextCursor der vorherigen Seite, um die nächste Seite zu erhalten
countMaximale Anzahl von Ergebnissen pro Seite (Standard: 100, max.: 200; 0 gibt nur die Gesamtzahl zurück)
filterSCIM-Filterausdruck (z. B. userName eq "[email protected]")

GET /scim/v2/Users/{id}: Einen einzelnen Benutzer anhand seiner Authagonal-Benutzer-ID abrufen.

POST /scim/v2/Users: Einen neuen Benutzer erstellen. Gibt 201 Created zurück.

FeldErforderlichBeschreibung
userNameJaE-Mail-Adresse (muss innerhalb des Mandanten eindeutig sein)
name.givenNameNeinVorname
name.familyNameNeinNachname
displayNameNeinVollständiger Anzeigename
activeNeinOb der Benutzer aktiv ist (Standard: true)
externalIdNeinBezeichner vom vorgelagerten Identity Provider

PUT /scim/v2/Users/{id}: Vollständiger Ersatz einer Benutzerressource. Alle Felder müssen angegeben werden.

PATCH /scim/v2/Users/{id}: Teilweise Aktualisierung mittels SCIM PatchOp.

OperationUnterstützte PfadeBeispielwert
replaceuserName, active, name.givenName, name.familyName, displayName, externalId, preferredLanguagetrue / false oder ein Zeichenkettenwert
adduserName, active, name.givenName, name.familyName, displayName, externalId, preferredLanguagetrue / false oder ein Zeichenkettenwert
removename.givenName, name.familyName, displayName, externalId, preferredLanguage(kein Wert erforderlich)

DELETE /scim/v2/Users/{id}: Löscht den Benutzer vorläufig (deaktiviert das Konto und widerruft alle Tokens). Gibt 204 No Content zurück.

Create a user via SCIM
curl -X POST https://acme.authagonal.io/scim/v2/Users \
  -H "Authorization: Bearer SCIM_TOKEN" \
  -H "Content-Type: application/scim+json" \
  -d '{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "userName": "[email protected]",
    "name": {
      "givenName": "Jane",
      "familyName": "Smith"
    },
    "displayName": "Jane Smith",
    "active": true,
    "externalId": "ext-12345"
  }'

Gruppen

GET /scim/v2/Groups: Alle Gruppen mit optionaler Paginierung und Filterung auflisten.

GET /scim/v2/Groups/{id}: Eine einzelne Gruppe anhand der ID abrufen, einschließlich ihrer Mitgliederliste.

POST /scim/v2/Groups: Eine neue Gruppe erstellen. Gibt 201 Created zurück.

FeldErforderlichBeschreibung
displayNameJaAnzeigename der Gruppe
membersNeinArray von Mitgliedsobjekten, jeweils mit einem value-Feld, das die Benutzer-ID enthält
externalIdNeinBezeichner vom vorgelagerten Identity Provider

PUT /scim/v2/Groups/{id}: Vollständiger Ersatz einer Gruppenressource (einschließlich ihrer Mitgliederliste).

PATCH /scim/v2/Groups/{id}: Teilweise Aktualisierung: Mitglieder hinzufügen, entfernen oder ersetzen oder displayName und externalId ändern.

DELETE /scim/v2/Groups/{id}: Löscht die Gruppe endgültig. Gibt 204 No Content zurück.

Add members to a group via PATCH
curl -X PATCH https://acme.authagonal.io/scim/v2/Groups/GROUP_ID \
  -H "Authorization: Bearer SCIM_TOKEN" \
  -H "Content-Type: application/scim+json" \
  -d '{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [
      {
        "op": "add",
        "path": "members",
        "value": [
          { "value": "USER_ID_1" },
          { "value": "USER_ID_2" }
        ]
      }
    ]
  }'

SCIM-Fehlerantworten

Wenn eine SCIM-Anfrage fehlschlägt, folgt der Antwortkörper dem SCIM-Fehlerschema: { "schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"], "status": "400", "detail": "..." }. Häufige Statuscodes sind 400 (ungültige Anfrage), 404 (Ressource nicht gefunden), 409 (Konflikt / Duplikat) und 429 (Ratenbegrenzung).

Portal API (Automatisierung)

Mit der Portal API kann Ihr eigenes Backend alles automatisieren, was Sie im Portal tun können — Benutzer, Clients, Gruppen, Rollen, Geltungsbereiche, SSO-Verbindungen und Einstellungen verwalten — über eine Machine-to-Machine-Berechtigung. Es ist dieselbe API, die auch die Portal-Oberfläche aufruft.

Basis-URL: https://portal-api.<your-domain>/api/v1. Anfragen authentifizieren sich mit einem Bearer-Access-Token; der Mandant wird dem Token entnommen, nicht der URL.

API-Zugangsdaten erstellen

Öffnen Sie im Portal Clients → Create API credential, wählen Sie eine Zugriffsebene und vergeben Sie einen Namen. Authagonal erzeugt einen für die Portal API konfigurierten OAuth-client_credentials-Client und gibt eine Client-ID und ein Secret zurück.

Kopieren Sie das Secret sofort

Das Client-Secret wird nur einmal angezeigt, direkt nach der Erstellung. Speichern Sie es in Ihrem Secret-Manager, bevor Sie den Dialog schließen — wenn Sie es verlieren, löschen Sie die Zugangsdaten und erstellen Sie neue.

Zugriffsebenen

GeltungsbereichBerechtigungen
tenant:ownerVollzugriff, einschließlich destruktiver, ausschließlich dem Owner vorbehaltener Aktionen wie das Löschen des gesamten Mandanten.
tenant:adminAlles verwalten außer Owner-exklusiven Aktionen — Benutzer, Clients, SSO, Gruppen, Rollen, Branding und Einstellungen.
tenant:developerClients, Geltungsbereiche, Branding und Bereitstellungs-Apps verwalten.
tenant:supportBenutzer für Support-Aufgaben lesen und verwalten sowie das Audit-Protokoll lesen.

Sie können nur gewähren, was Sie selbst besitzen

Zugangsdaten können nicht mehr Berechtigungen haben als die Person, die sie erstellt. Ein Administrator kann keine Owner-Zugangsdaten erstellen, und der administrative Geltungsbereich der Plattform kann niemals an Zugangsdaten vergeben werden.

Token abrufen

Tauschen Sie die Zugangsdaten am Token-Endpunkt Ihres Admin-Mandanten gegen ein Access-Token — https://<your-tenant>.<your-domain>/connect/token — und senden Sie das Token anschließend als Bearer-Header an die Portal API. Tokens sind eine Stunde lang gültig.

Token abrufen und dann die API aufrufen
# 1. Exchange the credential for an access token (your tenant's token endpoint)
curl -X POST https://acme.authagonal.io/connect/token \
  -d grant_type=client_credentials \
  -d client_id=api-3f2a... \
  -d client_secret=YOUR_CLIENT_SECRET \
  -d scope=tenant:admin

# Response: { "access_token": "ey...", "token_type": "Bearer", "expires_in": 3600 }

# 2. Call the Portal API with the access token
curl https://portal-api.authagonal.io/api/v1/users \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Endpunkte

Alle Pfade sind relativ zur Basis-URL und erfordern ein Bearer-Zugriffstoken. Der Geltungsbereich neben jeder Gruppe ist die minimale Zugriffsebene, die die Anmeldedaten benötigen. Die Paginierung unterscheidet sich je nach Ressource: Benutzer und das Audit-Protokoll nehmen count (1 bis 200, Standard 50) und after, gesetzt auf das continuationToken der vorherigen Antwort; Gruppen nehmen startIndex und count; Organisationen nehmen limit und cursor; Clients, Rollen und Geltungsbereiche geben alle Zeilen zurück.

Clientstenant:developer

GET/api/v1/clientsOAuth-Clients auflisten.

GET/api/v1/clients/{id}Einen einzelnen Client per ID abrufen.

POST/api/v1/clientsEinen Client erstellen. Gibt 201 mit dem Client-Datensatz zurück. Secrets werden hier nicht zurückgegeben: Erzeugen Sie eines mit POST /api/v1/clients/{clientId}/secrets, das es einmalig anzeigt.

PUT/api/v1/clients/{id}Einen Client aktualisieren (Redirect-URIs, Grant-Typen, Token-Lebensdauern, PKCE/PAR-Anforderungen).

DELETE/api/v1/clients/{id}Einen Client löschen.

POST/api/v1/clients/api-credentialEine Machine-to-Machine-Anmeldeinformation für die Portal-API erstellen.

Benutzertenant:support

GET/api/v1/usersBenutzer auflisten. Unterstützt count, search (E-Mail- / Namenspräfix), organizationId zum Filtern auf eine Organisation und after für Cursor-Paging.

GET/api/v1/users/countGesamtzahl der Benutzer des Mandanten.

GET/api/v1/users/stats/mfaStatistik zur MFA-Registrierung.

GET/api/v1/users/{id}Einen einzelnen Benutzer abrufen.

POST/api/v1/users/inviteEinen Benutzer per E-Mail einladen. Erstellt ein ausstehendes Konto und sendet per E-Mail einen Link, über den der Eingeladene sein eigenes Passwort festlegt. Die optionalen Felder organizationId und organizationRoles fügen zusätzlich eine Organisationsmitgliedschaft hinzu.

PUT/api/v1/users/{id}Einen Benutzer aktualisieren (Profil, E-Mail, isActive, emailConfirmed, organizationId). Das Ändern der E-Mail oder von emailConfirmed erfordert tenant:admin.

DELETE/api/v1/users/{id}Einen Benutzer löschen.

GET/api/v1/users/{id}/mfaGet a user's enrolled MFA methods.

DELETE/api/v1/users/{id}/mfaReset a user's MFA enrollment. Needs tenant:admin.

Rollentenant:admin

GET/api/v1/rolesRollen auflisten.

POST/api/v1/rolesEine Rolle erstellen.

DELETE/api/v1/roles/{id}Eine Rolle löschen.

POST/api/v1/roles/assignEinem Benutzer eine Rolle zuweisen.

POST/api/v1/roles/unassignEinem Benutzer eine Rolle entziehen.

Gruppentenant:admin

GET/api/v1/groupsGruppen auflisten.

GET/api/v1/groups/{id}Eine Gruppe mit ihren Mitgliedern abrufen.

POST/api/v1/groupsEine Gruppe erstellen.

POST/api/v1/groups/{id}/membersMitglieder zu einer Gruppe hinzufügen.

DELETE/api/v1/groups/{groupId}/members/{userId}Ein Mitglied aus einer Gruppe entfernen.

DELETE/api/v1/groups/{id}Eine Gruppe löschen.

GET/api/v1/group-role-mappingsGruppen-zu-Rollen-Zuordnungen auflisten (Rollen, die bei der Token-Ausstellung über die Gruppenmitgliedschaft gewährt werden).

Geltungsbereichetenant:developer

GET/api/v1/scopesAPI-Scopes auflisten.

POST/api/v1/scopesEinen Geltungsbereich erstellen.

DELETE/api/v1/scopes/{name}Einen Geltungsbereich löschen.

SSO-Verbindungentenant:admin

GET/api/v1/saml/connectionsSAML-Verbindungen auflisten.

POST/api/v1/saml/connectionsEine SAML-Verbindung erstellen.

DELETE/api/v1/saml/connections/{id}Eine SAML-Verbindung löschen.

GET/api/v1/oidc/connectionsOIDC-Verbindungen auflisten.

POST/api/v1/oidc/connectionsEine OIDC-Verbindung erstellen.

DELETE/api/v1/oidc/connections/{id}Eine OIDC-Verbindung löschen.

GET/api/v1/sso/domainsDie Domains auflisten, die an SSO-Verbindungen geleitet werden (Home-Realm-Discovery).

Brandingtenant:developer

GET/api/v1/brandingDas Mandanten-Branding abrufen (Farben, Logo, unterstützte Sprachen).

PUT/api/v1/brandingDas Mandanten-Branding aktualisieren.

Einstellungentenant:admin

GET/api/v1/settingsMandanteneinstellungen abrufen (Webhooks, öffentliche Registrierung, Token-Richtlinie).

PUT/api/v1/settingsMandanteneinstellungen aktualisieren.

POST/api/v1/settings/webhook-secret/regenerateDas Webhook-Signatur-Secret rotieren.

POST/api/v1/settings/test-emailEine Test-E-Mail mit der aktuellen E-Mail-Konfiguration senden.

Eigene Domains & E-Mailtenant:admin

GET/api/v1/custom-domainsEigene Login-Domains und deren Verifizierungsstatus auflisten.

POST/api/v1/custom-domainsEine eigene Domain hinzufügen.

POST/api/v1/custom-domains/{domain}/verifyDNS-Verifizierung für eine eigene Domain auslösen.

DELETE/api/v1/custom-domains/{domain}Eine eigene Domain entfernen.

GET/api/v1/email/domains/{domainId}Die DNS-Einträge und den Verifizierungsstatus einer Absender-E-Mail-Domain abrufen.

Audit-Logtenant:support

GET/api/v1/auditDas Audit-Log des Mandanten abfragen.

Benutzer per SCIM bereitstellen

Für die Massenbereitstellung von Benutzern und Gruppen aus einem IdP (Entra, Okta) verwenden Sie die SCIM-2.0-API statt dieser Endpunkte.

Beispiel: Benutzer einladen

POST /api/v1/users/invite
curl -X POST https://portal-api.authagonal.io/api/v1/users/invite \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "firstName": "Ada",
    "lastName": "Lovelace"
  }'

# 200 OK
# { "userId": "8f3a...", "email": "[email protected]" }

Alles, was die Oberfläche kann

Die Portal API stellt dieselben Endpunkte bereit, die die Portal-Oberfläche verwendet, sodass jede Operation, die Sie im Portal ausführen können, automatisiert werden kann — abhängig von der Zugriffsebene der Zugangsdaten.

Organisations-API

Alle folgenden Routen erfordern die Richtlinie TenantAdmin und liegen, sofern nicht anders angegeben, unter /api/v1/organizations. Wie Sie eine Anmeldeinformation erzeugen, beschreibt die Portal-API. Die beiden Listenrouten werden per Cursor seitenweise abgerufen: Übergeben Sie limit (Standard 50, 1 bis 200) und den vorherigen nextCursor als cursor. Sie antworten mit { items, nextCursor }, und ein ungültiger Cursor ergibt 400 invalid_cursor. Das Organisationsobjekt enthält eine schreibgeschützte Liste domains.

MethodePfadBodyHinweise
GET/api/v1/organizations–Eine Seite von Organisationen in ID-Reihenfolge. Query: cursor?, limit? (Standard 50, 1 bis 200). Liefert { items, nextCursor }. Ein nextCursor von null kennzeichnet die letzte Seite.
POST/api/v1/organizationsslug, name, brandingJson?, enabled?, requireMembershipForTokens?, allowAutoMembership?, metadata?201 + die Organisation. 409 slug_taken.
GET/api/v1/organizations/{idOrSlug}–Wird zuerst per ID, dann per Slug gesucht.
PUT/api/v1/organizations/{id}name?, brandingJson?, slug?, enabled?, requireMembershipForTokens?, allowAutoMembership?, metadata?Nur die genannten Felder ändern sich. Ein abweichender Slug wird abgelehnt: Er ist nach der Erstellung unveränderlich. domains kann hier nicht geändert werden.
DELETE/api/v1/organizations/{id}–Löscht zuerst alle Mitgliedschaften der Organisation, danach die Organisation selbst.
GET/api/v1/organizations/{id}/members–Eine Seite von Mitgliedschaften in Benutzer-ID-Reihenfolge, wobei E-Mail und Name des Mitglieds live aus dem Benutzerspeicher aufgelöst werden. Query: cursor?, limit?.
POST/api/v1/organizations/{id}/membersuserId? | email?, status?, roles?201 + die Mitgliedschaft. 404 user_not_found. 409 membership_exists. Reservierte tenant:*- und platform:*-Rollen werden mit 400 invalid_role abgelehnt, nicht entfernt.
PUT/api/v1/organizations/{id}/members/{userId}status?, roles?Wird der Status auf active gesetzt, wird joinedAt gestempelt, sofern es noch nicht gesetzt war.
DELETE/api/v1/organizations/{id}/members/{userId}–Entfernt die Zeile vollständig, keine Statusänderung.
POST/api/v1/organizations/{id}/domainsdomainBeansprucht eine E-Mail-Domain, unverifiziert. 201 + { domain, verified, verifiedAt, createdAt, recordName, recordValue }. 400 domain_invalid. 409 domain_exists, domain_taken.
POST/api/v1/organizations/{id}/domains/{domain}/verify–Schlägt den TXT-Eintrag bei recordName nach und gleicht recordValue exakt ab. 200 + die Domain bei Verifizierung (eine Wiederholung ist ein wirkungsloses 200). 409 verification_failed bei einem Fehlschlag. 409 domain_taken. 404 domain_not_found.
DELETE/api/v1/organizations/{id}/domains/{domain}–204. Hebt die Beanspruchung auf, ob verifiziert oder nicht. Bestehende Mitglieder bleiben erhalten. 404 domain_not_found.
POST/api/v1/organizations/backfilldryRun? = trueÜberführt das ältere Kennzeichen AuthUser.organizationId in echte Organization-/OrganizationMembership-Zeilen.
GET/api/v1/users/{userId}/organizations–Jede Organisation, zu der dieser Benutzer gehört, mit Status und Rollen in der jeweiligen Organisation.

Login-Seiten

Das sind die gehosteten Seiten, die Ihre Endnutzer auf dem Auth-Server Ihres Mandanten sehen. Authagonal liefert jede Seite einsatzbereit aus, sodass Sie ein vollständiges, sicheres Anmeldeerlebnis erhalten, ohne irgendeine UI zu bauen. Diese Seite führt durch jeden Bildschirm und zeigt, welche Portal-Einstellungen ihn steuern.

Vollständig White-Label

Jede Seite hier wird durch die Branding-Einstellungen Ihres Mandanten gestaltet — Ihr Logo, Ihre Farbe, Ihr App-Name und Ihr eigenes CSS. Die Seiten respektieren außerdem prefers-color-scheme und wechseln so zwischen hell und dunkel, passend zum Gerät des Nutzers.

Anmeldung

Hosted sign-in screen with an email field, Continue button, single sign-on provider buttons, and forgot-password and create-account links
  • E-Mail-zuerst, zweistufiger Ablauf: Der Nutzer gibt seine E-Mail-Adresse ein und klickt auf Weiter, dann erscheint das Passwortfeld.
  • „Weiter mit {provider}"-Single-Sign-on-Buttons erscheinen automatisch, sobald SSO-Verbindungen bestehen.
  • Links für Passwort vergessen und Konto erstellen, die sich jeweils ein- oder ausblenden lassen.
  • Optionales Cloudflare Turnstile-Captcha, um automatisierte Anmeldeversuche abzuwehren.

Im Portal-Admin gesteuert

  • Branding legt Logo, Farbe, App-Name, Support-E-Mail und eigenes CSS fest.
  • Blenden Sie die Links für Passwort vergessen und Registrierung ein oder aus (Branding).
  • SSO-Verbindungen fügen die Social-Sign-in-Buttons hinzu (SSO-Seite).
  • Sitzungsdauer und Sperrschwellen (Einstellungen → Sitzung).

Registrierung

Account registration screen with first and last name fields, email, password, and a live password-policy checklist
  • Erfasst Vor- und Nachname (optional), E-Mail und ein Passwort.
  • Eine Live-Checkliste zur Passwortrichtlinie aktualisiert sich beim Tippen, sodass die Anforderungen schon vor dem Absenden klar sind.
  • Optionales Cloudflare Turnstile-Captcha.
  • Ein „Anmelden"-Link für Nutzer, die bereits ein Konto haben.

Im Portal-Admin gesteuert

  • Blenden Sie den Registrierungslink ein oder aus (Branding). Um die Registrierung ganz abzuschalten, deaktivieren Sie Öffentliche Registrierung zulassen (Einstellungen → Sitzung).
  • Die Passwortrichtlinie Ihres Mandanten steuert die Checkliste.
  • Branding gestaltet die gesamte Seite.

Passwort vergessen

Forgot-password screen with an email field and a neutral check-your-email confirmation state
  • Der Nutzer gibt seine E-Mail-Adresse ein und sieht dann eine neutrale Bestätigung „Prüfen Sie Ihre E-Mails".
  • Die Seite verrät nie, ob ein Konto existiert, was das Ausspähen vorhandener Konten vereitelt.
  • Ein „Zurück zur Anmeldung"-Link führt den Nutzer zurück zur Anmeldeseite.

Im Portal-Admin gesteuert

  • Blenden Sie den Link Passwort vergessen ein oder aus (Branding).
  • Der E-Mail-Versand Ihres Mandanten verschickt die Nachricht zum Zurücksetzen.
  • Branding gestaltet die gesamte Seite.

Passwort zurücksetzen

Reset-password screen with new and confirm password fields and a live per-rule requirement checklist
  • Felder für neues Passwort und Passwort bestätigen mit einer Live-Checkliste je Anforderung.
  • Ein klarer Zustand für einen ungültigen oder abgelaufenen Link, wenn das Zurücksetzungs-Token nicht mehr gültig ist.
  • Ein Erfolgszustand, der bestätigt, dass das Passwort geändert wurde.

Im Portal-Admin gesteuert

  • Die Passwortrichtlinie Ihres Mandanten steuert die Checkliste.
  • Branding gestaltet die gesamte Seite.

MFA-Abfrage

MFA challenge screen with a method switcher, a six-digit authenticator code field, recovery-code entry, and a passkey button
  • Ein Methodenwechsler zwischen Authenticator-App, Passkey und Wiederherstellungscode.
  • Ein 6-stelliges TOTP-Feld, das automatisch absendet, sobald alle Ziffern eingegeben sind.
  • Eingabe eines Wiederherstellungscodes für Nutzer, die den Zugriff auf ihren Authenticator verloren haben.
  • Ein Passkey-Button für hardwaregestützte Verifizierung.

Im Portal-Admin gesteuert

  • Die MFA-Richtlinie wird pro Anwendung festgelegt (Clients → Sicherheit).
  • Jeder Nutzer mit einem eingerichteten Faktor wird immer abgefragt, unabhängig von der Richtlinie.

MFA-Einrichtung

MFA setup screen showing enrolled-method status, authenticator QR code and manual key, passkey enrolment, and recovery-code generation
  • Zeigt den Status der eingerichteten Methoden, sodass der Nutzer weiß, was bereits konfiguriert ist.
  • Authenticator-Einrichtung per QR-Code, einem manuellen Schlüssel als Fallback und einem Bestätigungsschritt.
  • Passkey-Registrierung für hardwaregestützte Authentifizierung.
  • Generierung von Wiederherstellungscodes zur Kontowiederherstellung.
  • Ein optionales Überspringen, wenn MFA per Self-Service statt verpflichtend ist.

Im Portal-Admin gesteuert

  • Die MFA-Richtlinie wird pro Anwendung festgelegt; Erforderlich erzwingt die Einrichtung beim Login (Clients → Sicherheit).
  • Branding gestaltet die gesamte Seite.

Geräteautorisierung

Device authorization screen with a centered user-code entry field, an Approve button, and an approved confirmation state
  • Ein zentriertes Feld zur Eingabe des Benutzercodes für den auf dem Gerät angezeigten Code.
  • Ein Bestätigungsschritt, um das Gerät zu autorisieren.
  • Ein Anmelde-Zwischenschritt, wenn der Nutzer noch nicht authentifiziert ist.
  • Eine Bestätigung der Autorisierung, sobald das Gerät freigegeben ist.

Im Portal-Admin gesteuert

  • Aktivieren Sie den Device-Code-Grant für die Anwendung (Clients → Scopes & Grants).
  • Legen Sie die Lebensdauer des Device-Codes fest (Clients → Tokens).
Consent screen showing the requesting application's logo and name, a per-scope permission list, and Allow and Deny buttons
  • Zeigt Logo und Name des anfragenden Clients.
  • Eine Liste pro Scope mit freundlichen, verständlichen Bezeichnungen für jede Berechtigung.
  • Erlauben- und Ablehnen-Buttons, um Zugriff zu gewähren oder zu verweigern.
  • Eine Fußzeile mit Einwilligungshinweis, die erklärt, was die Entscheidung bedeutet.

Im Portal-Admin gesteuert

  • Schalten Sie Zustimmung erforderlich pro Anwendung ein (Clients → Allgemein).
  • Logo, Name und URL stammen aus den eigenen Metadaten der Anwendung.
  • Branding gestaltet die Einwilligungskarte.

Verbundene Apps (Freigaben)

Connected apps screen listing the applications a user has authorized with their scopes and granted date, plus a revoke control
  • Listet jede App auf, die der Nutzer autorisiert hat, mit ihrem Namen, ihren Geltungsbereichen und dem Datum der Freigabe.
  • Entziehen Sie einer App den Zugriff, mit einem Bestätigungsschritt, bevor es wirksam wird.
  • Ein freundlicher Leerzustand, wenn der Nutzer noch keine Apps autorisiert hat.

Im Portal-Admin gesteuert

  • Die Liste wird durch Anwendungen mit erforderlicher Einwilligung befüllt.
  • Branding gestaltet die gesamte Seite.

Konto

Eine gehostete Self-Service-Kontoseite unter /login/account, auf der angemeldete Benutzer ihr eigenes Profil und ihre bevorzugte Sprache verwalten, ohne Portalzugang.

Self-service account screen with editable profile fields and a preferred Language selector
  • Bearbeiten von Vor- und Nachname, Unternehmen und Telefon; die E-Mail-Adresse wird schreibgeschützt angezeigt.
  • Wahl einer bevorzugten Sprache aus den unterstützten Sprachen; die UI zeigt die Auswahl sofort als Vorschau und speichert sie beim Sichern.
  • Die gespeicherte Sprache steuert die gehostete UI des Benutzers und die Sprache der Transaktions-E-Mails, die er erhält.

Im Portal-Admin gesteuert

  • Branding gestaltet den gesamten Bildschirm.
  • Dieselbe bevorzugte Sprache ist von einem Administrator auf der Portal-Seite Benutzer bearbeitbar.

Authentifizierungsabläufe

Authentifizierungsabläufe beschreiben, wie Endbenutzer mit Ihrem Authagonal-Mandanten interagieren — Anmeldung, Registrierung, Passwortzurücksetzung und MFA-Einrichtung. Diese Endpunkte werden von der gehosteten Anmeldeseite verwendet und können direkt aufgerufen werden, wenn Sie eine benutzerdefinierte Anmeldeoberfläche erstellen.

Anmeldung

POST /api/auth/login

Authentifiziert einen Benutzer mit E-Mail und Passwort. Bei Erfolg wird ein Sitzungs-Cookie signiert und das Benutzerprofil zurückgegeben. Wenn MFA konfiguriert ist, zeigt die Antwort an, dass ein zweiter Faktor erforderlich ist, bevor die Sitzung vollständig hergestellt wird.

Anfragekörper:

Login request
{
  "email": "[email protected]",
  "password": "correct-horse-battery-staple"
}

Erfolgsantwort:

FeldTypBeschreibung
userIdstringEindeutiger Benutzerbezeichner
emailstringE-Mail-Adresse des Benutzers
namestringVollständiger Anzeigename
mfaAvailablebooleanOb der Benutzer MFA-Methoden registriert hat

MFA-erforderlich-Antwort: Wenn der Benutzer MFA registriert hat, enthält die Antwort mfaRequired: true zusammen mit einer challengeId und einem methods-Array mit verfügbaren MFA-Methoden.

MFA-Einrichtung-erforderlich-Antwort: Wenn die MFA-Richtlinie der Anwendung auf Erforderlich steht, der Benutzer sich aber noch nicht registriert hat, enthält die Antwort mfaSetupRequired: true mit einem setupToken für den Registrierungsablauf.

Fehlerantworten:

FehlercodeHTTP-StatusBeschreibung
invalid_credentials401E-Mail oder Passwort ist falsch
account_disabled403Das Konto wurde von einem Administrator deaktiviert
email_not_confirmed403Der Benutzer hat seine E-Mail-Adresse nicht verifiziert
locked_out423Konto ist vorübergehend gesperrt (enthält retryAfter in Sekunden). Wird nur zurückgegeben, wenn das Passwort korrekt ist; ein falsches Passwort während der Sperre gibt invalid_credentials zurück
sso_required409E-Mail-Domain hat SSO konfiguriert (enthält redirectUrl)
too_many_attempts429Zu viele Anmeldeversuche von dieser IP-Adresse oder für diese E-Mail-Adresse; versuchen Sie es später erneut
captcha_failed400Turnstile-Challenge fehlgeschlagen oder fehlend (nur wenn Turnstile aktiviert ist)

SSO-Prüfung: Wenn die E-Mail-Domain des Benutzers eine SSO-Verbindung konfiguriert hat, gibt der Anmeldeendpunkt sso_required mit einer redirectUrl zurück. Der Client sollte den Benutzer zum SSO-Anbieter weiterleiten.

Kontosperrung: Nach maxFailedAttempts aufeinanderfolgenden fehlgeschlagenen Anmeldeversuchen wird das Konto für lockoutDurationMinutes gesperrt. Beide Werte sind in den Mandanteneinstellungen konfigurierbar.

Gehostete Anmeldeseite

Der Anmeldeendpunkt wird typischerweise von der gehosteten Anmeldeseite aufgerufen, nicht direkt von Ihrer Anwendung. Verwenden Sie den OIDC-Authorization-Code-Flow, um die Authentifizierung zu starten — Ihre Benutzer werden automatisch zur gehosteten Anmeldeseite weitergeleitet.

Registrierung

POST /api/auth/register

Erstellt ein neues Benutzerkonto und sendet eine Bestätigungs-E-Mail. Solange <strong>Require verified email to sign in</strong> (Einstellungen &rarr; Sitzung) aktiviert ist, was standardmäßig der Fall ist, muss der Benutzer seine E-Mail verifizieren, bevor er sich anmelden kann.

Anfragekörper:

Registration request
{
  "email": "[email protected]",
  "password": "a-strong-password-here",
  "firstName": "Jane",
  "lastName": "Smith"
}
FeldErforderlichBeschreibung
emailJaE-Mail-Adresse (muss eindeutig sein)
passwordJaMuss der Passwortrichtlinie des Mandanten entsprechen
firstNameNeinVorname
lastNameNeinNachname

Erfolg: 201 Created mit der userId des neuen Kontos. Eine Registrierung mit einer bereits vergebenen E-Mail gibt ebenfalls 201 zurück: Wir geben nie preis, ob eine E-Mail existiert (um Account-Enumeration zu verhindern), und benachrichtigen stattdessen den echten Kontoinhaber per E-Mail.

Fehlerantworten:

FehlercodeHTTP-StatusBeschreibung
weak_password400Passwort entspricht nicht der Passwortrichtlinie des Mandanten
rate_limited429Zu viele Registrierungsversuche
provisioning_rejected422Ein Bereitstellungs-Webhook hat die Registrierung abgelehnt
invalid_email400E-Mail-Adresse ist ungültig
captcha_failed400Turnstile-Challenge fehlgeschlagen oder fehlend (nur wenn Turnstile aktiviert ist)
public_signup_disabled403Die öffentliche Registrierung ist für diesen Mandanten deaktiviert (Einstellungen &rarr; Sitzung)

Passwortrichtlinie

Prüfen Sie die Passwortanforderungen des Mandanten vor der Übermittlung über GET /api/auth/password-policy. Dies gibt eine rules-Liste zurück: die Mindestlänge und die erforderlichen Zeichenklassen.

Passwortzurücksetzung

POST /api/auth/forgot-password

Fordert eine E-Mail zur Passwortzurücksetzung an. Der Endpunkt gibt immer eine Erfolgsantwort zurück, unabhängig davon, ob die E-Mail existiert, um E-Mail-Enumeration zu verhindern.

Forgot password request
{
  "email": "[email protected]"
}

POST /api/auth/reset-password

Setzt das Passwort des Benutzers mit dem Token aus dem E-Mail-Link zurück.

Reset password request
{
  "token": "RESET_TOKEN_FROM_EMAIL",
  "newPassword": "new-strong-password"
}

Nebeneffekte einer erfolgreichen Passwortzurücksetzung:

  • Zähler für fehlgeschlagene Anmeldeversuche wird auf null zurückgesetzt
  • Alle bestehenden Refresh-Tokens werden widerrufen
  • Ein neuer Sicherheitsstempel wird generiert (alle bestehenden Sitzungen werden ungültig)

MFA-Einrichtung & -Verifizierung

Authagonal unterstützt drei MFA-Methoden: TOTP (Authenticator-Apps), WebAuthn (Sicherheitsschlüssel und Biometrie) und Einmal-Wiederherstellungscodes.

TOTP-Einrichtung

POST /api/auth/mfa/totp/setup: Gibt ein <code>setupToken</code>, eine QR-Code-Daten-URI und einen manuellen Eingabeschlüssel zurück. Der Benutzer scannt den QR-Code mit seiner Authenticator-App (Google Authenticator, Authy, 1Password usw.) und bestätigt dann die Registrierung.

POST /api/auth/mfa/totp/confirm: Bestätigt die TOTP-Registrierung, indem das <code>setupToken</code> aus der Einrichtung zusammen mit einem 6-stelligen Code aus der Authenticator-App gesendet wird.

Confirm TOTP enrollment
{
  "setupToken": "SETUP_TOKEN_FROM_SETUP_RESPONSE",
  "code": "123456"
}

WebAuthn-Einrichtung

POST /api/auth/mfa/webauthn/setup — Gibt Optionen zur Credential-Erstellung für die WebAuthn-API zurück. Der Browser ruft navigator.credentials.create() mit diesen Optionen auf.

POST /api/auth/mfa/webauthn/confirm: Bestätigt die WebAuthn-Registrierung durch Übermittlung der Attestierungsantwort des Browsers.

Wiederherstellungscodes

POST /api/auth/mfa/recovery/generate: Generiert 10 einmalig verwendbare Wiederherstellungscodes mit je 10 Zeichen (Format <code>XXXXX-XXXXX</code>). Jeder Code kann genau einmal verwendet werden, um MFA zu umgehen. Zuvor muss eine Authenticator-App oder ein Passkey registriert sein.

Wiederherstellungscodes werden nur einmal angezeigt

Wiederherstellungscodes werden nur zum Zeitpunkt der Generierung angezeigt und können später nicht abgerufen werden. Wenn ein Benutzer sowohl sein Authenticator-Gerät als auch seine Wiederherstellungscodes verliert, muss ein Administrator seine MFA-Anmeldedaten manuell im Portal löschen, bevor er sich erneut anmelden kann.

MFA-Verifizierung

POST /api/auth/mfa/verify: Schließt die MFA-Challenge nach einer erfolgreichen Passwort-Anmeldung ab.

FeldErforderlichBeschreibung
challengeIdJaDie Challenge-ID aus der Anmeldeantwort
methodJa"totp", "recovery" oder "webauthn"
codeTOTP / Wiederherstellung6-stelliger TOTP-Code oder Wiederherstellungscode (XXXXX-XXXXX)
assertionWebAuthnDie Assertion-Antwort von navigator.credentials.get()

MFA-Status

GET /api/auth/mfa/status: Gibt die aktuell registrierten MFA-Methoden des Benutzers zurück.

SSO-Anmeldeablauf

Authagonal unterstützt sowohl SAML 2.0- als auch OIDC-basierte SSO-Verbindungen. Domänbasiertes Routing erkennt automatisch, welcher SSO-Anbieter basierend auf der E-Mail-Adresse des Benutzers verwendet werden soll.

SSO-Prüfung

GET /api/auth/[email protected]

FeldTypBeschreibung
ssoRequiredbooleanOb die E-Mail-Domain SSO erfordert
providerTypestring"saml" oder "oidc"
connectionIdstringDer SSO-Verbindungsbezeichner
redirectUrlstringDie URL, zu der der Benutzer für die SSO-Anmeldung weitergeleitet wird

SAML-Flow

Der Benutzer wird zu GET /saml/{connectionId}/login weitergeleitet, das einen SAML AuthnRequest an den Identity Provider sendet. Der IdP authentifiziert den Benutzer und sendet eine SAML-Antwort an den Assertion Consumer Service (ACS)-Endpunkt zurück. Authagonal validiert die Assertion, erstellt oder aktualisiert den Benutzer und signiert ein Sitzungs-Cookie.

SAML-Metadaten zur Konfiguration Ihres IdP sind verfügbar unter GET /saml/{connectionId}/metadata.

OIDC-Flow

Der Benutzer wird zu GET /oidc/{connectionId}/login weitergeleitet, das zum vorgelagerten Identity Provider mit PKCE weiterleitet. Nachdem sich der Benutzer authentifiziert hat, tauscht der Callback unter /oidc/callback den Authorization Code aus, validiert das ID-Token und erstellt oder aktualisiert den Benutzer.

JIT-Bereitstellung: Sowohl SAML- als auch OIDC-Flows unterstützen Just-in-Time-Bereitstellung, die bei jeder Verbindung standardmäßig deaktiviert ist (JIT-Bereitstellung aktivieren). Wenn sie aktiviert ist und der Benutzer noch nicht im Mandanten existiert, wird er automatisch aus den Claims des Identity Providers erstellt. Wenn er bereits existiert, werden seine Profilattribute aktualisiert, um mit den neuesten Werten des Providers übereinzustimmen.

Domänbasiertes Routing

Domänbasiertes Routing bedeutet, dass Ihre Benutzer nicht wissen müssen, welchen SSO-Anbieter sie verwenden. Die Eingabe ihrer E-Mail-Adresse genügt — Authagonal ordnet die Domain der richtigen SSO-Verbindung zu und leitet automatisch weiter.

Backend-for-Frontend (BFF)

Ein BFF hält OAuth-Tokens vollständig aus dem Browser heraus. Ihre Single-Page-App hält nichts als ein httpOnly-Sitzungscookie, und ein vertraulicher Client auf Ihrem eigenen Backend führt den OpenID Connect-Flow durch und hält die Tokens serverseitig.

Alles, was eine Single-Page-App lesen kann, kann Cross-Site-Scripting stehlen, und dazu gehören ein Access-Token im Speicher und ein Refresh-Token in localStorage. Tokens im Browser zu speichern begrenzt außerdem ihre Lebensdauer, denn ein langlebiges Refresh-Token in Reichweite von Skripten ist ein dauerhaftes Risiko. Die IETF Best Current Practice OAuth 2.0 for Browser-Based Apps empfiehlt genau aus diesem Grund dieses Muster.

Im Gegenzug erhalten Sie eine Sitzung, die ein Neuladen der Seite überdauert, ohne dass irgendwo ein Token auftaucht, die Token-Erneuerung serverseitig erledigt, sofortigen Entzug über Back-Channel-Logout und einen authentifizierten Proxy, sodass Ihre API nie ein Token parsen muss, das der Browser hätte manipulieren können.

Den Client erstellen

Öffnen Sie im Portal Clients und wählen Sie BFF-App erstellen. Geben Sie die Basis-URL an, unter der Ihre App ausgeliefert wird, zum Beispiel https://app.acme.com, und Authagonal registriert für Sie einen korrekt konfigurierten vertraulichen Client, statt Ihnen das Zusammenbauen zu überlassen:

EinstellungWert
Redirect-URI{appBaseUrl}/bff/callback
Post-Logout-Redirect-URI{appBaseUrl}/
Back-Channel-Logout-URI{appBaseUrl}/bff/backchannel-logout
Grant-Typenauthorization_code, refresh_token
Scopesopenid, profile, email, offline_access
PKCE und Client-SecretBeide erforderlich

Das Secret wird nur einmal angezeigt

Die Antwort enthält clientId, clientSecret und authority, und das Secret ist danach nie wieder abrufbar, weil nur sein Hash gespeichert wird. Übernehmen Sie es direkt in die Konfiguration oder den Secret-Store Ihres Backends. Wenn Sie es verlieren, erstellen Sie einen weiteren Client, statt zu versuchen, diesen wiederherzustellen.

In Ihr Backend einbinden

Zwei Laufzeiten werden unterstützt und teilen dasselbe Kernprotokoll: Authagonal.Bff für .NET und @authagonal/bff für Node, letzteres mit Adaptern für Express und Next.js. Richten Sie eine davon auf die Werte, die das Portal Ihnen gerade gegeben hat. Das Node-Paket benötigt außerdem ein eigenes cookieSecret, mit dem es seine Cookies verschlüsselt.

.NET
// dotnet add package Authagonal.Bff
builder.Services.AddAuthagonalBff(o =>
{
    o.Authority    = "https://acme.authagonal.io";       // your tenant auth host
    o.ClientId     = builder.Configuration["Bff:ClientId"]!;
    o.ClientSecret = builder.Configuration["Bff:ClientSecret"]!;
    o.Scope        = ["openid", "profile", "email", "offline_access"];
    o.PostLogoutRedirectUri = "https://app.acme.com/";
});

// Trust X-Forwarded-Proto from your ingress. With no options, UseForwardedHeaders() changes nothing.
builder.Services.Configure<ForwardedHeadersOptions>(o =>
{
    o.ForwardedHeaders = ForwardedHeaders.XForwardedProto;
    o.KnownNetworks.Clear();
    o.KnownProxies.Clear();
});

var app = builder.Build();

app.UseForwardedHeaders();   // required behind a proxy or ingress, see the note below
app.MapAuthagonalBff();
app.MapFallbackToFile("index.html");   // your SPA
app.Run();
Node (Express)
// npm install @authagonal/bff
import express from 'express';
import { authagonalBff } from '@authagonal/bff/express';

const app = express();

app.use(authagonalBff({
  authority: 'https://acme.authagonal.io',
  clientId: process.env.BFF_CLIENT_ID,
  clientSecret: process.env.BFF_CLIENT_SECRET,
  cookieSecret: process.env.BFF_COOKIE_SECRET,   // encrypts the session and login cookies
  scope: ['openid', 'profile', 'email', 'offline_access'],
  postLogoutRedirectUri: 'https://app.acme.com/',
}));

app.listen(8080);

Hinter einem Proxy den Forwarded-Headern vertrauen

Fast jede Bereitstellung betreibt das BFF hinter einem Ingress oder Load Balancer, der TLS terminiert und mit Ihrem Prozess einfaches HTTP spricht. Ohne Verarbeitung der Forwarded-Header hält das BFF die Anfrage für unsicher und gibt sein __Host--Sitzungscookie ohne das Attribut Secure aus, das Browser dann stillschweigend verwerfen. Das Symptom ist eine Anmeldung, die sauber durchläuft, und eine Sitzung, die nie erscheint. Aktivieren Sie in .NET XForwardedProto in ForwardedHeadersOptions und rufen Sie app.UseForwardedHeaders() vor MapAuthagonalBff() auf, wie oben gezeigt: Der bloße Aufruf vertraut keinem Header. Die Node-Adapter lesen X-Forwarded-Proto selbst und markieren ein __Host--Cookie immer als Secure; setzen Sie die Trust-Proxy-Einstellung Ihres Frameworks, damit die an Ihre API weitergeleitete Client-Adresse die echte ist.

Endpunkte

Standardmäßig unter /bff eingehängt. Sie müssen vom selben Origin wie Ihre SPA ausgeliefert werden, denn das Sitzungscookie ist httpOnly und same-origin: legen Sie sie hinter denselben Hostnamen statt auf eine separate API-Domain.

RouteZweck
GET /bff/login?returnUrl=/Startet die Anmeldung und leitet zu Authagonal weiter. Führt den Benutzer anschließend zu returnUrl zurück.
GET /bff/callbackDie OIDC-Redirect-URI. Wird für Sie abgewickelt; Sie schreiben das nie selbst.
GET /bff/userLiefert isAuthenticated, die Claims der Sitzung und sessionExpiresAt. Erfordert den Anti-Forgery-Header.
GET|POST /bff/logoutBeendet die Sitzung lokal und bei Authagonal.
POST /bff/backchannel-logoutEmpfängt Logout-Benachrichtigungen von Authagonal, sodass eine Abmeldung an anderer Stelle auch diese Sitzung beendet.

Aus dem Browser

Jede Anfrage, die keine Navigation ist, muss einen statischen Anti-Forgery-Header tragen. Er schützt zusammen mit dem SameSite-Attribut des Cookies vor Cross-Site Request Forgery: ein Cross-Site-Formular-POST kann keinen eigenen Header setzen, eine Anfrage ohne ihn wird also abgelehnt.

Prüfen, wer angemeldet ist
const me = await fetch('/bff/user', {
  headers: { 'X-Authagonal-Bff': '1' },
}).then(r => r.json());

if (!me.isAuthenticated) {
  // Navigate, do not fetch: this is a redirect to your identity provider.
  window.location.href = '/bff/login?returnUrl=' + encodeURIComponent(location.pathname);
}

Melden Sie sich durch Navigation an und ab, nicht per Fetch: location.href = '/bff/login'. Diese Routen antworten mit einer Weiterleitung zu Ihrem Identity Provider, und einer Weiterleitungskette kann fetch nicht sinnvoll folgen.

Ihre API aufrufen

Das BFF kann Ihre API unter seinem eigenen Basispfad weiterleiten und dabei das Access-Token der Sitzung anhängen. Der Browser sendet ein Cookie, Ihre API erhält ein Bearer-Token, das sie wie gewohnt validiert, und nichts an diesem Token ist für die Seite sichtbar oder von ihr fälschbar. Registrieren Sie einen Upstream, und Anfragen an /bff/api/** erreichen ihn authentifiziert. Lassen Sie die Liste leer, ist der Proxy vollständig deaktiviert.

Eine Upstream-API weiterleiten
o.Upstreams.Add(new BffUpstream
{
    Prefix        = "/orders",                        // matches /bff/api/orders/**
    TargetBaseUrl = "https://api.internal.acme.com",
    StripPrefix   = false,                            // keep /orders in the forwarded path
});
OptionStandardWas sie bewirkt
Upstreams[]Die APIs, an die der Proxy weiterleitet. Leer deaktiviert den Proxy-Endpunkt.
Prefix/Pfad-Präfix nach /bff/api, das dieser Upstream bedient, zum Beispiel /orders.
TargetBaseUrl-Basis-URL, an die Anfragen weitergeleitet werden.
StripPrefixfalseEntfernt das getroffene Präfix vor der Weiterleitung. So können Sie ein künstliches Routing-Präfix nutzen, um ein BFF auf mehrere Backends zu verteilen, die sich einen Pfad-Namensraum teilen.
AllowAnonymousProxyRequestsfalseLeitet eine Anfrage ohne nutzbare Sitzung ohne Authorization-Header weiter, statt sie abzulehnen. Für eine API, die sowohl angemeldete als auch anonyme Aufrufer bedient.
RequiredAuthority[]Eine Authority-Schranke als type:action-Paare, zum Beispiel email:send. Wenn gesetzt, prüft der Proxy vor der Weiterleitung die RFC 9396 Authorization Details des ausgehenden Tokens.
AuthorityLocation-Die RFC 9396 locations-Wurzel, unter der dieser Upstream bekannt ist, wenn die Authority gegen einen öffentlichen Ressourcenbezeichner erteilt wird, der sich von der internen Adresse unterscheidet, die der Proxy aufruft.
StrictAuthorityfalseLehnt einen Aufruf ab, der eine Grant-Einschränkung trägt, die der Proxy nicht auswerten kann, statt ihn weiterzuleiten. Der Proxy leitet blind weiter und leitet keinen Einschränkungskontext ab, daher ist dies standardmäßig aus.
ExchangeRoutes[]Proxy-Routen, deren Upstream-Aufrufe ein kontextgebundenes, getauschtes Token verwenden statt des primären Access-Tokens der Sitzung. Das erste passende Muster gewinnt.

WebSockets

Ein WebSocket-Handshake kann weder einen eigenen Header noch ein Bearer-Token tragen, also helfen weder der Anti-Forgery-Header noch der Proxy. Aktivieren Sie Tickets, dann kann die SPA GET /bff/ws-ticket aufrufen, das kurzlebige Einmal-Ticket an die Connect-URL hängen und es von Ihrer API einlösen lassen. Erzeugen Sie eines unmittelbar vor jedem Verbindungsaufbau: es wird bei der ersten Verwendung gelöscht und läuft nach Sekunden ab.

OptionStandardWas sie bewirkt
WsTicketsEnabledfalseAktiviert den ws-ticket-Endpunkt. Standardmäßig aus.
WsTicketLifetime30sWie lange ein Ticket gültig ist. Bewusst kurz gehalten, da es in einer URL übertragen wird.
TicketExchangeParams[]Query-Parameter, die eine Ticket-Anfrage in einen Token-Austausch weitergeben darf, sodass das Ticket an diesen Kontext gebunden ist, statt für alles zu gelten.

Dem Browser bewusst ein Token übergeben

Der ganze Sinn eines BFF ist, dass der Browser kein Token hält, daher ist dies opt-in und eng gefasst. Es existiert für den einen Fall, den das Cookie-Modell nicht erreicht: einen Resource Server auf einem anderen Origin, etwa eine App, die Sie in einem iframe einbetten, die mit einem Bearer aufgerufen werden muss. Aktiviert liefert GET /bff/token?resource=… ein getauschtes Token: das Token der Sitzung, heruntergestuft auf eine Ressource der Zulassungsliste und an jeden zugelassenen Kontextparameter gebunden. Der Browser sieht nie das eigene Token der Sitzung, und was er bekommt, ist kurzlebig und auf eine einzige Audience beschränkt. Eine Anfrage, die eine Ressource außerhalb der Zulassungsliste nennt, wird abgelehnt, und genau das verhindert, dass daraus eine Token-Ausgabe für beliebige Zwecke wird.

OptionStandardWas sie bewirkt
TokenEndpointEnabledfalseAktiviert den Token-Endpunkt. Standardmäßig aus.
TokenEndpointResources[]Die resource-Werte, an die ein Token adressiert werden darf. Alles andere wird abgelehnt.
TokenEndpointExchangeParams[]Query-Parameter, die als Kontextbindungen in den Austausch weitergegeben werden, zum Beispiel project_id.

Mehrere Mandanten aus einem BFF bedienen

Setzen Sie einen Mandanten-Query-Parameter, und eine Bereitstellung bedient viele Mandanten: /bff/login?slug=acme wählt den Mandanten, ein Resolver liefert dessen Authority und Client-Anmeldedaten, der Schlüssel wandert über das Correlation-Cookie in die Sitzung, und das Back-Channel-Logout löst den Mandanten aus dem Token-Issuer auf. Der Standard-Resolver lässt das Verhalten mit einem einzelnen Mandanten byteweise identisch, Sie zahlen dafür also nichts, solange Sie es nicht nutzen.

Mehr als eine Instanz betreiben

Sitzungen liegen hinter IBffSessionStore, das standardmäßig einen prozessinternen Cache verwendet. Für eine einzelne Instanz ist das in Ordnung, für mehrere ist es falsch: ein Benutzer, dessen nächste Anfrage auf einer anderen Replik landet, ist abgemeldet. Registrieren Sie einen gemeinsamen Store, etwa Redis über IDistributedCache, bevor Sie das BFF hinzufügen.

Ein gemeinsamer Store allein genügt nicht

Sie brauchen zusätzlich eine replikübergreifende Sperre für die Token-Erneuerung. Das Single-Flight der Erneuerung ist prozesslokal, während die Sitzung und ihr rotierendes Refresh-Token in dem Store liegen, den alle Repliken teilen. Zwei Repliken können dieselbe Sitzung lesen, beide entscheiden, dass sie erneuert werden muss, und beide lösen dasselbe Refresh-Token ein. Das ist von einem Replay mit gestohlenem Token nicht zu unterscheiden, und die korrekte Reaktion auf ein Replay ist der Entzug der gesamten Grant-Familie. Ein BFF mit mehreren Instanzen und ohne Sperre kann Benutzer also routinemäßig abmelden. Stellen Sie sie auf einem der beiden Wege bereit: registrieren Sie über Clustering einen ILeaseProvider, oder implementieren Sie IBffRefreshLockStore auf Ihrem Session-Store, was ein bedingter Schreibvorgang mit einer Time-to-Live ist und der kürzere Weg, wenn Sie ohnehin Redis betreiben. Ein BFF, dessen Store gemeinsam genutzt aussieht und keine Sperre hat, warnt beim Start davor, statt es Sie aus einem Support-Ticket erfahren zu lassen.

Optionen, die man kennen sollte

Der vollständige Satz, in der .NET-Schreibweise. Das Node-Paket übernimmt die Kernoptionen in camelCase, aus BasePath wird also basePath und aus SessionLifetime wird sessionLifetimeSeconds. PersistentCookie, CorrelationLifetime (in Node fest auf 15 Minuten) und LoginPassthroughParams gibt es nur in .NET.

OptionStandardWas sie bewirkt
Authority-Der Auth-Host Ihres Mandanten. Die OIDC-Metadaten werden von dort ermittelt. Erforderlich, außer im Mehrmandantenbetrieb, wo der Resolver ihn liefert.
ClientId-Die Client-ID des vertraulichen Clients, der für dieses BFF registriert ist.
ClientSecret-Das Client-Secret. Ein BFF ist ein vertraulicher Client, daher ist dies erforderlich.
Scopeopenid profile offline_accessAngeforderte Scopes. Nehmen Sie offline_access auf, sonst gibt es kein Refresh-Token und Sitzungen enden mit dem Access-Token.
BasePath/bffWo die BFF-Routen eingehängt werden.
CallbackPath/bff/callbackDer Pfad der OIDC-Redirect-URI. Muss mit dem übereinstimmen, womit der Client registriert ist.
CookieName__Host-agbffName des Sitzungscookies. Das Präfix __Host- setzt HTTPS voraus, lokale Entwicklung über einfaches HTTP braucht also einen anderen Namen.
SessionLifetime8hWie lange eine Sitzung bestehen darf. Stellen Sie den Wert passend zur absoluten Lebensdauer Ihres Refresh-Tokens ein, sonst wird ein untätiger Benutzer abgemeldet, während er noch ein gültiges Credential hält.
PersistentCookiefalseOb das Cookie das Schließen des Browsers überlebt. Das Refresh-Token bleibt in beiden Fällen serverseitig.
CorrelationLifetime30mWie lange eine Anmeldung zwischen ihrem Start und dem Callback dauern darf. Der Wert begrenzt das Cookie, das state, nonce und PKCE-Verifier trägt; der Fall, den er überstehen muss, ist ein Benutzer, der die Anmeldeseite offen lässt und später zurückkommt.
RefreshThresholdSeconds60Wie viele Sekunden vor dem Ablauf das Access-Token erneuert wird.
AntiForgeryHeaderX-Authagonal-BffDer Header-Name, den der Browser bei Anfragen senden muss, die keine Navigation sind.
PostLogoutRedirectUri-Wo der Browser landet, nachdem das Logout abgeschlossen ist.
ReturnUrlAllowlist[]Absolute Origins, auf die eine nicht relative returnUrl zeigen darf. Relative Pfade sind immer erlaubt und alles andere wird auf / zurückgesetzt, ein Open Redirect ist über die Login-Route also nicht erreichbar.
LoginPassthroughParams[]Query-Parameter, die von /bff/login an die Authorize-Anfrage weitergegeben werden, zum Beispiel prompt, damit ein Einstiegs-Link zur Registrierung statt zur Anmeldung führen kann.
TenantQueryParam-Setzen Sie ihn, um mehrere Mandanten aus einem BFF zu bedienen. Siehe oben.

Beide Laufzeiten verhalten sich gleich

Die Pakete für .NET und Node implementieren denselben Kern-Protokollvertrag, daher sind Login, Callback, User, Logout und Back-Channel-Logout, das Cookie, der Anti-Forgery-Header, das Erneuerungsverhalten und der einfache Upstream-Proxy identisch. WebSocket-Tickets, der Token-Endpunkt, Exchange-Routen, StripPrefix, die Authority-Gates und anonymes Proxying gibt es nur in .NET. Die Namen oben sind die .NET-Schreibweise; Node verwendet die camelCase-Entsprechungen.

Alles ist austauschbar

Die Bausteine sind Interfaces, Sie können das BFF also auf Ihre eigene Infrastruktur verlagern, ohne es zu forken: IBffSessionStore dafür, wo Sitzungen liegen, ICookieProtector für die Cookie-Verschlüsselung (standardmäßig ASP.NET Data Protection) und ITokenClient für die Kommunikation mit dem Token- und dem Revocation-Endpunkt. Ein BFF kann über IBffTenantResolver auch mehrere Mandanten bedienen: der Mandant wird bei der Anmeldung aus einem Query-Parameter ausgewählt und beim Back-Channel-Logout aus dem Token-Issuer aufgelöst.

Ihr Portal aus einem KI-Assistenten heraus bedienen

Verbinden Sie einen KI-Assistenten mit Ihrem Mandanten und lassen Sie ihn die Dinge erledigen, die Sie sonst zusammenklicken: einen Benutzer finden, der sich nicht anmelden kann, prüfen, ob er noch einen zweiten Faktor hat, jemanden einladen, sehen, wer eine Admin-Rolle innehat.

Es ist eine gewöhnliche OAuth-Verbindung, kein API-Schlüssel. Jede Person meldet sich als sie selbst an und genehmigt den Zugriff, ein Assistent kann also genau das tun, was diese Person im Portal tun kann, und nichts darüber hinaus. Es entsteht nichts Neues, das nach außen dringen könnte, und der Widerruf eines Assistenten lässt alle anderen unberührt.

Einschalten

Öffnen Sie die Einstellungen und aktivieren Sie den Zugriff für KI-Assistenten. Bis dahin ist er ausgeschaltet, und solange er ausgeschaltet ist, existiert der Endpunkt gar nicht, statt Anfragen nur abzuweisen. Nach dem Aktivieren zeigt das Panel die URL an, die Sie in Ihren KI-Client einfügen:

Ihre MCP-URL
https://portal-api.authagonal.io/api/v1/mcp/{your-tenant}

Wie ein Assistent seine Berechtigung erhält

Ein Assistent registriert sich selbst, bevor er eine Anmeldung starten kann, und erlaubt wird ihm das dadurch, dass Sie den Zugriff für KI-Assistenten aktivieren. Mehr müssen Sie nicht einschalten, und insbesondere sollten Sie dafür die dynamische Client-Registrierung in Ihrem Endbenutzer-Mandanten nicht aktivieren: Diese Einstellung betrifft den Mandanten, der Ihre eigenen Benutzer bedient, und dort meldet sich ein Assistent gar nicht an. Registrierung ist noch kein Zugriff. Ein frisch registrierter Assistent hat überhaupt nichts in der Hand, bis eine Person aus Ihrem Team sich anmeldet und ihn genehmigt, und jedes Werkzeug prüft danach erneut die Rolle dieser Person.

Was ein Assistent tun kann

Genau das, was die Person tun kann, die ihn verbunden hat, bei jedem Aufruf anhand ihres eigenen Tokens entschieden. Ein Mitarbeiter mit tenant:support erhält die Diagnose- und Alltagswerkzeuge; die Admin-Werkzeuge sind vor ihm nicht bloß verborgen, sie werden abgelehnt, wenn er sie direkt benennt. Was im Portal gesperrt ist, bleibt gesperrt: Die E-Mail-Adresse eines Benutzers zu ändern erfordert dort die Admin-Rolle, und sie erfordert sie auch hier.

Weil es ein normaler Grant ist, verwalten Sie ihn auf normalem Weg: Entfernen Sie den Assistenten auf der Seite Autorisierte Apps Ihres Kontos, dann kann er sich nicht mehr erneuern und hört auf zu funktionieren, sobald sein aktuelles Access-Token abläuft. Jede Änderung, die ein Assistent vornimmt, wird in Ihrem Audit-Protokoll unter der Person festgehalten, für die er gehandelt hat, die Spur ist also dieselbe, die Sie ohnehin schon lesen.

Die Werkzeuge

Dreiunddreißig in dieser Version. Ihr KI-Client entscheidet, welche davon aktiviert werden, Sie können einem Assistenten also nur die lesenden Werkzeuge geben, wenn er nicht mehr tun soll.

WerkzeugRolleWas es tut
find_userSupportBenutzer nach E-Mail, Namenspräfix oder ID finden. Der Ausgangspunkt für alles Weitere.
get_userSupportEin Benutzer vollständig, einschließlich der Angaben, ob er aktiv, bestätigt und gesperrt ist.
get_user_mfaSupportWelche zweiten Faktoren jemand registriert hat.
get_user_sessionsSupportWo ein Benutzer gerade angemeldet ist.
search_auditSupportDas Audit-Protokoll nach Akteur, Aktion oder betroffenem Objekt durchsuchen.
list_usersSupportDas Verzeichnis auflisten, optional gefiltert auf eine Organisation.
get_user_statsSupportWie viele Benutzer Sie haben und wie viele einen zweiten Faktor nutzen.
invite_userSupportJemanden per E-Mail einladen.
resend_inviteSupportEine Einladung erneut senden.
send_verification_emailSupportDie E-Mail-Bestätigungsnachricht erneut senden.
update_userSupportEin Profil aktualisieren. Für das Ändern der E-Mail-Adresse ist weiterhin die Admin-Rolle nötig.
revoke_user_sessionsSupportEinen Benutzer überall abmelden.
list_rolesAdminDie in Ihrem Mandanten definierten Rollen.
list_role_membersAdminWer eine bestimmte Rolle innehat.
assign_roleAdminEinem Benutzer eine Rolle geben.
unassign_roleAdminEine Rolle wieder entziehen.
reset_user_mfaAdminAlle zweiten Faktoren entfernen, für jemanden, der seinen Authenticator verloren hat.
get_settingsAdminDie Konfiguration Ihres Mandanten.
list_sso_connectionsAdminIhre SSO-Verbindungen und die Domains, die sie abdecken.
list_organizationsAdminDie Organisationen Ihres Mandanten, jeweils eine Seite.
get_organizationAdminEine Organisation nach ID oder Slug, mit ihren E-Mail-Domains.
create_organizationAdminLegt eine Organisation an. Der Slug ist dauerhaft.
update_organizationAdminÄndert Name, Richtlinien-Optionen, Metadaten oder Branding einer Organisation. Der Slug lässt sich nicht ändern.
delete_organizationAdminLöscht eine Organisation samt allen ihren Mitgliedschaften.
list_organization_membersAdminDie Mitglieder einer Organisation, jeweils eine Seite.
add_organization_memberAdminFügt einer Organisation einen Benutzer hinzu.
update_organization_memberAdminÄndert Status oder Rollen eines Mitglieds innerhalb einer Organisation.
remove_organization_memberAdminEntfernt einen Benutzer aus einer Organisation.
add_organization_domainAdminBeansprucht eine E-Mail-Domain für eine Organisation. Gibt den zu veröffentlichenden DNS-TXT-Eintrag zurück.
verify_organization_domainAdminPrüft den TXT-Eintrag und markiert die Domain als verifiziert. Darf wiederholt werden.
remove_organization_domainAdminGibt den Anspruch auf eine Domain auf. Bestehende Mitglieder bleiben.
list_user_organizationsAdminDie Organisationen, denen ein Benutzer angehört, mit Status und Rollen in jeder.
list_clientsEntwicklerDie in Ihrem Mandanten registrierten OAuth-Clients.

Lesende und schreibende Werkzeuge sind gekennzeichnet

Jedes Werkzeug teilt Ihrem Client mit, ob es nur liest, ob es etwas verändert und ob diese Änderung destruktiv ist. Ein guter Client nutzt das, um eine Abfrage auszuführen, ohne Sie zu unterbrechen, und um vor etwas wie dem Entfernen eines zweiten Faktors innezuhalten. Betrachten Sie es als Komfortfunktion und nicht als Kontrolle: Was tatsächlich darüber entscheidet, was ein Assistent tun darf, ist Ihre eigene Rolle, geprüft bei jedem Aufruf.

Was noch nicht enthalten ist

Das Löschen von Benutzern, das Anlegen oder Bearbeiten von SSO-Verbindungen, Abrechnung, Datensicherungen und Client-Secrets fehlen in dieser Version allesamt. Das Löschen gehört zu Ihrer Löschwarteschlange und nicht daneben; eine SSO-Verbindung wiegt schwer genug, dass eine falsche Änderung eine ganze Belegschaft aussperrt, deshalb sind diese vorerst nur lesbar; und ein Werkzeug, das ein Client-Secret zurückgibt, würde es im Transkript eines Assistenten ablegen. Sagen Sie uns, welche davon Sie brauchen und in welcher Reihenfolge.

Authentifizierung von MCP-Servern

Wenn Sie einen Model Context Protocol Server bereitstellen, kann Authagonal der Autorisierungsserver dahinter sein. Ein KI-Assistent verbindet sich, die Person dahinter meldet sich an und erteilt den Zugriff, und Ihr Server erhält ein normales Bearer-Token, das Sie wie bei jeder anderen API validieren.

Die Alternative ist ein API-Schlüssel, der in die Konfiguration eines Assistenten eingefügt wird: eine Anmeldeinformation ohne Benutzer dahinter, ohne Ablauf, ohne Zustimmungsschritt und ohne Möglichkeit, einen einzelnen Connector zu widerrufen, ohne für alle zu rotieren. Über OAuth gehört der Grant einer namentlich bekannten Person, ist in Ihrem Audit-Protokoll sichtbar und lässt sich im Portal widerrufen, ohne dass Sie sonst etwas anfassen müssen.

Wie die Verbindung zustande kommt

Der gesamte Austausch läuft über Discovery, sodass ein konformer Client nichts weiter konfiguriert braucht als die URL Ihres Servers.

SchrittWas passiert
1Der Connector ruft Ihren MCP-Server ohne Token auf und erhält ein 401, das angibt, wo er nachsehen soll.
2Er ruft Ihre Protected-Resource-Metadaten ab, die Ihren Authagonal-Mandanten als Autorisierungsserver nennen.
3Er ruft die Autorisierungsserver-Metadaten des Mandanten ab und registriert sich selbst, da er noch nirgendwo registriert wurde.
4Er schickt den Benutzer zur Anmeldung und zur Freigabe des Zugriffs und nennt dabei Ihren MCP-Server als die Ressource, für die er ein Token möchte.
5Er ruft Ihren Server erneut auf, mit dem daraus entstandenen Bearer-Token, das auf Ihren Server und auf diesen Benutzer beschränkt ist.

Nichts an dieser Abfolge ist Authagonal-spezifisch: Es ist die MCP-Autorisierungsspezifikation, aufgebaut auf RFC 9728 für die Ressourcen-Metadaten, RFC 8414 für das Auffinden des Autorisierungsservers, RFC 7591 für die Registrierung und RFC 8707 für die Benennung der Ressource. Ein Connector, der der Spezifikation folgt, funktioniert, ohne uns zum Sonderfall zu machen.

Connectors sich selbst registrieren lassen

Ein Connector, den Sie nie zuvor gesehen haben, kann keinen von Hand angelegten Client verwenden, also registriert er sich zur Laufzeit selbst einen. Das ist standardmäßig ausgeschaltet. Schalten Sie in den Einstellungen die dynamische Client-Registrierung ein, dann erscheint der Registrierungs-Endpunkt in Ihrem Discovery-Dokument; lassen Sie sie aus, wird der Endpunkt nicht veröffentlicht und weist Anfragen ab. Das Einschalten öffnet die Registrierung allein für Ihren Mandanten, nie für den eines anderen.

SchutzmaßnahmeWas passiert
Grant-TypenRegistriert werden können nur der Authorization-Code-Flow und der Refresh-Flow. Über die Selbstregistrierung lässt sich kein Machine-to-Machine-Client anlegen, der einen Benutzer vollständig umgehen würde.
PKCEWird bei jedem registrierten Client erzwungen, unabhängig davon, was die Registrierung angefordert hat.
ZustimmungWird ebenfalls erzwungen. Ein registrierter Connector erhält kein Token, bevor eine Person gesehen hat, wonach er fragt, und es genehmigt hat.
GeltungsbereicheDie integrierten OIDC-Geltungsbereiche sind immer verfügbar. Darüber hinaus darf ein sich selbst registrierender Client nur einen Geltungsbereich namens mcp anfordern, und das erst, wenn Ihr Mandant ihn ohne Rollenbeschränkungen definiert. roles und groups können nicht per Selbstregistrierung angefordert werden.
Rate-LimitZehn Registrierungen pro IP-Adresse und Stunde, damit ein offener Endpunkt nicht dazu benutzt werden kann, Ihren Client-Bestand zu füllen.

Beide Discovery-Pfade werden bedient

MCP-Clients ermitteln den Autorisierungsserver über /.well-known/oauth-authorization-server (RFC 8414), während OIDC-Clients /.well-known/openid-configuration verwenden. Ihr Mandant antwortet auf beiden mit denselben Metadaten, sodass ein Connector, der der MCP-Spezifikation folgt, Sie findet, ohne dass man ihm sagen muss, wo er suchen soll.

Was Ihr MCP-Server implementiert

Zwei Kleinigkeiten, danach ist er ein gewöhnlicher Resource Server. Veröffentlichen Sie zuerst Protected-Resource-Metadaten, die Ihren Mandanten als Autorisierungsserver nennen. Liefern Sie sie unter dem Well-known-Pfad aus und, falls Ihr MCP-Endpunkt auf einem Unterpfad liegt, zusätzlich in der Form mit angehängtem Pfad, denn Clients probieren beides.

Protected-Resource-Metadaten
GET https://your-app.example/.well-known/oauth-protected-resource

{
  "resource": "https://your-app.example/mcp",
  "authorization_servers": ["https://acme.authagonal.io"],
  "bearer_methods_supported": ["header"],
  "scopes_supported": ["mcp"]
}

Zweitens: Wenn ein Aufruf ohne gültiges Token eintrifft, antworten Sie mit 401 und einem WWW-Authenticate-Header, der auf diese Metadaten verweist. Dieser Header macht aus einer Ablehnung eine Verbindung: Ohne ihn hat der Client keine Möglichkeit herauszufinden, wo er sich authentifizieren soll, und scheitert einfach.

Das Token validieren
// Validate the connector's token like any other resource server.
builder.Services.AddAuthentication().AddJwtBearer("McpBearer", o =>
{
    o.Authority = "https://acme.authagonal.io";              // your tenant
    o.TokenValidationParameters.ValidAudience = "https://your-app.example/mcp";
});

// Unauthenticated? Point the connector at the metadata rather than just refusing.
http.Response.Headers.WWWAuthenticate =
    "Bearer resource_metadata=\"https://your-app.example/.well-known/oauth-protected-resource\"";
return Results.Unauthorized();

Prüfen Sie die Audience, nicht nur die Signatur

Validieren Sie, dass das Token für Ihren Server ausgestellt wurde. Der Connector nennt Ihren MCP-Server als Ressource, also ist die Audience des Tokens Ihre Ressourcen-URL. Ein Resource Server, der nur Signatur und Aussteller prüft, akzeptiert auch ein Token, das für eine andere Ressource im selben Mandanten ausgestellt wurde, und so wird aus dem Zugriff des einen Connectors der eines anderen.

Geltungsbereiche, Tarife und Widerruf

Definieren Sie auf Ihrer Seite Scopes einen Geltungsbereich namens mcp ohne Rollenbeschränkungen, dann darf ein sich selbst registrierender Connector ihn anfordern; er erscheint auf dem Zustimmungsbildschirm, sodass der Benutzer sieht, was er genehmigt. Das Subjekt des Tokens ist die Person, die sich angemeldet hat, sodass Ihr Server entscheiden kann, was genau diese Person tun darf, statt alle Connectors gleich zu behandeln. Ein selbst registrierter Connector kann die Geltungsbereiche roles oder groups nicht anfordern; schlagen Sie diese daher auf Ihrer Seite nach, statt sie im Token zu erwarten.

Weil es ein gewöhnlicher OAuth-Grant ist, funktioniert der Widerruf auf gewöhnlichem Weg: Der Benutzer entfernt den Connector auf der Seite Autorisierte Apps seines Kontos, wodurch dessen Grant und Refresh-Token entfallen, sodass er sich nicht erneuern kann. Seine vorhandenen Access-Tokens werden von /connect/introspect und /connect/userinfo sofort abgelehnt; ein Server, der das JWT nur lokal validiert, akzeptiert ein solches Token bis zu seinem Ablauf. Das Audit-Protokoll erfasst jede Anmeldung mit dem Client, für den sie erfolgte.

EinstellungWas passiert
Dynamic client registrationPortal-Einstellung, die Connectors erlaubt, sich selbst zu registrieren. Standardmäßig ausgeschaltet.
mcpDer eine Geltungsbereich über die integrierten OIDC-Geltungsbereiche hinaus, den ein sich selbst registrierender Client anfordern darf. Definieren Sie ihn in Ihrem Mandanten ohne Rollenbeschränkungen, um ihn anzubieten.
resourceDer Parameter, den ein Connector sendet, um Ihren MCP-Server zu benennen, wodurch die Audience des Tokens auf ihn eingeschränkt wird.

Eine eigene Login-Oberfläche erstellen

Ersetzen Sie die von Authagonal gehosteten Anmelde-, Registrierungs-, Passwort-Reset- und MFA-Bildschirme durch Ihre eigene Oberfläche, während Authagonal weiterhin Authentifizierung, MFA, SSO, Sitzungen und Token-Ausstellung übernimmt. Zwei Wege: Nutzen Sie unsere React-Komponentenbibliothek oder rufen Sie die Auth-API direkt aus einem beliebigen Framework auf. Es ist optional: Aktivieren Sie zuerst Eigene Login-Oberfläche unter Einstellungen → Sitzung.

A fully customized hosted login page with a tenant logo, brand color, and support email in the footer

Voraussetzung: eine eigene Domain auf Ihrer Root-Domain

Die Login-Sitzung ist ein First-Party-Cookie, daher müssen sich Ihre Oberfläche und der Authagonal-Auth-Server eine registrierbare Domain teilen. Richten Sie eine eigene Auth-Domain bei Authagonal auf derselben Root-Domain ein, auf der Ihre App läuft — z. B. Auth unter login.acme.com, App unter app.acme.com. Die Einstellung Custom login UI bleibt deaktiviert, bis eine aktive eigene Domain existiert.

Ihre OberflächeAuth-HostFunktioniert?
app.acme.comlogin.acme.com✅ gleiche Root-Domain
acme.comauth.acme.com✅ gleiche Root-Domain
app.acme.comacme.authagonal.io❌ Cross-Site
myapp.iologin.acme.com❌ Cross-Site

Warum eine eigene Domain erforderlich ist

Ein Cross-Site-Sitzungscookie wäre ein Third-Party-Cookie — das Browser (Safari, Chrome) schrittweise abschaffen. Auth auf Ihrer eigenen Root-Domain zu belassen, macht das Cookie zu einem First-Party-Cookie und zukunftssicher, und genau das setzt die Plattform durch: Cross-Origin-Auth-Aufrufe werden nur von einem Origin akzeptiert, das sich die Root-Domain des Auth-Hosts teilt.

Für die /api/auth-Aufrufe ist keine CORS-Einstellung am Client nötig: Sobald Eigene Login-Oberfläche aktiviert ist, wird jeder Origin auf derselben registrierbaren Domain wie Ihre Auth-Domain automatisch zugelassen. Fügen Sie den Origin Ihrer Oberfläche (z. B. https://app.acme.com) nur dann zu den Erlaubte CORS-Origins des Clients (Clients → URIs) hinzu, wenn auch der Browser den Token-Austausch durchführt.

React: @authagonal/login

npm i @authagonal/login liefert die Auth-Logik und die UI als ein Paket — dasselbe, auf dem die von Authagonal gehostete Anmeldung basiert. Wählen Sie Ihre Abstraktionsebene:

  • Vollständige App — binden Sie App ein und gestalten Sie sie per Branding.
  • Seiten zusammenstellen — verwenden Sie LoginPage, MfaChallengePage, ResetPasswordPage… in Ihrem eigenen Layout.
  • Primitive + Logik — erstellen Sie eigene Bildschirme mit AuthLayout/Button/Input und dem API-Client (login, mfaVerify, forgotPassword, …).
Ein eigener Bildschirm mit der @authagonal/login-API
import { AuthLayout, Input, Button, login, ApiRequestError } from '@authagonal/login';

// returnUrl: the /connect/authorize URL your login page was opened with
function MyLogin({ returnUrl }: { returnUrl: string }) {
  async function onSubmit(email: string, password: string) {
    try {
      const res = await login(email, password, returnUrl);  // POST /api/auth/login (sets the session cookie)
      if (res.mfaRequired) {/* render your MFA step, then mfaVerify(res.challengeId!, 'totp', code) */}
      else if (res.mfaSetupRequired) {/* enrol first: mfaTotpSetup(res.setupToken) */}
      else window.location.href = returnUrl;                 // resume /connect/authorize
    } catch (e) {
      if (e instanceof ApiRequestError) {/* show e.message; e.error is the error code */}
    }
  }
  return <AuthLayout>{/* your own markup + <Input/> <Button/> */}</AuthLayout>;
}

Beliebiges Framework: die Auth-API aufrufen

Nicht auf React? Rufen Sie die Auth-Flow-Endpunkte direkt auf (unter /api/auth) und übergeben Sie dann an den standardmäßigen OIDC-/connect/authorize-Flow. Senden Sie credentials: 'include', damit das Sitzungscookie gespeichert wird.

EndpunktZweck
POST /api/auth/loginAuthentifizieren; gibt mfaRequired oder eine Return-URL zurück
POST /api/auth/registerSelbstregistrierung (wenn aktiviert)
POST /api/auth/forgot-passwordEine Passwortzurücksetzung starten
POST /api/auth/reset-passwordEine Passwortzurücksetzung abschließen
GET /api/auth/password-policyPasswortrichtlinie (zum Anzeigen der Regeln)
POST /api/auth/mfa/*MFA-Einrichtung + Verifizierung (TOTP, WebAuthn, Wiederherstellung)

credentials: 'include' verwenden

Die Sitzung ist ein Cookie, daher müssen Ihre Fetch-Aufrufe Anmeldedaten senden. Cross-Origin-Aufrufe gelingen nur, wenn Custom login UI aktiviert ist und Ihr Origin sich die Root-Domain des Auth-Hosts teilt — andernfalls werden sie mit 403 abgelehnt.
Authentifizieren, dann an OIDC übergeben
# 1. Authenticate (browser fetch; credentials:'include' so the session cookie is stored)
curl -i -X POST https://login.acme.com/api/auth/login \
  -H "Content-Type: application/json" \
  -H "Origin: https://app.acme.com" \
  --data '{"email":"[email protected]","password":"..."}'
# (handle {"mfaRequired":true} → POST /api/auth/mfa/verify, then continue)

# 2. Hand off to the OAuth flow: top-level navigation to the authorize endpoint with PKCE:
# https://login.acme.com/connect/authorize?client_id=my-app&redirect_uri=...&response_type=code
#   &scope=openid%20profile%20email&code_challenge=...&code_challenge_method=S256
# The session cookie (same-site) authenticates the user; you get back a code → exchange at /connect/token.

Ein Mandant, viele Kunden

Ein Muster für einen Integrator, einen Mandanten und N Kunden mit eigenem Branding, jeder mit eigener Anmelde-Domain und eigenen Benutzern, ohne einen Mandanten pro Kunde. Genau dafür gibt es die deklarative Bereitstellung und die Organisationen: Sie machen daraus eine Konfigurationsänderung statt einer Entwicklungsaufgabe.

Das Grundmuster

  • Eine Organisation pro Kunde innerhalb eines einzigen Mandanten.
  • Eine Anmelde-Domain mit eigenem Branding pro Kunde, jeweils auf die Organisation dieses Kunden festgelegt. Eine Anmeldung darüber kann nur einen Token für diese Organisation ausstellen.
  • Auch die Anwendung wird pro Kunden-Host ausgeliefert, alles aus demselben Deployment. Nichts an Code, Build oder Image unterscheidet sich zwischen den Kunden.
  • Die Relying Party wählt ihre Authority anhand des Hosts, auf dem sie läuft, nicht anhand einer Konstante aus dem Build. Dasselbe Bundle verbindet sich mit einer anderen Anmelde-Domain, je nachdem, welcher Kunden-Host es ausgeliefert hat.

Schritt für Schritt

Den Kunden bereitstellen. Rufen Sie den Endpunkt für die deklarative Bereitstellung mit einer Spezifikation auf, die die neue Organisation und ihre Domain nennt. Der Aufruf ist idempotent und auf einen Abschnitt beschränkt.

Bereitstellungsspezifikation
{
  "organizations": [
    { "slug": "acme", "name": "Acme Pty Ltd" }
  ],
  "customDomains": [
    { "domain": "login.acme.example", "organizationSlug": "acme" }
  ]
}

Das DNS des Kunden auf den Mandanten richten. Ein CNAME aus der eigenen Zone des Kunden, der Kontrolle und Absicht belegt, ohne TXT-Token.

CNAME record
_authagonal-challenge.login.acme.example.  CNAME  <slug>.<platformDomain>.

Gleiches Cloudflare-Konto wie die Plattform?

Der Eintrag muss nur DNS sein (ohne Proxy): Ein über Proxy geleiteter CNAME zwischen zwei Zonen im selben Konto erreicht nie den SaaS-Custom-Hostname der Plattform. Bei einer Kundenzone in einem anderen Konto gibt es gar keinen Proxy-Schalter, den man falsch setzen könnte.

Die Anwendung auf den Host des Kunden ausrichten. Die Relying Party löst ihre eigene OIDC-Authority pro Anfrage anhand des Hosts auf, den sie gerade ausliefert. Ein Host ohne Eintrag in der Kundenzuordnung fällt auf die klassische Ableitung für einen einzelnen Mandanten zurück, sodass das Hinzufügen eines Kunden rein additiv ist.

oidc.ts
export function resolveCustomer(): { authority: string; clientId: string } {
  const cfg = getConfig();
  const customer = cfg.customers?.[window.location.host];
  if (customer) return customer;
  const baseDomain = cfg.baseDomain || window.location.hostname.replace(/^consumer\./, '');
  return { authority: `https://${cfg.tenantSlug}.${baseDomain}`, clientId: cfg.clientId };
}

Der Client fragt nichts Organisationsspezifisches an: kein organization-Parameter, kein Scope pro Kunde. Die Domain-Festlegung übernimmt die Auswahl der Organisation vollständig serverseitig, und genau dadurch stimmt die Aussage „die App ist für jeden Kunden derselbe Code“ tatsächlich.

Was der Kunde sieht

Die Anmeldeseite zeigt das Branding jeder Organisation, zusammengeführt über das des Mandanten. Siehe Branding-Überschreibung. Jeder Kunde kann einen eigenen App-Namen, ein eigenes Logo, eine eigene Farbe und eine eigene Support-E-Mail haben, ohne die anderen zu berühren.

Ein Benutzer von Kunde A, der sich auf dem Host von Kunde B anzumelden versucht, wird abgelehnt und bekommt nicht die Daten von Kunde B zu sehen. Das geschieht in einer von zwei Formen, je nachdem, wie der Konflikt entstand:

  • Die Relying Party sendet nichts und landet einfach auf der festgelegten Domain. Die Festlegung liefert die Organisation im Namen des Benutzers, die Auswahl ist damit ausdrücklich, und ein Benutzer von Kunde A ohne Mitgliedschaft bei B wird an dem Punkt abgelehnt, an dem der Token ausgestellt würde.
  • Die Relying Party nennt selbst eine andere Organisation. Das wird direkt von der Middleware für die Domain-Festlegung mit einem 400 abgelehnt, noch bevor eine Anmeldeseite angezeigt wird.

Die Ablehnung wegen fehlender Mitgliedschaft leitet zurück zur App

Die erste Form oben ist keine defekte Anmeldeseite, sondern eine gewöhnliche OIDC-Weiterleitung mit error=access_denied zurück an die eigene redirect_uri der Relying Party, mit einer Beschreibung, die genau nennt, welche Organisationsmitgliedschaft fehlte.

Onboarding von Kunde N+1

Steuert Terraform den Bereitstellungsaufruf, ist das Onboarding eines weiteren Kunden eine Änderung an einer einzigen Datei: ein weiterer Eintrag im Organisations-Array, ein weiterer Domain-Eintrag, der sie festlegt, ein weiterer DNS-Eintrag. An der Anwendung, ihrem Deployment oder ihrem Build ändert sich nichts. Der hostbasierte Resolver erfasst den neuen Kunden, sobald sein Konfigurationseintrag existiert.

Referenzimplementierung

Ein dauerhafter Dev-Mandant spielt dieses gesamte Muster von Anfang bis Ende gegen zwei echte Kunden-Domains durch. Eine End-to-End-Testsuite stellt Mitglieder bereit, prüft das Branding und den Claim org_id und bestätigt beide oben genannten Ablehnungsformen. Das ist ausführbare Dokumentation, nicht bloß eine Beschreibung.

Lokal ausführen
cd e2e-consumer && DOMAIN=authagonal.dev npx playwright test organizations-domains

Die Suite läuft standardmäßig wie jede andere Spezifikation. In einer Umgebung, in der die Referenz-Domains nicht bereitgestellt sind, kann sie übersprungen werden, denn sie ist die einzige Spezifikation der Suite, die von Infrastruktur außerhalb der Kontrolle des Repos selbst abhängt.

Tarife & Limits

Authagonal bietet einen kostenlosen Tarif und vier kostenpflichtige Stufen. Jeder Tarif beinhaltet jede Authentifizierungsfunktion. Die Tarife unterscheiden sich im Limit für monatlich aktive Benutzer (MAU) und in den Überschreitungspreisen, und der kostenlose Tarif bietet nur Community-Support, ohne den Support-Desk für Mandanten.

Tarifstufen

TarifMAU-LimitÜberschreitungÜberschreitungskosten/Benutzer
Kostenlos250Nein—
Starter1,000Nein—
Pro5.000Ja$0,04/Benutzer
Scale25.000Ja$0,025/Benutzer
Enterprise100.000Ja$0,015/Benutzer

Monatlich aktive Benutzer (MAU)

Ein monatlich aktiver Benutzer ist jeder eindeutige Benutzer, der sich mindestens einmal während eines Kalendermonats (UTC) erfolgreich authentifiziert. Über SCIM bereitgestellte Benutzer, die sich nicht angemeldet haben, zählen nicht zu Ihrer MAU-Gesamtzahl.

Überschreitung: Wenn Ihr Tarif Überschreitungen unterstützt (ab Pro) und Überschreitungen für Ihren Mandanten aktiviert sind (standardmäßig sind sie deaktiviert), werden Benutzer über dem MAU-Limit zum in der Tariftabelle oben angegebenen Preis pro Benutzer abgerechnet. Eine Überschreitungsobergrenze legt die maximale Anzahl zusätzlicher Benutzer fest, die über das Limit hinaus erlaubt sind.

Durchsetzung: Wenn Ihr Tarif keine Überschreitung unterstützt (Kostenlos, Starter) oder Überschreitungen nicht aktiviert sind, behalten Benutzer, die sich in diesem Monat bereits angemeldet haben, immer ihren Zugriff. Wenn der Mandant sein Limit zum ersten Mal überschreitet, beginnt eine Kulanzfrist von 10 Tagen, in der sich neue Benutzer weiterhin anmelden können. Danach werden Benutzer, die sich in diesem Monat noch nicht angemeldet haben, bis zum nächsten Monat oder bis zu Ihrem Upgrade abgewiesen.

Vollständiger Funktionsumfang in jedem Tarif

Alle Tarife beinhalten den vollständigen Funktionsumfang — SSO, SCIM, MFA, eigene Domains, Branding, Webhooks, Audit-Protokoll und das Portal.