Grant Types und Flows

Jeder Client legt unter Allowed Grants einen oder mehrere Grant Types fest. Ein Grant Type bestimmt, wie ein Client Tokens von IdentityServerNET erhält — welche Endpoints beteiligt sind, ob ein Benutzer anwesend ist und wie Credentials ausgetauscht werden.

Diese Seite erklärt die verfügbaren Grant Types und führt durch die empfohlenen Flows mit Sequenzdiagrammen und Beispiel-HTTP-Requests. Alle Beispiele verwenden die Authority https://localhost:44300 und den Demo-Client is-webclient-test.

Übersicht der Grant Types

Folgende Grant Types können unter Allowed Grants aktiviert werden. Die Beschreibungen entsprechen denen im Admin-UI:

Grant

Beschreibung

Status

authorization_code

Empfohlen für Web-Apps — tauscht einen kurzlebigen Code nach dem Login gegen Tokens.

Empfohlen

client_credentials

Machine-to-Machine — der Client authentifiziert sich mit seinem eigenen Secret, ohne Benutzer.

Empfohlen

refresh_token

Ermöglicht neue Access Tokens ohne erneute Anmeldung mittels eines langlebigen Refresh Tokens.

Empfohlen

urn:ietf:params:oauth:grant-type:device_code

Für eingabebeschränkte Geräte (TV, CLI) — der Benutzer autorisiert auf einem zweiten Gerät mit Browser.

Empfohlen

urn:ietf:params:oauth:grant-type:jwt-bearer

Tauscht ein signiertes JWT-Assertion gegen einen OAuth Access Token (Föderation / Service-Accounts).

Erweitert

urn:ietf:params:oauth:grant-type:saml2-bearer

Tauscht ein SAML-2.0-Assertion gegen einen OAuth Access Token.

Erweitert

urn:ietf:params:oauth:grant-type:token-exchange

Tauscht einen Token gegen einen anderen; unterstützt Impersonation und Delegation.

Erweitert

urn:openid:params:grant-type:ciba

Client-Initiated Backchannel Authentication — Authentifizierung über einen Out-of-Band-Kanal (z. B. Push-Benachrichtigung).

Erweitert

implicit

Veralteter Browser-Flow — Tokens werden direkt vom Authorization-Endpoint zurückgegeben. Deprecated, stattdessen Authorization Code + PKCE.

Deprecated

hybrid

Kombination aus Code und Implicit. Stattdessen Authorization Code + PKCE bevorzugen.

Deprecated

password

Resource Owner Password — der Benutzer gibt seine Credentials direkt an den Client. Für öffentliche Clients vermeiden.

Deprecated

Bemerkung

Beim Erstellen eines Clients aus einem Template (WebApplication, ApiClient, JavascriptClient) werden die passenden Grant Types automatisch gesetzt. Allowed Grants muss nur selten von Hand bearbeitet werden.

Warnung

Die Grants implicit, hybrid und password gelten als veraltet. Moderne Clients sollten Authorization Code mit PKCE (für interaktive Anmeldungen) oder Client Credentials (für Machine-to-Machine) verwenden. Sie sind hier nur der Vollständigkeit halber aufgeführt und erhalten kein eigenes Flow-Diagramm.

Authorization Code + PKCE

Der Standard-Flow für Web-Anwendungen und Single-Page-Apps. Der Benutzer authentifiziert sich bei IdentityServerNET, der Client erhält einen kurzlebigen code und tauscht ihn auf dem Back-Channel gegen Tokens. PKCE (Proof Key for Code Exchange) bindet den Code an den Client, der den Flow gestartet hat, und verhindert so das Abfangen des Codes.

Verwendet von den Templates WebApplication und JavascriptClient. Aktivierung über den Grant authorization_code und die Option RequirePkce.

sequenceDiagram participant B as Browser participant C as Client (Web-App) participant IS as IdentityServerNET B->>C: Geschützte Seite öffnen C->>B: Redirect zu /connect/authorize (+ code_challenge) B->>IS: GET /connect/authorize IS->>B: Login-Seite anzeigen B->>IS: Credentials senden IS->>B: Redirect zu redirect_uri (+ code) B->>C: code übermitteln C->>IS: POST /connect/token (code + code_verifier + secret) IS->>C: access_token, id_token, refresh_token C->>B: Session-Cookie setzen

Schritt 1 — Authorization Request (Browser):

GET https://localhost:44300/connect/authorize?
    client_id=is-webclient-test&
    response_type=code&
    scope=openid profile offline_access&
    redirect_uri=https://localhost:44360/signin-oidc&
    code_challenge=K2-ltc0...&
    code_challenge_method=S256&
    state=xyz&
    nonce=abc

Schritt 2 — Token Request (Back-Channel, nachdem der Code zurückkam):

POST https://localhost:44300/connect/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&
client_id=is-webclient-test&
client_secret=secret&
code=8f1a...&
code_verifier=dBjftJeZ...&
redirect_uri=https://localhost:44360/signin-oidc

Bemerkung

In einem ASP.NET-Core-Client führt die OIDC-Middleware beide Schritte automatisch aus — siehe Web Anwendung. Die PKCE-Parameter (code_challenge / code_verifier) werden für Sie erzeugt und validiert.

Pushed Authorization Request (PAR)

