Tokens JWT en C# (.NET): creación, verificación y validación
JSON Web Token (JWT) es un estándar abierto (RFC 7519) para la creación de tokens de acceso basados en el formato JSON. JWT se utiliza ampliamente en aplicaciones web modernas para la autenticación y el intercambio de información entre el cliente y el servidor. En este artículo, analizaremos en detalle cómo trabajar con tokens JWT en el ecosistema de C# (.NET), incluyendo la creación, firma, verificación y validación de tokens.
Componentes principales de JWT
JWT consta de tres partes separadas por puntos:
- Header — encabezado que contiene información sobre el tipo de token y el algoritmo de firma
- Payload — carga útil con datos (claims)
- Signature — firma que garantiza la integridad del token
Ejemplo de token JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Instalación de paquetes necesarios
Para trabajar con JWT en .NET, es necesario instalar el paquete System.IdentityModel.Tokens.Jwt. Esto se puede hacer a través del Administrador de paquetes NuGet o mediante la CLI de .NET:
dotnet add package System.IdentityModel.Tokens.JwtTambién puede ser necesario instalar Microsoft.AspNetCore.Authentication.JwtBearer para la integración con ASP.NET Core:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearerCreación de un token JWT en C#
Veamos un ejemplo completo de creación de un token JWT utilizando una clave simétrica (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); }}Verificación y validación del token JWT
Para verificar la autenticidad y extraer datos del token, se utiliza el método ValidateToken:
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\ También en la biblioteca
WireMock.Net para C# (.NET): guía completa con ejemplos
Trabajo con Excel en PHP: bibliotecas PhpSpreadsheet, PhpOffice y generación de XLSX
ORM para PHP: comparación de Doctrine, Eloquent y Cycle — ejemplos de código