OpenID Connect · OAuth 2.0

Erweiterte Funktionen, einfach erklärt

Diese Mechanismen stärken die Sicherheit des Basisablaufs. Jeder begegnet einer bestimmten Schwäche: Wir beginnen mit dem Problem, dann die Lösung.

Der rote Faden

Der Basisablauf sendet Informationen über den Browser, wo jeder sie manipulieren kann. Die erweiterten Funktionen beheben das bei jedem Schritt: PAR und JAR schützen die Anfrage, private_key_jwt schützt die Identität der Anwendung, JARM schützt die Antwort, DPoP schützt das Token nach der Ausstellung, und CIBA behandelt den Fall ohne Browser. Hinzu kommen resource (welche API), RAR (welche genaue Operation), acr (welche Authentifizierungsstufe) und die dynamische Registrierung von Clients.

private_key_jwt · PAR · JAR · JARM · DPoP · CIBA · Resource Indicators · RAR · acr und Step-up · Dynamische Client-Registrierung · Pairwise und signiertes userinfo

private_key_jwt

RFC 7523 / OIDC Core 9

Beweisen Sie, wer Sie sind, mit einer Signatur statt einem gemeinsamen Passwort.

Das Problem

Ein vertraulicher Client authentifiziert sich normalerweise mit einem „client_secret“, einem Passwort, das Client und Server beide kennen. Gelangt es auf einer Seite nach außen, kann die andere es nicht wissen, und das Geheimnis wandert durch Konfigurationsdateien.

So funktioniert es

Der Client behält einen privaten Schlüssel, der seine Räumlichkeiten nie verlässt. Bei jedem Aufruf baut er ein kleines signiertes „Zeugnis“ (ein JWT): „Ich bin dieser Client, ich wende mich an diesen Server, und das gilt nur wenige Minuten.“ Der Server hat nur den öffentlichen Schlüssel: Er prüft die Signatur, mehr nicht.

Als Bild

Statt eines Passworts, das der Wächter kennt, signieren Sie jeden Eintritt mit Ihrem persönlichen Stift; der Wächter hat nur eine Unterschriftsprobe.

Wann man ihn einsetzt

Banken, öffentliche Verwaltungen, jede Umgebung, die gemeinsame Geheimnisse verbietet. In mehreren Sicherheitsprofilen (FAPI) verpflichtend.

Fallstricke

Wiedergegebene Assertion (daher der einmalige Bezeichner „jti“), falsche Audience, zu lange Lebensdauer, falscher Schlüssel.

In ID-Kit

Erstellen Sie in Ihrem Test-Provider einen Client „Vertraulich mit Schlüssel (private_key_jwt)“, fügen Sie Ihr Zertifikat oder öffentliches JWKS ein und rufen Sie dann /token mit client_assertion auf. ID-Kit sagt Ihnen genau, warum eine Assertion abgelehnt wird.

PAR: Pushed Authorization Request

RFC 9126

Ihre Anmeldeanfrage direkt an den Server senden, ohne über den Browser zu gehen.

Das Problem

Normalerweise steht die Anfrage (wer ich bin, was ich will, wohin zurück) in der Seitenadresse und läuft über den Browser: Benutzer oder Schadsoftware können sie lesen oder ändern, und sehr lange Adressen sind ein Problem.

So funktioniert es

Die Anwendung sendet zuerst ihre gesamte Anfrage von Server zu Server an den Server und authentifiziert sich dabei. Der Server antwortet mit einem einfachen „Ticket“ (request_uri), eine Minute gültig. Die Anwendung schickt dann den Browser nur mit diesem Ticket zum Server. Das Ticket ist nur einmal verwendbar.

Als Bild

Statt Ihre Bestellung quer durch den Speisesaal zu rufen, geben Sie sie der Küche und zeigen dem Saal nur eine Ticketnummer.

Wann man ihn einsetzt

Immer wenn Sie verhindern wollen, dass ein Parameter manipuliert wird (Betrag, Scopes, redirect_uri): Banken, Gesundheitswesen, Zahlungen. Von FAPI gefordert.

Fallstricke

Ticket abgelaufen (60 s), bereits verwendet oder von einem anderen Client vorgelegt als dem, der es eingereicht hat.

In ID-Kit

Test-Provider: Rufen Sie /par auf. Wählen Sie bei der Testanwendung den Flow „code_par“. Die Einstellung „Require PAR“ des Providers lehnt klassische Anfragen ab.