Eine Härtung des Authorization-Code-Flows (RFC 9126). Statt alle Parameter in die Browser-URL zu schreiben, schickt der Client sie zuerst per POST an den /connect/par-Endpoint auf dem Back-Channel und erhält eine kurzlebige request_uri. Der Browser-Redirect trägt dann nur noch client_id und request_uri — weder scope, code_challenge noch client_secret sind jemals in der URL oder in Server-Logs sichtbar.

sequenceDiagram participant B as Browser participant C as Client participant IS as IdentityServerNET C->>IS: POST /connect/par (alle Parameter + Secret) IS->>C: request_uri (läuft in 60s ab) C->>B: Redirect zu /connect/authorize?client_id=...&request_uri=... B->>IS: GET /connect/authorize (nur request_uri) IS->>B: Login-Seite anzeigen B->>IS: Credentials senden IS->>B: Redirect zu redirect_uri (+ code) B->>C: code übermitteln C->>IS: POST /connect/token IS->>C: Tokens

Schritt 1 — Parameter pushen (Back-Channel):

POST https://localhost:44300/connect/par
Content-Type: application/x-www-form-urlencoded

client_id=is-webclient-test&
client_secret=secret&
response_type=code&
scope=openid profile&
redirect_uri=https://localhost:44360/signin-oidc&
code_challenge=K2-ltc0...&
code_challenge_method=S256

Antwort:

HTTP/1.1 201 Created
{
    "request_uri": "urn:ietf:params:oauth:request_uri:8f1a...",
    "expires_in": 60
}

Schritt 2 — Der Browser-Redirect verwendet nur die request_uri:

GET https://localhost:44300/connect/authorize?
    client_id=is-webclient-test&
    request_uri=urn:ietf:params:oauth:request_uri:8f1a...

PAR kann pro Client über die Option RequirePushedAuthorization erzwungen werden (siehe Client-Referenz (Advanced Options)). Der Server veröffentlicht außerdem den pushed_authorization_request_endpoint in seinem Discovery-Dokument, sodass die ASP.NET-Core- OIDC-Middleware (ab .NET 9) ihn automatisch verwendet. Zur serverseitigen Speicherung der request_uri siehe den Abschnitt Stores in Konfiguration.

Client Credentials

Machine-to-Machine-Zugriff ohne Benutzer. Der Client authentifiziert sich mit seinem eigenen Secret und erhält einen Access Token. Verwendet vom Template ApiClient.

sequenceDiagram participant C as Client (Service) participant IS as IdentityServerNET participant API as Web API C->>IS: POST /connect/token (client_id + secret) IS->>C: access_token C->>API: Request + Bearer access_token API->>C: Geschützte Ressource
POST https://localhost:44300/connect/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&
client_id=my-api-commands&
client_secret=secret&
scope=my-api my-api.command

Siehe API Client für eine vollständige Anleitung inklusive der Absicherung der Ziel-Web-API.

Device Flow

Für eingabebeschränkte Geräte (Smart-TVs, CLI-Tools), die nicht einfach einen Browser anzeigen können. Das Gerät fordert einen user_code an und bittet den Benutzer, ihn auf einem zweiten Gerät (Smartphone, Laptop) einzugeben, während es den Token-Endpoint pollt, bis der Benutzer autorisiert hat. Aktivierung über den Grant urn:ietf:params:oauth:grant-type:device_code.

sequenceDiagram participant D as Gerät (TV/CLI) participant IS as IdentityServerNET participant U as Smartphone des Benutzers D->>IS: POST /connect/deviceauthorization IS->>D: device_code, user_code, verification_uri D->>U: "Öffne URL, gib CODE ein" anzeigen U->>IS: verification_uri öffnen, anmelden, user_code eingeben loop bis autorisiert D->>IS: POST /connect/token (device_code) IS->>D: authorization_pending end IS->>D: access_token, refresh_token

Schritt 1 — Gerät fordert einen Code an:

POST https://localhost:44300/connect/deviceauthorization
Content-Type: application/x-www-form-urlencoded

client_id=device-client&scope=openid profile

Antwort:

{
    "device_code": "GmRh...",
    "user_code": "WDJB-MJHT",
    "verification_uri": "https://localhost:44300/device",
    "expires_in": 300,
    "interval": 5
}

Schritt 2 — Gerät pollt den Token-Endpoint:

POST https://localhost:44300/connect/token
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:device_code&
client_id=device-client&
device_code=GmRh...

Refresh Token

Ermöglicht einem Client, einen neuen Access Token zu erhalten, wenn der alte abgelaufen ist, ohne den Benutzer erneut durch den Login-Flow zu schicken. Erfordert die Option AllowOfflineAccess und den Scope offline_access im ursprünglichen Request. Der Client erhält neben dem Access Token einen refresh_token und tauscht ihn später ein.

sequenceDiagram participant C as Client participant IS as IdentityServerNET Note over C: access_token abgelaufen C->>IS: POST /connect/token (grant_type=refresh_token) IS->>C: neuer access_token (+ neuer refresh_token)
POST https://localhost:44300/connect/token
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token&
client_id=is-webclient-test&
client_secret=secret&
refresh_token=8xLOxBtZp8...

Lebensdauer und Rotationsverhalten von Refresh Tokens werden über die Advanced Properties gesteuert (AbsoluteRefreshTokenLifetime, SlidingRefreshTokenLifetime, RefreshTokenUsage, RefreshTokenExpiration) — siehe Client-Referenz (Advanced Options).