Tokens JWT en C# (.NET): guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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.Jwt


También puede ser necesario instalar Microsoft.AspNetCore.Authentication.JwtBearer para la integración con ASP.NET Core:



dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer


Creació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\

Recommendations