JAR: signierte Autorisierungsanfrage

RFC 9101

Die Anmeldeanfrage signieren, damit niemand sie unterwegs ändern kann.

Das Problem

Selbst mit den Parametern in der Adresse beweist nichts, dass sie wirklich von der Anwendung stammen und nicht geändert wurden.

So funktioniert es

Die Parameter werden in einem mit dem Schlüssel des Clients signierten JWT gebündelt (Parameter „request“). Der Server prüft Signatur, Issuer, Audience und Datum. Die Parameter des JWT ersetzen die der Adresse.

Als Bild

Ein Brief in einem mit Wachs versiegelten Umschlag: Ist das Siegel gebrochen, sieht es der Server.

Wann man ihn einsetzt

Mit PAR in Hochsicherheitsprofilen; allein, wenn es keinen Server-zu-Server-Kanal gibt.

Fallstricke

Öffentlicher Client-Schlüssel nicht registriert, „aud“ ist nicht der Issuer des Servers, abgelaufenes JWT, abweichende client_id.

In ID-Kit

Registrieren Sie den öffentlichen Schlüssel des Clients und senden Sie dann Ihr JWT in „request“ oder an /par. Falsche Signaturen und Audiences werden erklärt.

JARM: signierte Autorisierungsantwort

FAPI JARM

Der Server signiert auch seine Antwort: Die Anwendung weiß, dass sie wirklich von ihm stammt und nicht verändert wurde.

Das Problem

Wenn der Server den Benutzer mit „code=…“ in der Adresse zur Anwendung zurückschickt, kann jeder im Browser daran herumfummeln. Das öffnet die Tür für Angriffe, bei denen ein anderer Server den richtigen imitiert („Mix-up“).

So funktioniert es

Statt mehrerer einfacher Parameter liefert der Server einen einzigen Parameter „response“: ein signiertes JWT mit code, state, dem Issuer (iss) und der Audience (aud). Die Anwendung prüft die Signatur und liest dann den darin enthaltenen Code. Vier Varianten: jwt, query.jwt, fragment.jwt, form_post.jwt (je nachdem, wo das JWT platziert wird).

Als Bild

Die Antwort kommt in einem versiegelten Umschlag statt auf einer Postkarte.

Wann man ihn einsetzt

FAPI-2.0-Profil und regulierte Branchen. Auch nützlich, um Mix-up-Angriffe zwischen Servern zu erkennen.

Fallstricke

Die Signatur nicht prüfen oder einfache Parameter neben dem JWT lesen. query.jwt ist verboten, wenn Token über den Browser zurückkommen.

In ID-Kit

Fügen Sie response_mode=jwt (oder eine Variante) zu Ihrer Autorisierungsanfrage beim Test-Provider hinzu: Auch eine Ablehnung oder ein Fehler wird signiert.

DPoP: schlüsselgebundenes Token

RFC 9449

Ein gestohlenes Token ist ohne den Schlüssel der Anwendung, die es angefordert hat, nutzlos.

Das Problem

Ein „Bearer“-Token funktioniert wie Bargeld: Wer es hält, kann es nutzen, auch wenn er es aus einem Log, einer Browser-Erweiterung oder einer kompromittierten API gestohlen hat.

So funktioniert es

Die Anwendung erzeugt ein Schlüsselpaar. Bei jedem Aufruf hängt sie einen kurzen, mit ihrem privaten Schlüssel signierten „Nachweis“ an: „Hier sind Methode und Adresse, die ich aufrufe, in diesem Augenblick.“ Der Server bindet das Token an den Fingerabdruck des Schlüssels (cnf.jkt). Die API prüft, dass der Nachweis vom selben Schlüssel signiert wurde und den Hash des Tokens (ath) trägt. Ein Dieb, der das Token, aber nicht den privaten Schlüssel hat, ist blockiert.

Als Bild

Eine Bankkarte mit PIN statt Geldscheinen: Die Karte allein genügt nicht.

Wann man ihn einsetzt

Mobile Apps und Webseiten (SPA), bei denen Token exponiert sind, sensible APIs, FAPI-2.0-Profile.

Fallstricke

Wiedergegebener Nachweis (einmaliges jti), falsche Methode oder Adresse (htm, htu), verstellte Uhr (iat ±2 Min.), Token mit „Bearer“ statt „DPoP“ vorgelegt, ath bei der API fehlt.

In ID-Kit

