OAuth-Client für C# (.NET): Bibliothek IdentityModel und Integration mit OAuth 2.0

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Bibliothek IdentityModel für OAuth 2.0 und OpenID Connect in C# (.NET)

\n\n

Bei der Entwicklung moderner Webanwendungen, mobiler Clients oder Server-APIs auf der .NET-Plattform entsteht fast immer die Notwendigkeit der Integration mit externen Authentifizierungsanbietern (Google, GitHub, Microsoft usw.) oder einem eigenen Autorisierungsserver. IdentityModel ist eine leichtgewichtige, aber leistungsstarke Bibliothek für C#, die einen praktischen OAuth-Client für die Arbeit mit den Protokollen OAuth 2.0 und OpenID Connect bereitstellt. Sie ist der De-facto-Standard im .NET-Ökosystem für die Implementierung von Autorisierungsabläufen.

\n\n

In diesem Artikel werden wir im Detail besprechen, wie man IdentityModel verwendet, um einen OAuth-Client zu erstellen, Zugriffstoken zu erhalten und diese zu erneuern. Die Codebeispiele sind in C# (.NET 6+).

\n\n

Installation und Einbindung

\n\n

Installieren Sie das Paket zunächst über den NuGet Package Manager:

\n\n
dotnet add package IdentityModel
\n\n

Oder über die Paket-Manager-Konsole:

\n\n
Install-Package IdentityModel
\n\n

Nach der Installation erhalten Sie Zugriff auf die Klassen HttpClient-Erweiterungen, DiscoveryClient, TokenClient und andere Hilfsprogramme.

\n\n

Basisszenario: Token-Abruf mittels Client Credentials

\n\n

Dieser Ablauf wird für die Server-zu-Server-Authentifizierung verwendet, wenn der Client (Ihre Anwendung) ein Token im eigenen Namen und nicht im Namen eines Benutzers anfordert.

\n\n

Beispiel für die Konfiguration eines OAuth-Clients:

\n\n
using IdentityModel.Client;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\npublic async Task<string> GetAccessTokenAsync()\n{\n    var client = new HttpClient();\n\n    // 1. Discovery-Dokument vom Autorisierungsserver abrufen\n    var disco = await client.GetDiscoveryDocumentAsync("https://your-auth-server.com");\n    if (disco.IsError)\n    {\n        throw new Exception($"Fehler beim Abrufen des Discovery: {disco.Error}");\n    }\n\n    // 2. Token mit client_id und client_secret anfordern\n    var tokenResponse = await client.RequestClientCredentialsTokenAsync(\n        new ClientCredentialsTokenRequest\n        {\n            Address = disco.TokenEndpoint,\n            ClientId = "your-client-id",\n            ClientSecret = "your-client-secret",\n            Scope = "api1 api2" // angeforderte Berechtigungen\n        });\n\n    if (tokenResponse.IsError)\n    {\n        throw new Exception($"Fehler beim Abrufen des Tokens: {tokenResponse.Error}");\n    }\n\n    return tokenResponse.AccessToken;\n}
\n\n

In diesem Beispiel verwenden wir Erweiterungsmethoden aus dem Namespace IdentityModel.Client. Die Bibliothek verarbeitet automatisch die JSON-Serialisierung, Header und das Parsen der Antworten.

\n\n

Authorization-Code-Ablauf (mit Benutzerbeteiligung)

\n\n

Für Anwendungen mit Benutzeroberfläche (ASP.NET Core MVC, Blazor, Desktop) wird häufiger der Autorisierungscode verwendet. IdentityModel integriert sich in Microsoft.AspNetCore.Authentication.OpenIdConnect, bietet aber auch Low-Level-Mittel für eine manuelle Implementierung.

\n\n

Beispiel für den Token-Abruf nach der Weiterleitung mit dem Code:

\n\n
public async Task<TokenResponse> ExchangeCodeForTokenAsync(string authorizationCode, string redirectUri)\n{\n    var client = new HttpClient();\n    var disco = await client.GetDiscoveryDocumentAsync("https://your-auth-server.com");\n\n    var tokenResponse = await client.RequestAuthorizationCodeTokenAsync(\n        new AuthorizationCodeTokenRequest\n        {\n            Address = disco.TokenEndpoint,\n            ClientId = "your-client-id",\n            ClientSecret = "your-client-secret",\n            Code = authorizationCode,\n            RedirectUri = redirectUri\n        });\n\n    return tokenResponse;\n}
\n\n

Token-Erneuerung (Refresh Token)

\n\n

Access-Token haben in der Regel eine kurze Lebensdauer (z. B. 1 Stunde).

Empfehlungen