JWT-Token in C# (.NET): Vollständige Anleitung zur Arbeit mit System.IdentityModel.Tokens.Jwt
\n\nJSON Web Token (JWT) ist ein kompaktes, URL-sicheres Format zur Übertragung von Daten zwischen Parteien in Form eines JSON-Objekts. Im C# (.NET)-Ökosystem wird für die Arbeit mit JWT die leistungsstarke Bibliothek System.IdentityModel.Tokens.Jwt verwendet, die Teil des Pakets Microsoft.IdentityModel.Tokens ist. Dieses Tool ermöglicht das Generieren, Signieren, Validieren und Dekodieren von JWT-Token und gewährleistet so eine sichere Authentifizierung und Datenübertragung in Webanwendungen, APIs und Microservices.
\n\nInstallation der Bibliothek
\nFügen Sie zunächst das NuGet-Paket zu Ihrem Projekt hinzu. Führen Sie den folgenden Befehl in der Paketmanager-Konsole aus:
\ndotnet add package System.IdentityModel.Tokens.Jwt\nOder über die Package Manager Console in Visual Studio:
\nInstall-Package System.IdentityModel.Tokens.Jwt\n\nHauptkomponenten der Bibliothek
\n- \n
JwtSecurityTokenHandler— die Hauptklasse zum Erstellen, Serialisieren und Validieren von Token. \n SecurityTokenDescriptor— Beschreibung des Tokens: Claims, Lebensdauer, Signatur. \n SymmetricSecurityKey— symmetrischer Schlüssel für die Signatur (HS256, HS384, HS512). \n SigningCredentials— Signaturanmeldeinformationen (Algorithmus + Schlüssel). \n TokenValidationParameters— Validierungsparameter (Überprüfung der Signatur, Lebensdauer, Aussteller). \n
Generierung eines JWT-Tokens in C#
\nErstellen wir ein einfaches Token mit benutzerdefinierten Claims und einer Lebensdauer von 1 Stunde:
\nusing System.IdentityModel.Tokens.Jwt;\nusing System.Security.Claims;\nusing System.Text;\nusing Microsoft.IdentityModel.Tokens;\n\npublic string GenerateToken()\n{\n var secretKey = "my_super_secret_key_1234567890!";\n var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));\n var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);\n\n var claims = new[]\n {\n new Claim(ClaimTypes.Name, "Ivan Petrov"),\n new Claim(ClaimTypes.Email, "ivan@example.com"),\n new Claim(ClaimTypes.Role, "Admin")\n };\n\n var tokenDescriptor = new SecurityTokenDescriptor\n {\n Subject = new ClaimsIdentity(claims),\n Expires = DateTime.UtcNow.AddHours(1),\n Issuer = "MyApp",\n Audience = "MyAppUsers",\n SigningCredentials = credentials\n };\n\n var tokenHandler = new JwtSecurityTokenHandler();\n var token = tokenHandler.CreateToken(tokenDescriptor);\n return tokenHandler.WriteToken(token);\n}\n\nValidierung (Verifikation) eines JWT-Tokens
\nBeim Erhalt eines Tokens vom Client müssen dessen Signatur, Gültigkeitsdauer und andere Parameter überprüft werden:
\npublic ClaimsPrincipal ValidateToken(string token)\n{\n var secretKey = "my_super_secret_key_1234567890!";\n var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));\n\n var tokenHandler = new JwtSecurityTokenHandler();\n var validationParameters = new TokenValidationParameters\n {\n ValidateIssuer = true,\n ValidIssuer = "MyApp",\n ValidateAudience = true,\n ValidAudience = "MyAppUsers",\n ValidateLifetime = true,\n IssuerSigningKey = key,\n ClockSkew = TimeSpan.Zero // Standard-Zeittoleranz entfernen\n };\n\n try\n {\n var principal = tokenHandler.ValidateToken(token, validationParameters, out SecurityToken validatedToken);\n return principal;\n }\n catch (SecurityTokenExpiredException)\n {\n Console.WriteLine("Token abgelaufen");\n return null;\n }\n catch (SecurityTokenInvalidSignatureException)\n {\n Console.WriteLine("Ungültige Token-Signatur");\n return null;\n }\n}\n\nDekodieren eines Tokens ohne Signaturprüfung
\nManchmal muss man einfach nur