Tokens JWT em C# (.NET): criação, verificação e validação
JSON Web Token (JWT) é um padrão aberto (RFC 7519) para criar tokens de acesso baseados no formato JSON. JWT é amplamente utilizado em aplicações web modernas para autenticação e troca de informações entre cliente e servidor. Neste artigo, abordaremos detalhadamente como trabalhar com tokens JWT no ecossistema C# (.NET), incluindo criação, assinatura, verificação e validação de tokens.
Componentes principais do JWT
O JWT consiste em três partes separadas por pontos:
- Header — cabeçalho contendo informações sobre o tipo de token e o algoritmo de assinatura
- Payload — carga útil com dados (claims)
- Signature — assinatura que garante a integridade do token
Exemplo de token JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Instalação dos pacotes necessários
Para trabalhar com JWT em .NET, é necessário instalar o pacote System.IdentityModel.Tokens.Jwt. Isso pode ser feito através do NuGet Package Manager ou usando o .NET CLI:
dotnet add package System.IdentityModel.Tokens.JwtTambém pode ser necessário instalar o Microsoft.AspNetCore.Authentication.JwtBearer para integração com ASP.NET Core:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearerCriação de token JWT em C#
Vamos considerar um exemplo completo de criação de token JWT usando chave 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); }}Verificação e validação de token JWT
Para verificar a autenticidade e extrair dados do token, utiliza-se o 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\