Pular para o conteúdo
.NETJWT e autenticação
Módulo 06APIs em Produção

JWT e autenticação

avancado 40 min de leitura·Atualizado · .NET 9
Resumo

JWT (JSON Web Token) é um token assinado que carrega claims do usuário. Configuramos a autenticação Bearer, geramos o token no login e protegemos endpoints com [Authorize].

1. Objetivos de Aprendizagem#

  • Explicar a estrutura e o fluxo de um JWT.
  • Configurar autenticação JWT Bearer.
  • Emitir o token no login e proteger endpoints.

2. Pré-requisitos#

  • Identity configurado (tópico 40.1).

3. Conceito#

O diagrama abaixo resume o fluxo principal.

Carregando diagrama…

Um JWT tem três partes: header, payload (claims) e assinatura. O servidor assina com uma chave secreta; ao receber o token, valida a assinatura sem consultar o banco (stateless). O porquê: escalabilidade — qualquer instância valida o token localmente.

Fluxo: o cliente faz login → recebe o JWT → envia Authorization: Bearer <token> nas próximas requisições.

4. Mão na Massa#

4.1. Setup#

Shell
dotnet add Catalog.Api package Microsoft.AspNetCore.Authentication.JwtBearer

Configuração em appsettings.json (a chave secreta vem de user-secrets/variável de ambiente, não daqui):

JSON
{
  "JwtSettings": {
    "Issuer": "CatalogApi",
    "Audience": "CatalogClients",
    "ExpiresInMinutes": 15
  }
}

4.2. Implementação Passo a Passo#

  1. Configurar a autenticação:
C#
var jwt = builder.Configuration.GetSection("JwtSettings");
var secret = builder.Configuration["JWT_SECRET"]!; // do ambiente/secret store

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = jwt["Issuer"],
            ValidAudience = jwt["Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(
                Encoding.UTF8.GetBytes(secret))
        };
    });
  1. Pipeline — ordem importa:
C#
app.UseAuthentication();
app.UseAuthorization();
  1. Gerar o token após validar credenciais:
C#
public string CreateToken(ApplicationUser user, IList<string> roles)
{
    var claims = new List<Claim>
    {
        new(ClaimTypes.Name, user.UserName!),
        new(ClaimTypes.NameIdentifier, user.Id)
    };
    claims.AddRange(roles.Select(r => new Claim(ClaimTypes.Role, r)));

    var creds = new SigningCredentials(
        new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secret)),
        SecurityAlgorithms.HmacSha256);

    var token = new JwtSecurityToken(
        issuer: _issuer, audience: _audience,
        claims: claims,
        expires: DateTime.UtcNow.AddMinutes(15),
        signingCredentials: creds);

    return new JwtSecurityTokenHandler().WriteToken(token);
}

4.3. Executando#

Shell
# login retorna { "token": "..." }
curl -X POST http://localhost:5000/api/authentication/login \
  -H "Content-Type: application/json" -d '{"userName":"ana","password":"Senha@Forte1"}'

curl http://localhost:5000/api/produtos -H "Authorization: Bearer <token>"

5. Exemplo Completo#

Proteger endpoints:

C#
[Authorize]
[HttpGet]
public IActionResult Get() => Ok();

6. Boas Práticas e Armadilhas#

FaçaEvite
Guardar o segredo fora do código (env/secret store)Comitar a chave no appsettings.json
Tokens de vida curta + refresh tokenJWT com expiração de dias
Validar issuer, audience, lifetime e assinaturaDesligar validações "para funcionar"
Atenção

o payload do JWT é apenas codificado em Base64, não criptografado — qualquer um lê seu conteúdo. Nunca coloque dados sensíveis (senha, PII) nas claims.

7. Segurança e Produção#

  • Sempre HTTPS: um Bearer token interceptado é uma sessão sequestrada.
  • Chave secreta forte (256+ bits) e rotacionável; considere chaves assimétricas (RS256) em cenários multi-serviço.
  • Expiração curta reduz a janela de um token vazado (ver Módulo 41, refresh token).

8. Exercícios#

  • Fácil: proteja um controller com [Authorize].
  • Médio: mova o segredo para user-secrets e leia via IConfiguration.
  • Desafio: troque HS256 por RS256 com par de chaves e ajuste a validação.

9. Resumo#

Configuramos autenticação JWT Bearer, emitindo tokens assinados de vida curta e protegendo endpoints com [Authorize]. Segredo fora do código, HTTPS e validações completas são obrigatórios.

10. Próximos Passos#

A seguir, autorização baseada em roles.

11. Referências#

40-02 — JWT e autenticação | Curso ASP.NET Core