Tokens JWT em C# (.NET): trabalhando com System.IdentityModel.Tokens.Jwt

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Tokens JWT em C# (.NET): guia completo para trabalhar com System.IdentityModel.Tokens.Jwt

\n\n

JSON Web Token (JWT) é um formato compacto e seguro para URLs, usado para transmitir dados entre partes na forma de um objeto JSON. No ecossistema C# (.NET), para trabalhar com JWT, utiliza-se a poderosa biblioteca System.IdentityModel.Tokens.Jwt, que faz parte do pacote Microsoft.IdentityModel.Tokens. Esta ferramenta permite gerar, assinar, verificar e decodificar tokens JWT, garantindo autenticação segura e troca de dados em aplicações web, APIs e microsserviços.

\n\n

Instalação da biblioteca

\n

Para começar, adicione o pacote NuGet ao projeto. Execute o comando no console do gerenciador de pacotes:

\n
dotnet add package System.IdentityModel.Tokens.Jwt
\n

Ou através do Package Manager Console no Visual Studio:

\n
Install-Package System.IdentityModel.Tokens.Jwt
\n\n

Componentes principais da biblioteca

\n
    \n
  • JwtSecurityTokenHandler — classe principal para criar, serializar e verificar tokens.
  • \n
  • SecurityTokenDescriptor — descrição do token: claims, tempo de vida, assinatura.
  • \n
  • SymmetricSecurityKey — chave simétrica para assinatura (HS256, HS384, HS512).
  • \n
  • SigningCredentials — credenciais de assinatura (algoritmo + chave).
  • \n
  • TokenValidationParameters — parâmetros de validação (verificação de assinatura, tempo de vida, emissor).
  • \n
\n\n

Geração de token JWT em C#

\n

Vamos criar um token simples com claims (declarações) personalizadas e tempo de vida de 1 hora:

\n
using System.IdentityModel.Tokens.Jwt;\nusing System.Security.Claims;\nusing System.Text;\nusing Microsoft.IdentityModel.Tokens;\n\npublic string GenerateToken()\n{\n    var secretKey = "my_super_secret_key_1234567890!";\n    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));\n    var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);\n\n    var claims = new[]\n    {\n        new Claim(ClaimTypes.Name, "Иван Петров"),\n        new Claim(ClaimTypes.Email, "ivan@example.com"),\n        new Claim(ClaimTypes.Role, "Admin")\n    };\n\n    var tokenDescriptor = new SecurityTokenDescriptor\n    {\n        Subject = new ClaimsIdentity(claims),\n        Expires = DateTime.UtcNow.AddHours(1),\n        Issuer = "MyApp",\n        Audience = "MyAppUsers",\n        SigningCredentials = credentials\n    };\n\n    var tokenHandler = new JwtSecurityTokenHandler();\n    var token = tokenHandler.CreateToken(tokenDescriptor);\n    return tokenHandler.WriteToken(token);\n}
\n\n

Verificação (validação) do token JWT

\n

Ao receber um token do cliente, é necessário verificar sua assinatura, prazo de validade e outros parâmetros:

\n
public ClaimsPrincipal ValidateToken(string token)\n{\n    var secretKey = "my_super_secret_key_1234567890!";\n    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));\n\n    var tokenHandler = new JwtSecurityTokenHandler();\n    var validationParameters = new TokenValidationParameters\n    {\n        ValidateIssuer = true,\n        ValidIssuer = "MyApp",\n        ValidateAudience = true,\n        ValidAudience = "MyAppUsers",\n        ValidateLifetime = true,\n        IssuerSigningKey = key,\n        ClockSkew = TimeSpan.Zero // remove a margem de tempo padrão\n    };\n\n    try\n    {\n        var principal = tokenHandler.ValidateToken(token, validationParameters, out SecurityToken validatedToken);\n        return principal;\n    }\n    catch (SecurityTokenExpiredException)\n    {\n        Console.WriteLine("Token expirado");\n        return null;\n    }\n    catch (SecurityTokenInvalidSignatureException)\n    {\n        Console.WriteLine("Assinatura do token inválida");\n        return null;\n    }\n}
\n\n

Decodificação do token sem verificação de assinatura

\n

Às vezes, é necessário apenas ler

Recommendations