Bibliothek IdentityModel für OAuth 2.0 und OpenID Connect in C# (.NET)
\n\nBei 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\nIn 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\nInstallation und Einbindung
\n\nInstallieren Sie das Paket zunächst über den NuGet Package Manager:
\n\ndotnet add package IdentityModel\n\nOder über die Paket-Manager-Konsole:
\n\nInstall-Package IdentityModel\n\nNach der Installation erhalten Sie Zugriff auf die Klassen HttpClient-Erweiterungen, DiscoveryClient, TokenClient und andere Hilfsprogramme.
Basisszenario: Token-Abruf mittels Client Credentials
\n\nDieser 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\nBeispiel für die Konfiguration eines OAuth-Clients:
\n\nusing 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\nIn diesem Beispiel verwenden wir Erweiterungsmethoden aus dem Namespace IdentityModel.Client. Die Bibliothek verarbeitet automatisch die JSON-Serialisierung, Header und das Parsen der Antworten.
Authorization-Code-Ablauf (mit Benutzerbeteiligung)
\n\nFü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.
Beispiel für den Token-Abruf nach der Weiterleitung mit dem Code:
\n\npublic 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\nToken-Erneuerung (Refresh Token)
\n\nAccess-Token haben in der Regel eine kurze Lebensdauer (z. B. 1 Stunde).