Step-up-Authentifizierung (Step-up authentication)
Step-up-Authentifizierung ermöglicht es einer Anwendung, vor der Durchführung sensibler Operationen – wie der Autorisierung einer Zahlung, dem Anzeigen vertraulicher Datensätze oder dem Ändern von Kontosicherheitseinstellungen – eine kürzlich erfolgte Benutzer-Authentifizierung oder ein höheres Authentifizierungs-Sicherheitsniveau zu verlangen, ohne den Benutzer abzumelden.
Logto implementiert standardbasierte Step-up-Authentifizierung auf Basis von OpenID Connect Core, RFC 9470 (OAuth 2.0 Step Up Authentication Challenge Protocol) und RFC 8176 (Authentication Method Reference Values):
- Geschützte Ressourcenserver fordern bei unzureichenden Tokens mit
401 Unauthorizedund einem RFC 9470WWW-Authenticate-Header, deracr_valuesundmax_ageenthält, eine Nachbesserung an. - Deine Anwendung startet einen Authorization Code Flow mit
acr_valuesundmax_age. Wenn bereits eine authentifizierte Sitzung besteht, pinnt Logto den angemeldeten Benutzer und fordert nur die fehlende Verifizierung an. - Logto zeichnet den erreichten Authentifizierungskontext (
acr,amrundauth_time) in der Sitzung auf und gibt ihn in ID-Tokens, JWT-Zugangstokens und introspektiven Antworten für opake Tokens aus.
Authentifizierungskontext-Modell (Authentication context model)
Jede Anmeldung, Registrierung und Step-up, die über die Logto Experience abgeschlossen wird, zeichnet drei Standard-Ansprüche (Claims) in der OIDC-Sitzung auf, unabhängig davon, ob die Anwendung acr_values angefordert hat:
| Claim | Typ | Beschreibung |
|---|---|---|
acr | string | Authentication Context Class Reference – das erreichte Sicherheitsniveau. Fehlt, wenn keines erreicht wurde. |
amr | string[] | Authentication Methods References – die in dieser Interaktion verwendeten Verifizierungsmethoden. |
auth_time | number | Epoch-Timestamp (in Sekunden), wann die Endbenutzer-Authentifizierung abgeschlossen wurde. |
Logto gibt diese Fähigkeiten in OIDC Discovery (/.well-known/openid-configuration und /.well-known/oauth-authorization-server) bekannt:
{
"acr_values_supported": ["urn:logto:acr:1fa", "urn:logto:acr:mfa"],
"claims_supported": ["sub", "acr", "amr", "auth_time"]
}
In ID-Tokens werden acr, amr und auth_time unter dem Standard-openid-Scope einbezogen, sofern sie in der Sitzung vorhanden sind. Bei Benutzer-Zugangstokens übernimmt Logto sie aus dem Autorisierungscode, Gerätecode oder Auffrischungstoken in JWT-Payloads und introspektiven Antworten für opake Tokens. Die Rotation von Auffrischungstokens bewahrt die ursprünglichen Werte von acr, amr und auth_time – das Auffrischen eines Tokens erhöht niemals auth_time. Andere Grant-Typen (wie Client Credentials und Token Exchange) geben keine Authentifizierungskontext-Claims aus.
Unterstützte ACR-Werte (Supported ACR values)
Logto definiert zwei Authentication Context Class Reference (acr)-Werte:
| ACR-Wert | Bedeutung | Erfüllt |
|---|---|---|
urn:logto:acr:1fa | Mindestens ein Faktor, den Logto direkt in der Interaktion verifiziert oder etabliert hat: Passwort, primärer E-Mail- oder SMS-Verifizierungscode, Magic Link (Einmal-Token bei Anmeldung) oder ein registrierter MFA-Faktor. | urn:logto:acr:1fa |
urn:logto:acr:mfa | Ein von Logto verifizierbarer Erstfaktor (1fa-Rolle) kombiniert mit einem mfa-Rollen-Nachweis eines anderen Faktors oder eine vom Benutzer verifizierte WebAuthn / Passkey-Bestätigung allein. | urn:logto:acr:mfa, urn:logto:acr:1fa |
Die Erfüllungsrelation ist urn:logto:acr:mfa → urn:logto:acr:1fa: Jede Sitzung oder jedes Token mit urn:logto:acr:mfa erfüllt auch eine Anforderung für urn:logto:acr:1fa. Standard-ACR-Werte wie phr und phrh werden nicht unterstützt; WebAuthn- und Passkey-Zeremonien erfordern Benutzerverifizierung und werden urn:logto:acr:mfa zugeordnet.
Bei der Ableitung von urn:logto:acr:mfa klassifiziert Logto jede von Logto verifizierbare Methode nach der Rolle, die sie erfüllen kann:
- Erstfaktor (
1fa)-Rolle: Passwort, primärer E-Mail-Verifizierungscode, primärer SMS-Verifizierungscode und Einmal-Token (nur Anmeldung). - Zweitfaktor (
mfa)-Rolle: Authenticator-App-OTP (TOTP), Backup-Code, MFA-E-Mail-Verifizierungscode und MFA-SMS-Verifizierungscode. Einmfa-Rollen-Faktor, der ohne einen von Logto verifizierbaren Erstfaktor verifiziert wird (z. B. Social Sign-in + TOTP), erreichturn:logto:acr:1fa, nichturn:logto:acr:mfa. - Selbstgenügsame (
both)-Rolle: Passkey-Anmeldung und WebAuthn-MFA mit Benutzerverifizierung erfüllen beide Rollen in einer Zeremonie und erreichen alleinurn:logto:acr:mfa. - Unterschiedliche-Faktoren-Regel:
urn:logto:acr:mfaerfordert zwei verschiedene Faktoren. Zwei Erstfaktoren (wie E-Mail-Code + Passwort bei Registrierung), zweimfa-Rollen-Faktoren (wie TOTP + Backup-Code) oder zwei Nachweise desselben Kanals (wie primärer E-Mail-Code + MFA-E-Mail-Code) zählen als ein Faktor bzw. eine Rolle und erreichenurn:logto:acr:1fa. - Vertrauenswürdige Geräte und adaptive MFA: Trusted-Device-Erfüllung und adaptive-MFA-Überspringen beweisen nichts in der aktuellen Interaktion und tragen nicht zu
acrbei (eine Passwort-Anmeldung, die MFA über ein vertrauenswürdiges Gerät überspringt, ergibtacr="urn:logto:acr:1fa"undamr=["pwd"]).
Registrierungen zeichnen den Authentifizierungskontext nach denselben Regeln auf, da die beim Erstellen des Kontos hinterlegten Anmeldedaten dieses Konto beweisen. Zum Beispiel ergibt eine Registrierung mit Benutzername und Passwort acr="urn:logto:acr:1fa" und amr=["pwd"].
AMR-Mapping
Logto befüllt amr mit Werten aus RFC 8176 sowie fed für föderierte Authentifizierung:
| Logto-Verifizierungsmethode | amr-Werte | Trägt zu acr bei |
|---|---|---|
| Passwort (verifiziert oder neu gesetzt bei Registrierung oder Step-up) | pwd | Ja (1fa-Rolle) |
| Primärer E-Mail-Verifizierungscode | otp | Ja (1fa-Rolle) |
| Primärer SMS-Verifizierungscode | sms | Ja (1fa-Rolle) |
| Einmal-Token / Magic Link (nur Anmeldung; nicht bei Step-up verfügbar) | otp | Ja (1fa-Rolle) |
| Authenticator-App-OTP (TOTP, verifiziert oder neu gebunden) | otp | Ja (mfa-Rolle) |
| MFA-E-Mail-Verifizierungscode | otp | Ja (mfa-Rolle) |
| MFA-SMS-Verifizierungscode | sms | Ja (mfa-Rolle) |
| Backup-Code | otp | Ja (mfa-Rolle) |
| WebAuthn-MFA oder Passkey-Anmeldung mit Benutzerverifizierung (verifiziert oder neu gebunden) | pop, user, mfa | Ja (both-Rollen) |
| Social Sign-in oder Enterprise SSO | fed | Nein |
Jede Interaktion mit erreichtem acr = urn:logto:acr:mfa | ergänzt mfa | — |
Föderierte Authentifizierung (fed)
Logto gibt fed aus, um anzuzeigen, dass der Benutzer sich über eine Upstream-Social- oder Enterprise-SSO-Bestätigung angemeldet hat, deren Methode Logto nicht direkt verifizieren kann.
- Eine reine Social- oder Enterprise-SSO-Anmeldung oder -Registrierung zeichnet
amr=["fed"]und einen frischenauth_timeauf, ohneacr-Claim. fedist kein Erstfaktor, und das Wiederholen der Upstream-Anmeldung erhöht niemalsacr. Das Abschließen eines von Logto verifizierbaren Faktors nach Social Sign-in (z. B. TOTP) ergibtacr="urn:logto:acr:1fa"undamr=["fed", "otp"].auth_timeallein bietet keine Sicherheit – prüfe immeracrzusammen mitauth_time.- Welcher Upstream-Provider den Benutzer authentifiziert hat, wird in den Claims
identitiesundsso_identitiesangezeigt, nicht inamrkodiert.
Wie Step-up Sitzungs- und Token-Claims aktualisiert
Wenn eine Autorisierungsanfrage mit acr_values auf einer bestehenden OIDC-Sitzung eingeht und Interaktion erfordert, wechselt Experience in den Step-up-Modus:
- Subjekt-Pinning und kumulatives ACR: Logto pinnt das aktuelle Sitzungs-
sub(kein Kontowechsel, keine Identitätseingabe, keine Registrierung) und fragt nur nach der fehlenden Sicherheit. Eindeutige Sitzungsmethoden bringen ihre Rollenpaarung in das Step-up ein:- Eine Sitzung, die mit
pwdodersmsauthentifiziert wurde, liefert bereits einen1fa-Beitrag, sodass beim Step-up zuurn:logto:acr:mfanur nach einem registrierten MFA-Faktor gefragt wird (auch wennmax_age=0oderprompt=logineine frische Authentifizierung erzwingen). - Eine Social- oder Enterprise-SSO-Sitzung (
amr=["fed"]) liefert keinen1fa-Beitrag, sodass zum Erreichen vonurn:logto:acr:mfazuerst ein Erstfaktor nachgewiesen (oder etabliert) werden muss, oder ein WebAuthn-Passkey verifiziert werden muss.
- Eine Sitzung, die mit
amrundauth_timespiegeln nur die aktuelle Interaktion wider: Bei einer Passwort-Sitzung ergibt die Verifizierung von TOTP während des Step-upsacr="urn:logto:acr:mfa",amr=["otp", "mfa"]und einen neuenauth_time. Vertrauensstellen müssen die Sicherheit ausacrablesen und dürfen keinen Erstfaktor inamrsuchen.- Sitzungsersetzung, kein Merge: Nach Abschluss des Step-ups werden die Werte von
acr,amrundauth_timeder Sitzung durch den Kontext der neuen Interaktion ersetzt. Zum Beispiel setzt eine Passwort-Reauthentifizierung fürurn:logto:acr:1fadie Sitzung aufacr="urn:logto:acr:1fa"undamr=["pwd"]. Bereits ausgestellte Tokens behalten die Claims, die bei ihrer Ausstellung festgehalten wurden. - Policy-Überschreibungen und Seiteneffekte: Das Anfordern von
urn:logto:acr:1faerfordert eine berechtigte aktive Verifizierung und führt die MFA-Policy des Tenants beim Anmelden nicht erneut aus. Das Anfordern vonurn:logto:acr:mfaignoriert Trusted-Device-Erfüllung, BenutzerpräferenzenskipMfaOnSignInund adaptive-MFA-Nichtauslöser. Reines Step-up führt keine Anmelde-Seiteneffekte wiePostSignIn-Webhooks oder Aktionen aus.
Existiert keine authentifizierte OIDC-Sitzung, wenn acr_values angefordert wird, führt Logto den normalen Anmelde- oder Registrierungsflow durch und erzwingt das angeforderte ACR als Abschlussbedingung vor der Ausgabe des Autorisierungscodes.
Step-up-Authentifizierung anfordern
Übergebe acr_values und max_age bei einer Authorization Code Flow-Anfrage an /oidc/auth.
Listen-Semantik von acr_values
acr_values ist eine durch Leerzeichen getrennte Liste akzeptabler ACR-Werte in Präferenzreihenfolge des Aufrufers (z. B. urn:logto:acr:mfa urn:logto:acr:1fa). Logto ignoriert nicht erkannte Werte; wenn keiner der angeforderten Werte unterstützt wird (z. B. acr_values=phr), schlägt Logto sofort vor jeglicher UI fehl und leitet zu redirect_uri mit error=unmet_authentication_requirements weiter.
Wenn mindestens eine unterstützte Klasse angefordert wird:
- Erste Klasse bereits erfüllt: Wenn eine authentifizierte Sitzung die erste unterstützte Klasse in
acr_valueserfüllt,max_ageeinhält undprompt=loginnicht angefordert wurde, gibt Logto sofort einen Autorisierungscode ohne UI aus. - Nur eine spätere Klasse erfüllt: Wenn die Sitzung eine später gelistete Klasse, aber nicht die erste erfüllt – z. B.
acr_values="urn:logto:acr:mfa urn:logto:acr:1fa"bei einer1fa-Sitzung – startet Logto dennoch eine Step-up-Interaktion, um die frühere Klasse (urn:logto:acr:mfa) zu erreichen.- Kann der Benutzer
urn:logto:acr:mfaerreichen (durch Verifizierung eines registrierten MFA-Faktors oder Registrierung eines solchen), fordert Experience dies an. - Ist
urn:logto:acr:mfaunerreichbar (z. B. kein registrierter MFA-Faktor und der Tenant bietet keinen registrierbaren TOTP- oder WebAuthn-Faktor), fällt Logto auf die nächste erreichbare Klasse zurück (urn:logto:acr:1fa). Wenn die Sitzung diese Rückfallklasse bereits erfüllt und keine frische Authentifizierung erzwungen wurde, beendet Logto ohne UI und bewahrt den ursprünglichenauth_timeder Sitzung.
- Kann der Benutzer
- Striktes Scheitern mit
unmet_authentication_requirements: Logto gibt niemals ein Token mit einem schwächeren ACR aus als die Klasse, die die Interaktion anstrebt. Nur wenn keine gelistete Klasse erreichbar ist, leitet Logto miterror=unmet_authentication_requirementszuredirect_urizurück.
Strikte Anfragen vs. das Retry-mit-schwächerer-Klasse-Muster
Je nachdem, wie deine Anwendung mit Benutzern umgeht, die MFA nicht erfüllen können, wähle eines von zwei Mustern:
- Eine bestimmte Klasse strikt verlangen, dann in deiner App wiederholen oder verzweigen: Fordere nur
acr_values=urn:logto:acr:mfaan. Logto garantiert entweder einmfa-Token oder ein Redirect miterror=unmet_authentication_requirements. Beiunmet_authentication_requirementskann dein Callback-Handler explizit entscheiden, ob die Autorisierung mitacr_values=urn:logto:acr:1fawiederholt, die Operation blockiert oder die Anfrage in einen Genehmigungs-Workflow geleitet wird. - Geordnete Rückfalloptionen in einer Anfrage deklarieren: Fordere
acr_values="urn:logto:acr:mfa urn:logto:acr:1fa"an. Logto strebt immermfaan, wenn erreichbar, und fällt automatisch auf1fazurück, wennmfafür diesen Benutzer und Tenant nicht erreichbar ist. Überprüfeacrauf dem resultierenden Zugangstoken, um zu sehen, welches Niveau erreicht wurde.
Das Verlassen eines Step-up-Bildschirms löst keinen Rückfall aus und benachrichtigt deine App nicht – es gibt keinen Abbruch-Endpunkt, und eine abgebrochene Interaktion läuft einfach ab oder wird durch die nächste Autorisierungsanfrage ersetzt. Halte den Status ausstehender Aktionen in deiner Anwendung und lösche ihn, wenn der Benutzer ohne Abschluss des Callbacks zurück navigiert.
Kombination von max_age und acr_values
max_age gibt die maximal zulässige Zeitspanne in Sekunden seit der letzten aktiven Authentifizierung des Benutzers (auth_time) an:
max_ageprüftauth_time, nicht das Token-exp. Das Auffrischen von Tokens setztauth_timenie zurück.max_age=0(oderprompt=login) erzwingt eine frische interaktive Verifizierung, auch wenn die Sitzung bereits das angeforderteacrenthält.max_ageohneacr_valueslandet im regulären/sign-in-Flow und erzwingt kein Sicherheitsniveau – ein Benutzer kann sich mit Social Sign-in erneut authentifizieren und dabeiauth_timeaktualisieren, ohne einacrzu erhalten. Wenn deine Operation sowohl Frische als auch von Logto verifizierte Sicherheit erfordert, sende immer beides:acr_valuesundmax_age.
Stille Lückenerkennung mit prompt=none
Um zu prüfen, ob die aktuelle Logto-Sitzung des Benutzers bereits eine Sicherheits- und Frischeanforderung erfüllt, ohne UI anzuzeigen oder Enrollment anzubieten, kombiniere prompt=none mit acr_values (und optional max_age):
- Erfüllt: Da
prompt=nonekeine UI zur Präferenzverfolgung zulässt, gibt Logto einen Autorisierungscode aus, wenn die Sitzung eine beliebige unterstützte Klasse inacr_valuesinnerhalb vonmax_ageerfüllt. - Authentifizierte Sitzung, Anforderung nicht erfüllt oder veraltet: Logto leitet mit
error=unmet_authentication_requirementsweiter (hat Vorrang vormax_age-Fehlern). - Keine authentifizierte Sitzung: Logto leitet mit
error=login_requiredweiter.
Autorisierungs-URL- und SDK-Beispiele
Rohe Autorisierungsanfrage, die MFA innerhalb der letzten 5 Minuten (300 Sekunden) für eine geschützte API-Ressource anfordert:
GET /oidc/auth?client_id=my-web-app
&redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback
&response_type=code
&scope=openid%20offline_access%20payment%3Awrite
&resource=https%3A%2F%2Fapi.example.com
&acr_values=urn%3Alogto%3Aacr%3Amfa
&max_age=300
&state=8f3d9c1b2a...
&nonce=4e1a7b9c0f...
&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
&code_challenge_method=S256 HTTP/1.1
Host: [tenant-id].logto.app
Mit einem Logto JavaScript / TypeScript SDK (wie @logto/browser, @logto/react, @logto/vue oder @logto/node) übergibst du acr_values und max_age über extraParams. In Single-Page-Anwendungen, in denen der Benutzer bereits angemeldet ist, setze clearTokens: false, damit zwischengespeicherte Tokens erhalten bleiben, falls der Benutzer das Step-up abbricht oder mit einem OIDC-Fehler zurückkehrt:
await signIn({
redirectUri: 'https://app.example.com/callback',
clearTokens: false,
extraParams: {
acr_values: 'urn:logto:acr:mfa',
max_age: '300',
},
});
Auf der Callback-Route prüfe error, bevor du handleSignInCallback() aufrufst:
const params = new URLSearchParams(window.location.search);
const error = params.get('error');
if (error === 'unmet_authentication_requirements') {
// Benutzer kann die angeforderte ACR nicht erreichen (oder prompt=none hat eine Lücke erkannt).
// Optional mit einer schwächeren Klasse wie 'urn:logto:acr:1fa' wiederholen oder eine Erklärung anzeigen.
return;
}
Der Authentifizierungskontext gehört zur Logto-Sitzung, nicht zu einer einzelnen API-Ressource. Das Anfordern eines Step-ups mit einem resource-Indikator gibt erhöhte Tokens für diese Ressource aus (mit Zustimmung, falls deren Berechtigungen noch nicht gewährt wurden). Früher ausgestellte Tokens für andere API-Ressourcen bleiben unverändert; jeder Ressourcenserver bewertet acr und auth_time auf dem präsentierten Token.
Challenge und Validierung auf einem geschützten Ressourcenserver
Autorisierungsentscheidungen gehören in dein Backend oder auf den geschützten Ressourcenserver:
- Validiere immer das Zugangstoken auf dem Ressourcenserver, niemals das ID-Token.
- Browser-Anwendungen sollten Zugangstokens als opak behandeln. Deine Anwendung kann
acrundauth_timeaus dem ID-Token lesen, um den UI-Status vor dem Senden einer Anfrage zu koordinieren, darf sich aber niemals für die Sicherheit auf clientseitiges Decoding verlassen.
Eine RFC 9470 Challenge zurückgeben
Wenn ein Zugangstoken als Bearer-Token gültig ist (gültige Signatur, iss, aud, exp und scope), aber das erforderliche acr fehlt oder das max_age-Fenster überschritten ist, antworte mit 401 Unauthorized und einem RFC 9470 WWW-Authenticate-Header:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer error="insufficient_user_authentication",
error_description="Multi-factor authentication within the last 5 minutes is required",
acr_values="urn:logto:acr:mfa",
max_age="300"
Wenn deine Anwendung ein 401 mit error="insufficient_user_authentication" erhält, analysiere acr_values und max_age aus WWW-Authenticate, speichere die ausstehende Route oder Absicht des Benutzers lokal, löse signIn() mit diesen Parametern aus und wiederhole den API-Aufruf einmal mit dem neu ausgestellten Zugangstoken. Schütze dich vor Wiederholungsschleifen, indem du kein zweites Step-up startest, falls die wiederholte Anfrage nach dem Callback erneut ein 401 erhält.
JWT-Zugangstokens validieren
Wenn ein API-Ressourcenindikator (resource) angefordert wird, gibt Logto ein signiertes JWT-Zugangstoken aus, das acr, amr und auth_time enthält:
{
"iss": "https://[tenant-id].logto.app/oidc",
"sub": "user-id",
"aud": "https://api.example.com",
"client_id": "my-web-app",
"scope": "payment:write",
"exp": 1787749200,
"iat": 1787745601,
"auth_time": 1787745600,
"acr": "urn:logto:acr:mfa",
"amr": ["pwd", "otp", "mfa"]
}
Nach Validierung der Standard-JWT-Claims (Signatur gegen JWKS, iss, aud, exp und scope), prüfe acr anhand der Erfüllungsrelation und vergleiche auth_time (niemals iat) mit deiner Policy:
import { createRemoteJWKSet, jwtVerify } from 'jose';
const issuer = 'https://[tenant-id].logto.app/oidc';
const jwks = createRemoteJWKSet(new URL(`${issuer}/jwks`));
type LogtoAcr = 'urn:logto:acr:1fa' | 'urn:logto:acr:mfa';
const satisfiedAcrs: Record<string, readonly LogtoAcr[]> = {
'urn:logto:acr:1fa': ['urn:logto:acr:1fa'],
'urn:logto:acr:mfa': ['urn:logto:acr:mfa', 'urn:logto:acr:1fa'],
};
const acrSatisfies = (achieved: unknown, required: LogtoAcr): boolean => {
if (typeof achieved !== 'string') {
return false;
}
return Boolean(satisfiedAcrs[achieved]?.includes(required));
};
export async function verifySensitiveRequest(
bearerToken: string,
requiredAcr: LogtoAcr = 'urn:logto:acr:mfa',
maxAgeSeconds = 300
) {
const { payload } = await jwtVerify(bearerToken, jwks, {
issuer,
audience: 'https://api.example.com',
});
const authTime = payload.auth_time;
const nowSeconds = Date.now() / 1000;
const isFresh =
typeof authTime === 'number' &&
Number.isInteger(authTime) &&
nowSeconds - authTime >= 0 &&
nowSeconds - authTime <= maxAgeSeconds;
if (!acrSatisfies(payload.acr, requiredAcr) || !isFresh) {
const challenge =
`Bearer error="insufficient_user_authentication", ` +
`error_description="Recent user authentication is required", ` +
`acr_values="${requiredAcr}", max_age="${maxAgeSeconds}"`;
return { authorized: false as const, wwwAuthenticate: challenge };
}
return { authorized: true as const, payload };
}
Opake Zugangstokens per Introspektion validieren
Wenn keine API-resource angefordert wird, gibt Logto ein opakes Zugangstoken aus. Validiere es, indem du den RFC 7662 Introspektions-Endpunkt (POST /oidc/token/introspection) mit Client-Authentifizierung aufrufst; Logto gibt acr, amr und auth_time auf oberster Ebene einer aktiven Antwort zurück:
curl -X POST https://[tenant-id].logto.app/oidc/token/introspection \
-u "<client_id>:<client_secret>" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "token=<opaque_access_token>" \
--data-urlencode "token_type_hint=access_token"
Beispiel-Introspektionsantwort:
{
"active": true,
"client_id": "my-web-app",
"exp": 1787749200,
"iat": 1787745601,
"iss": "https://[tenant-id].logto.app/oidc",
"scope": "openid offline_access profile",
"sub": "user-id",
"token_type": "Bearer",
"acr": "urn:logto:acr:1fa",
"amr": ["pwd"],
"auth_time": 1787745600
}
Prüfe zuerst active === true und wende dann dieselben acrSatisfies- und auth_time-Prüfungen wie oben an.
Reservierte Claims im Custom JWT
Bei Benutzer-Zugangstokens sind acr, amr und auth_time reserviert: Ein Custom Access Token Script kann sie nicht überschreiben oder hinzufügen, wenn Logto keinen Authentifizierungskontext ableitet.
Erstfaktor etablieren und MFA registrieren
Ein Benutzer, der nach urn:logto:acr:1fa oder urn:logto:acr:mfa gefragt wird, verfügt möglicherweise noch nicht über die erforderlichen Anmeldedaten, um diese Klasse zu erreichen – zum Beispiel ein reiner Passwort-Benutzer ohne registrierte MFA oder ein reiner Social-Benutzer ohne Passwort, primären E-Mail-/SMS-Code oder MFA-Faktor. Logto erlaubt das Etablieren eines fehlenden Erstfaktors und das Registrieren von MFA innerhalb derselben Anmelde- oder Step-up-Interaktion, abgesichert durch strenge Frischebedingungen, sodass ein gestohlenes Sitzungscookie allein niemals etwas registrieren oder etablieren kann:
- MFA-Faktor registrieren: Wird nur angeboten, wenn der Benutzer keinen registrierten MFA-Faktor hat, der
urn:logto:acr:mfaerreichen kann, und nur nachdem ein von Logto verifizierbarer Erstfaktor (1faoderboth-Klasse) in der aktuellen Interaktion verifiziert oder etabliert wurde.- Weder das gespeicherte Sitzungs-
acrnoch ein Trusted-Device-Cookie erfüllen diese Bedingung. Ein angemeldeter Passwort-Benutzer ohne MFA muss zuerst sein Passwort im Step-up erneut eingeben und kann dann TOTP oder einen WebAuthn-Passkey binden (mit optionalen Backup-Codes neben TOTP oder WebAuthn; Backup-Codes können nicht allein registriert werden).
- Weder das gespeicherte Sitzungs-
- Erstfaktor etablieren: Wird nur angeboten, wenn dem Benutzer ein Erstfaktor fehlt, der die angestrebte Klasse erreichen kann (entweder hat er gar keine geeignete Methode, z. B. ein reiner Social-Benutzer bei
1fa, oder nur einenmfa-Rollen-Faktor wie TOTP beimfa), und nur wenn die aktuelle Interaktion einen frischen Subjekt-Nachweis enthält:- Während des Step-ups auf einer bestehenden Sitzung beweist der Benutzer das Subjekt durch erneute Authentifizierung mit einem seiner bereits verknüpften Social- oder Enterprise-SSO-Connectors, die in der Sign-in Experience aktiviert sind. Wenn der Upstream-Callback auf einen anderen Benutzer oder ein nicht verknüpftes Konto verweist, lehnt Logto dies mit
403ab – weder Registrierung noch Kontoverknüpfung sind erlaubt. - Nach erfolgreichem Subjekt-Nachweis kann der Benutzer jede Erstfaktor-Methode etablieren, die der Tenant für die Anmeldung aktiviert: ein Passwort (wenn Passwort-Anmeldung aktiviert ist) oder eine verifizierte primäre E-Mail oder Telefonnummer (wenn für die Anmeldung mit aktivem E-Mail- oder SMS-Connector aktiviert). Zum Beispiel: Ein reiner Social-Benutzer, der sich mit Google erneut authentifiziert und ein Passwort setzt, schließt mit
acr="urn:logto:acr:1fa"undamr=["fed", "pwd"]ab. - Etablieren wird nie als Alternative angeboten, wenn der Benutzer bereits eine geeignete Methode zur Verifizierung hat.
- Während des Step-ups auf einer bestehenden Sitzung beweist der Benutzer das Subjekt durch erneute Authentifizierung mit einem seiner bereits verknüpften Social- oder Enterprise-SSO-Connectors, die in der Sign-in Experience aktiviert sind. Wenn der Upstream-Callback auf einen anderen Benutzer oder ein nicht verknüpftes Konto verweist, lehnt Logto dies mit
Logto zählt ein während einer Interaktion etabliertes und gebundenes Anmeldedatum oder einen MFA-Faktor genauso wie einen in dieser Interaktion verifizierten, sodass der Benutzer das Step-up sofort abschließt, ohne für den gerade eingerichteten Faktor erneut herausgefordert zu werden. Wenn ein Benutzer während eines reinen Step-ups ein neues Anmeldedatum oder einen Faktor etabliert, gibt Logto das Webhook-Ereignis User.Data.Updated aus. Wenn der Tenant nichts aktiviert hat, was der Benutzer verifizieren, etablieren oder registrieren kann (oder der Benutzer keinen verknüpften Social/SSO-Connector zum Subjekt-Nachweis hat), beendet Logto die Interaktion mit error=unmet_authentication_requirements.
Account API und Account Center
Account API Autorisierungspolicy
Sensible Account API-Operationen – wie das Aktualisieren von Passwort, primärer E-Mail, primärer Telefonnummer oder Benutzernamen, das Verknüpfen oder Entfernen von Social-Identitäten, das Verwalten von MFA-Faktoren und -Einstellungen, das Verwalten von persönlichen Zugriffstokens sowie das Anzeigen oder Widerrufen aktiver Sitzungen, App-Genehmigungen und vertrauenswürdiger Geräte – erfordern:
- First-Party-Anwendungszugriff: Drittanbieter-OIDC-Anwendungen (
isThirdParty: true) und Client ID Metadata Document (CIMD)-Clients können keine sensiblen Account API-Ressourcen ändern oder Account API Step-up-Challenges erhalten, auch nicht miturn:logto:acr:mfa. - Kürzliche Identitätsverifizierung, erfüllt durch eines der folgenden:
- OIDC-Authentifizierungskontext: Das opake Zugangstoken enthält ein
acr, dasurn:logto:acr:1fa(urn:logto:acr:1faoderurn:logto:acr:mfa) erfüllt undnow - auth_time <= maximumAuthenticationAgeInSeconds(streng ausauth_time, niemalsiat, berechnet). - Verifizierungsnachweis (
logto-verification-id): Für direkte Account API-Integrationen akzeptiert Logto weiterhin eine gültige, nicht abgelaufene 10-Minuten-Verifizierungsnachweis-ID imlogto-verification-id-Request-Header, die überPOST /api/verifications/passwordoderPOST /api/verifications/verification-code+/verifyerstellt wurde.
- OIDC-Authentifizierungskontext: Das opake Zugangstoken enthält ein
Standardmäßig beträgt maximumAuthenticationAgeInSeconds 600 Sekunden (10 Minuten). Du kannst dies pro Tenant von 1 bis 120 Minuten (60–7.200 Sekunden) konfigurieren unter Konsole > Anmeldung & Konto > Account Center unter Kürzliche Authentifizierung oder über die Management API (PATCH /api/account-center mit maximumAuthenticationAgeInSeconds).
Mit OIDC-Authentifizierungskontext kann ein Benutzer, der sich gerade mit einer von Logto verifizierbaren Methode angemeldet oder registriert hat, innerhalb dieses Fensters sensible Account API-Operationen ohne separate Verifizierungsaufforderung durchführen. Beachte, dass über die Verification API erstellte logto-verification-id-Nachweise weiterhin ihre feste 10-Minuten-TTL aus Kompatibilitätsgründen behalten.
Die Account API bewahrt auch die Ausnahme für das Initialpasswort: Ein Benutzer, der derzeit kein Passwort, keine primäre E-Mail oder keine primäre Telefonnummer hat, kann ein Initialpasswort über POST /api/my-account/password ohne kürzliche Identitätsverifizierung setzen. Das Setzen eines Passworts über die Account API aktualisiert nicht das OIDC-Sitzungs-acr und autorisiert keine nachfolgenden sensiblen Operationen.
Account API WWW-Authenticate-Challenge
Wenn eine First-Party-Account-API-Anfrage sowohl ein frisches urn:logto:acr:1fa-Zugangstoken als auch einen gültigen logto-verification-id-Header vermissen lässt, antwortet Logto mit 401 Unauthorized, bewahrt den bestehenden JSON-Fehlerbody zur Kompatibilität und fügt den RFC 9470 WWW-Authenticate-Header mit dem konfigurierten max_age des Tenants hinzu:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer error="insufficient_user_authentication", error_description="Recent user authentication is required", acr_values="urn:logto:acr:1fa", max_age="600"
Content-Type: application/json
{
"code": "verification_record.permission_denied",
"message": "Permission denied, please re-authenticate."
}
Vorgefertigtes Account Center
Das vorgefertigte Account Center UI (/account/*) verwendet ausschließlich OIDC-Step-up-Authentifizierung und erstellt niemals logto-verification-id-Berechtigungsnachweise:
- Es prüft
acrundauth_timeauf seinem lokalen ID-Token, um Step-up proaktiv vor sensiblen Inline-Aktionen oder mehrstufigen Unterseiten zu starten, wenn die Anmeldung keinurn:logto:acr:1faenthält oder veraltet ist, und behandelt auch RFC 9470401-Challenges der Account API als Fallback. - Nach Abschluss des Step-ups ersetzt das Account Center sein Token-Set und setzt die ausstehende Aktion höchstens einmal fort.
Verwandte Ressourcen
Multi-Faktor-AuthentifizierungWie du Zugangstokens in deinem API-Service oder Backend validierst
Opaker Token und Introspektion Kontoeinstellungen per Account APIKontoeinstellungen per vorgefertigtem Account Center UI