Einführung in OAuth 2.0 und JWT in C#
\nModerne Webanwendungen erfordern zuverlässige Sicherheitsmechanismen. Zwei Schlüsselprotokolle – OAuth 2.0 und JWT (JSON Web Token) – sind zum De-facto-Standard für die Implementierung von Autorisierung und Authentifizierung geworden. In diesem Artikel werden wir untersuchen, wie diese Technologien im C# (.NET)-Ökosystem eingesetzt werden.
\nOAuth 2.0 ist ein Protokoll für delegierten Zugriff, das es Anwendungen ermöglicht, eingeschränkten Zugriff auf Benutzerressourcen zu erhalten, ohne deren Anmeldeinformationen weiterzugeben. JWT wiederum ist ein kompaktes und in sich geschlossenes Token-Format, das häufig zur Übertragung von Authentifizierungsinformationen zwischen Client und Server verwendet wird.
\nIn dieser Anleitung erstellen wir eine einfache Web-API mit ASP.NET Core, die OAuth 2.0 unter Verwendung von JWT-Token implementiert. Sie erfahren, wie Sie die Generierung, Validierung und den Schutz von Endpunkten konfigurieren.
\n\nWas sind OAuth 2.0 und JWT?
\nBevor wir zum Code übergehen, lassen Sie uns die grundlegenden Konzepte erläutern.
\nOAuth 2.0
\nOAuth 2.0 definiert vier Rollen:
\n- \n
- Resource Owner (Ressourceninhaber) – in der Regel der Benutzer. \n
- Client (Client) – die Anwendung, die Zugriff erhalten möchte. \n
- Authorization Server (Autorisierungsserver) – stellt Token aus. \n
- Resource Server (Ressourcenserver) – stellt geschützte Daten bereit. \n
Der Hauptablauf des Authorization Code Grant umfasst: Weiterleitung des Benutzers an den Autorisierungsserver, Erhalt eines Codes, Austausch des Codes gegen ein Zugriffstoken.
\n\nJWT (JSON Web Token)
\nJWT besteht aus drei Teilen, die durch Punkte getrennt sind:
\n- \n
- Header – Tokentyp und Signaturalgorithmus (z. B. HS256). \n
- Payload – Daten (Claims), wie Benutzer-ID, Rolle, Gültigkeitsdauer. \n
- Signature – Signatur, die mit einem geheimen Schlüssel erstellt wurde. \n
Beispiel eines JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Einrichten des ASP.NET Core-Projekts
\nWir erstellen ein neues Web-API-Projekt mit Authentifizierungsunterstützung.
\ndotnet new webapi -n OAuthJwtDemo\ncd OAuthJwtDemo\nFügen wir die erforderlichen NuGet-Pakete hinzu:
\ndotnet add package Microsoft.AspNetCore.Authentication.JwtBearer\ndotnet add package System.IdentityModel.Tokens.Jwt\n\nKonfiguration in appsettings.json
\nFügen Sie einen Abschnitt für JWT-Einstellungen in die Datei appsettings.json ein:
{\n "JwtSettings": {\n "SecretKey": "YOUR_SUPER_SECRET_KEY_AT_LEAST_32_CHARS",\n "Issuer": "OAuthJwtDemo",\n "Audience": "OAuthJwtDemoClient",\n "ExpirationMinutes": 60\n }\n}\nWichtig: In einem realen Projekt speichern Sie den geheimen Schlüssel in User Secrets oder Azure Key Vault.
\n\nImplementierung des JWT-Generierungsdienstes
\nWir erstellen ein Interface und dessen Implementierung für die Arbeit mit Token.
\nInterface IJwtService
\npublic interface IJwtService\n{\n string GenerateToken(string userId, string role);\n ClaimsPrincipal ValidateToken(string token);\n}\n\nImplementierung von JwtService
\npublic class JwtService : IJwtService\n{\n private readonly JwtSettings _settings;\n\n public JwtService(IOptions<JwtSettings> settings)\n {\n _settings = settings.Value;\n }\n\n public string GenerateToken(string userId, string role)\n {\n var claims = new[]\n {\n new Claim(ClaimTypes.NameIdentifier, userId),\n new Claim(ClaimTypes.Role, role),\n new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())\n };\n\n var key = new Symmetric