JWT-Tokens in C# (.NET): Erstellung, Überprüfung und Validierung
JSON Web Token (JWT) ist ein offener Standard (RFC 7519) zur Erstellung von Zugriffstokens, die auf dem JSON-Format basieren. JWT wird häufig in modernen Webanwendungen zur Authentifizierung und zum Informationsaustausch zwischen Client und Server verwendet. In diesem Artikel werden wir detailliert betrachten, wie man mit JWT-Tokens im C# (.NET)-Ökosystem arbeitet, einschließlich Erstellung, Signatur, Überprüfung und Validierung von Tokens.
Grundlegende Komponenten von JWT
JWT besteht aus drei Teilen, die durch Punkte getrennt sind:
- Header – enthält Informationen über den Tokentyp und den Signaturalgorithmus
- Payload – die Nutzlast mit Daten (Claims)
- Signature – die Signatur, die die Integrität des Tokens gewährleistet
Beispiel eines JWT-Tokens: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Installation der erforderlichen Pakete
Für die Arbeit mit JWT in .NET muss das Paket System.IdentityModel.Tokens.Jwt installiert werden. Dies kann über den NuGet Package Manager oder mit der .NET CLI erfolgen:
dotnet add package System.IdentityModel.Tokens.JwtMöglicherweise ist auch die Installation von Microsoft.AspNetCore.Authentication.JwtBearer für die Integration mit ASP.NET Core erforderlich:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearerErstellung eines JWT-Tokens in C#
Betrachten wir ein vollständiges Beispiel zur Erstellung eines JWT-Tokens mit einem symmetrischen Schlüssel (HMAC SHA256):
using System;using System.IdentityModel.Tokens.Jwt;using System.Security.Claims;using System.Text;using Microsoft.IdentityModel.Tokens;
public class JwtService{ private readonly string _secretKey; private readonly string _issuer; private readonly string _audience;
public JwtService(string secretKey, string issuer, string audience) { _secretKey = secretKey; _issuer = issuer; _audience = audience; }
public string GenerateToken(string userId, string userName, string role) { var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secretKey)); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var claims = new[] { new Claim(ClaimTypes.NameIdentifier, userId), new Claim(ClaimTypes.Name, userName), new Claim(ClaimTypes.Role, role), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim(JwtRegisteredClaimNames.Iat, new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds().ToString()) };
var token = new JwtSecurityToken( issuer: _issuer, audience: _audience, claims: claims, expires: DateTime.UtcNow.AddHours(1), signingCredentials: credentials );
return new JwtSecurityTokenHandler().WriteToken(token); }}Überprüfung und Validierung eines JWT-Tokens
Zur Authentifizierung und zum Extrahieren von Daten aus dem Token wird die Methode ValidateToken verwendet:
public ClaimsPrincipal ValidateToken(string token){ var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.UTF8.GetBytes(_secretKey);
try { var principal = tokenHandler.ValidateToken(token, new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = true, ValidIssuer = _issuer, ValidateAudience = true, ValidAudience = _audience, ValidateLifetime = true, ClockSkew = TimeSpan.Zero\ Auch in der Bibliothek
Caching in Java: Redis, Ehcache, Caffeine, Hazelcast – Überblick und Beispiele
MapStruct für Java: Vollständiges Tutorial mit Beispielen
yaml-cpp für C++: Komplette Anleitung mit Beispielen