Emisión de tokens
Genere tokens firmados al iniciar sesión.
Emisión de tokens es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.
Emisión frente a validación
Hasta ahora ha validado tokens. Ahora los emitirá: después de que un usuario inicie sesión correctamente, su API genera un JWT firmado y lo devuelve.
El tipo principal para hacerlo es JwtSecurityTokenHandler, de System.IdentityModel.Tokens.Jwt.
dotnet add package System.IdentityModel.Tokens.JwtLa clave de firma
Para firmar un token necesita una clave. Con HS256 se reutiliza el mismo secreto simétrico que utiliza el validador.
Mantenga este secreto fuera del control de código fuente: cárguelo desde la configuración o desde un almacén de secretos.
var key = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(configuration["Jwt:Key"]!));SigningCredentials
SigningCredentials combina la clave con el algoritmo. Para una clave simétrica, utilice SecurityAlgorithms.HmacSha256.
var creds = new SigningCredentials(
key,
SecurityAlgorithms.HmacSha256);Creación de los claims
Decida qué incluirá en el token. Incluya siempre un subject (el identificador del usuario), además de los roles o datos que necesite la API.
Añada un jti único para poder identificar cada token.
var claims = new List<Claim>
{
new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.Role, user.Role)
};Creación del JwtSecurityToken
JwtSecurityToken reúne el emisor, la audiencia, los claims, la fecha de caducidad y las credenciales de firma en un objeto de token.
var token = new JwtSecurityToken(
issuer: configuration["Jwt:Issuer"],
audience: configuration["Jwt:Audience"],
claims: claims,
notBefore: DateTime.UtcNow,
expires: DateTime.UtcNow.AddMinutes(15),
signingCredentials: creds);Serialización en una cadena
El objeto de token debe escribirse en su formato compacto de cadena header.payload.signature antes de enviarlo al cliente.
var handler = new JwtSecurityTokenHandler();
string jwt = handler.WriteToken(token);
// jwt now looks like eyJhbGciOiJI...Un servicio de tokens reutilizable
Encapsule la lógica en un servicio para mantener limpios los controladores y centralizar la configuración.
public class TokenService(IConfiguration config)
{
public string CreateAccessToken(AppUser user)
{
var key = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(config["Jwt:Key"]!));
var creds = new SigningCredentials(
key, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
new Claim(ClaimTypes.Role, user.Role)
};
var token = new JwtSecurityToken(
config["Jwt:Issuer"], config["Jwt:Audience"],
claims, expires: DateTime.UtcNow.AddMinutes(15),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}Conexión del endpoint de inicio de sesión
El endpoint de inicio de sesión verifica las credenciales, llama al servicio y devuelve el token al cliente.
app.MapPost("/login", (LoginDto dto, TokenService tokens) =>
{
var user = Authenticate(dto.Username, dto.Password);
if (user is null) return Results.Unauthorized();
return Results.Ok(new { accessToken = tokens.CreateAccessToken(user) });
});Simétrico frente a asimétrico
HS256 utiliza un único secreto compartido tanto para firmar como para validar. RS256 utiliza una clave privada para firmar y una clave pública para validar.
La firma asimétrica permite publicar la clave pública para que otros servicios validen los tokens sin tener nunca el secreto de firma.
var creds = new SigningCredentials(
new RsaSecurityKey(rsaPrivateKey),
SecurityAlgorithms.RsaSha256);Registro del servicio
Añada el servicio de tokens a la inyección de dependencias para poder inyectarlo en endpoints y controladores.
builder.Services.AddScoped<TokenService>();Mantenga los tokens breves y con pocos datos
Dos buenas prácticas al emitir tokens:
- Con pocos datos: incluya únicamente los claims que necesite la API; el token viaja en cada solicitud.
- De corta duración: los access tokens de 5 a 15 minutos limitan los daños si uno se filtra.
expires: DateTime.UtcNow.AddMinutes(15)Comprobación rápida
Confirme lo que ha aprendido sobre la emisión de tokens.
Resumen
Ha emitido JWT firmados:
SigningCredentialscombina su clave con un algoritmo.- Construya una lista de
Claim, seguida de unJwtSecurityTokencon emisor, audiencia y fecha de caducidad. JwtSecurityTokenHandler.WriteTokenlo serializa en la cadena compacta.- Mantenga los tokens con pocos datos y una duración corta.
A continuación: refresh tokens y estrategias de caducidad.
Preguntas frecuentes
¿La lección «Emisión de tokens» es gratis?
Sí — el texto completo de «Emisión de tokens» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Emisión de tokens»?
Genere tokens firmados al iniciar sesión. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Emisión de tokens»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Estructura y claims de JWT
- Configuración de la autenticación JWT Bearer
- Emisión de tokens
- Tokens de actualización y caducidad