Senden Sie einen DPoP-Header an /token des Test-Providers: Das Token wird zu token_type DPoP mit cnf.jkt. Bei /userinfo benötigen Sie „Authorization: DPoP“ plus einen Nachweis mit ath, sonst erklärt eine Meldung, was fehlt.

CIBA: Authentifizierung auf einem anderen Gerät

OpenID CIBA Core

Eine Anwendung bittet den Server, jemanden auf seinem Telefon zu authentifizieren, ohne Browser oder Weiterleitung.

Das Problem

An einem Schalter, in einem Callcenter, an einem Zahlungsterminal oder bei einem Sprachassistenten sitzt die Person nicht vor einem Browser, der weiterleiten kann.

So funktioniert es

Die Anwendung sagt dem Server „authentifiziere Alice“ (login_hint), optional mit einer anzuzeigenden Nachricht („Zahlung von 25 € autorisieren?“), und erhält eine auth_req_id. Der Server kontaktiert Alice auf ihrem Telefon. Währenddessen fragt die Anwendung /token ab: „authorization_pending“, solange Alice nicht geantwortet hat, dann die Token, wenn sie akzeptiert, oder „access_denied“, wenn sie ablehnt.

Als Bild

Der Verkäufer ruft Ihre Bank an und sagt „mein Kunde ist hier“, und Ihre Bank schickt Ihnen eine Benachrichtigung zur Bestätigung.

Wann man ihn einsetzt

Bestätigung von Zahlungen oder sensiblen Operationen, Callcenter, Terminals, Telefonie. Die Bindungsnachricht (binding_message) erscheint auf beiden Bildschirmen, um zu prüfen, dass die richtige Operation bestätigt wird.

Fallstricke

Zu schnell abfragen (slow_down), die Anfrage ablaufen lassen, vergessen, dass login_hint einen dem Server bekannten Benutzer bezeichnen muss.

In ID-Kit

Aktivieren Sie den CIBA-Flow bei einem Client des Test-Providers und rufen Sie /bc-authorize auf. Die Antwort enthält einen Link „idkit_approval_url“: Das ist die „Telefon“-Seite, auf der Sie genehmigen oder ablehnen; danach holen Sie die Token mit /token. ID-Kit unterstützt nur den Poll-Modus.

Resource Indicators: für welche API das Token bestimmt ist

RFC 8707

Sagen Sie, mit welcher API Sie sprechen wollen, damit das Token nur dort funktioniert.

Das Problem

Ein für „jede API“ gültiges Access-Token ist gefährlich: Wird die Abrechnungs-API kompromittiert, kann sie das Token gegen die Gehalts-API wiederverwenden.

So funktioniert es

Die Anwendung fügt ihrer Anfrage (Autorisierung oder Token) „resource=https://api.example.com/invoices“ hinzu. Der Provider setzt diese Adresse in die Audience (aud) des Tokens. Die API prüft, dass aud sie selbst ist, und lehnt sonst ab.

Als Bild

Eine namentliche Zugfahrkarte für eine bestimmte Strecke statt eines überall gültigen Tickets.

Wann man ihn einsetzt

Sobald mehrere APIs hinter demselben Provider stehen, und für sensible Token.

Fallstricke

