Tokens JWT em C# (.NET): guia completo para trabalhar com System.IdentityModel.Tokens.Jwt
\n\nJSON 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\nInstalação da biblioteca
\nPara começar, adicione o pacote NuGet ao projeto. Execute o comando no console do gerenciador de pacotes:
\ndotnet add package System.IdentityModel.Tokens.Jwt\nOu através do Package Manager Console no Visual Studio:
\nInstall-Package System.IdentityModel.Tokens.Jwt\n\nComponentes 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
Geração de token JWT em C#
\nVamos criar um token simples com claims (declarações) personalizadas e tempo de vida de 1 hora:
\nusing 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\nVerificação (validação) do token JWT
\nAo receber um token do cliente, é necessário verificar sua assinatura, prazo de validade e outros parâmetros:
\npublic 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\nDecodificação do token sem verificação de assinatura
\nÀs vezes, é necessário apenas ler
Também na biblioteca
Rate Limiting em TypeScript: bibliotecas, ferramentas e exemplos de implementação
ts-morph para TypeScript: guia completo com exemplos
MassTransit para C# (.NET): guia completo com exemplos práticos
Parsing de HTML em C++: visão geral das bibliotecas e exemplos de código
Programação Reativa em C++: Bibliotecas e Prática