API, die aud nicht prüft; Ressource mit Fragment (#) oder die keine absolute Adresse ist (invalid_target).

In ID-Kit

Fügen Sie resource zu /authorize oder /token des Test-Providers hinzu: Die Audience des JWT-Tokens und der Introspection ändert sich. Die Ressource wird im Code gemerkt und beim Refresh beibehalten.

RAR: detaillierte Autorisierungen

RFC 9396

Ein genaues Recht anfordern („25 € an X zahlen“) statt eines breiten Scopes („zahlen“).

Das Problem

Ein Scope wie „payments“ ist zu vage: Der Benutzer weiß nicht, was er genehmigt, und das Token erlaubt weit mehr als die vorgesehene Operation.

So funktioniert es

Die Anwendung sendet authorization_details: eine JSON-Liste von Objekten mit einem „type“ (zum Beispiel payment_initiation) und den Details der Operation (Betrag, Empfänger). Der Provider zeigt sie an, kopiert sie ins Token und in die Antwort, und die API liest sie.

Als Bild

Ein ausgefüllter Scheck (Betrag, Empfänger) statt eines Blankoschecks.

Wann man ihn einsetzt

Zahlungen, Gesundheitswesen, feingranulare Delegation. In einigen Bankprofilen verpflichtend.

Fallstricke

Ungültiges JSON oder fehlendes „type“ (invalid_authorization_details); API, die den Token-Inhalt ignoriert.

In ID-Kit

Senden Sie authorization_details an /authorize oder /token: ID-Kit validiert es und findet es im Token, in der /token-Antwort und in der Introspection wieder.

acr und Step-up: Authentifizierungsstufe

OIDC Core, RFC 9470

Wissen, wie stark sich die Person authentifiziert hat, und bei Bedarf mehr verlangen.

Das Problem

Sich mit einem Passwort anzumelden genügt nicht, um 10 000 € zu überweisen. Die Anwendung muss sagen können „ich will starke Authentifizierung“.

So funktioniert es

Die Anwendung fragt acr_values an (zum Beispiel die Stufe „mfa“). Der Provider liefert im ID-Token den erreichten acr-Wert und die Liste amr der verwendeten Methoden (Passwort, Einmalcode…). Eine API kann ein Token zu niedriger Stufe ablehnen und ein „Step-up“ verlangen: Die Person muss sich stärker authentifizieren.

Als Bild

In der Bank dürfen Sie mit Ihrer Karte Ihr Konto einsehen, aber für eine große Überweisung wird zusätzlich ein Ausweis verlangt.

Wann man ihn einsetzt

Sensible Operationen, Compliance (starke Authentifizierung).

Fallstricke

acr_values als Anforderung behandeln, obwohl es eine Bitte („freiwillig“) ist; das erhaltene acr nicht prüfen.

In ID-Kit

Fügen Sie acr_values=urn:idkit:acr:mfa hinzu: Das ID-Token enthält acr und amr [pwd, otp], und die Introspection liefert acr und auth_time. Ohne Anfrage ist die Stufe „pwd“.

Dynamische Client-Registrierung

RFC 7591

Eine Anwendung registriert sich selbst beim Provider, ohne über einen Administrator zu gehen.

Das Problem

Clients von Hand anzulegen skaliert nicht: Werkzeuge, Erweiterungen, MCP-Server, mobile Apps, die von Tausenden installiert werden.

So funktioniert es

Die Anwendung sendet einen JSON-POST an /register (Name, Rückkehradressen, gewünschte Abläufe, Authentifizierungsmethode). Der Provider legt den Client an und liefert client_id und gegebenenfalls client_secret.

Als Bild

Ein Selbstbedienungs-Anmeldeterminal statt eines Termins am Empfang.

Wann man ihn einsetzt

Offene Ökosysteme, Werkzeuge, die sich an unbekannte Provider anschließen.

Fallstricke

Unsichere Weiterleitungen (http außerhalb von localhost), zur Authentifizierungsmethode inkonsistente Grants, kein Limit.

In ID-Kit

Aktivieren Sie „Allow dynamic registration“ in den Einstellungen des Test-Providers und senden Sie dann einen POST an /register. Das Limit beträgt 25 Clients.

Pairwise und signiertes userinfo

OIDC Core 8.1 und 5.3.2

Ein anderer Bezeichner pro Anwendung und signierte Profilinformationen.

Das Problem

Sehen alle Anwendungen denselben Bezeichner (sub) einer Person, können sie ihre Datenbanken abgleichen und sie von einem Dienst zum anderen verfolgen.

So funktioniert es

Im Pairwise-Modus berechnet der Provider für jede Anwendungsdomain ein anderes sub: Derselbe Benutzer erscheint bei zwei Anwendungen unter zwei verschiedenen Bezeichnern. Unabhängig davon kann /userinfo mit einem signierten JWT statt einfachem JSON antworten, damit die Anwendung die Herkunft der Informationen nachweisen kann.

Als Bild

Ein anderes Pseudonym pro Website statt einer Sozialversicherungsnummer überall.

Wann man ihn einsetzt

Datenschutz (öffentliche Verwaltungen, Gesundheitswesen, Bildung); Umgebungen, in denen Profilinformationen signiert sein müssen.

Fallstricke

Konten über Anwendungen hinweg mit sub verknüpfen (mit Pairwise unmöglich); vergessen, dass das sub in userinfo mit dem im ID-Token identisch sein muss.

In ID-Kit

Zwei Einstellungen beim Test-Provider: „Bezeichner pro Anwendung (pairwise)“ und „userinfo als signiertes JWT“.

Siehe auch: Sequenzdiagramme · welchen Ablauf wählen? · die Zeitleiste