Guia Definitivo: JWT no ASP.NET Core com Segurança Máxima

Introduzir autenticação em uma API é um passo essencial para garantir que apenas usuários ou sistemas autorizados acessem seus recursos. Quando falamos de segurança em aplicações distribuídas, o JSON Web Token🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. (JWT) surge como uma solução eficaz, tornando a verificação de identidade mais simples e flexível. A ideia é bem direta: o servidor gera um token com informações de identificação e validade, e o cliente guarda e envia esse token a cada requisição. Se o token for válido, o usuário obtém acesso; caso contrário, ele é barrado.

Neste artigo, vamos explorar o JWT no contexto do ASP.NET Core🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. de modo abrangente, mas sem formalidades excessivas. Você vai aprender como o token é composto, como configurá-lo, como gerá-lo, validar e proteger rotas. Tudo com exemplos práticos e profundidade suficiente para que você se sinta seguro ao aplicar em seu projeto real.

📚 Neste artigo você vai aprender:🔗

🧩 O que é JWT e por que usar?🔗

JWT _(JSON Web Token🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real.)_ é um padrão aberto (RFC 7519) que define uma forma de transmitir informações entre partes como um objeto JSON assinado digitalmente.

Imagine que você é dono de uma loja virtual: sempre que um cliente deseja acessar sua conta ou fazer uma compra, sua aplicação pode emitir um token JWT depois que o usuário confirma sua identidade (login e senha). Na requisição seguinte, basta enviar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. esse token como prova de que o cliente continua logado e é quem diz ser, sem necessidade de bater no banco de dados a cada vez para revalidar credenciais (dependendo do design de sua aplicação).

Por que usá-lo?🔗

🧱 Estrutura de um Token JWT🔗

Um token típico tem 3 partes:

ParteDescriçãoExemplo
HeaderAlgoritmo e tipo do token{"alg": "HS256", "typ": "JWT"}
PayloadDados do usuário (claims){"sub": "123", "name": "Maria", "role": "admin"}
SignatureAssinatura digitalHMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

Token completo:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

🔄 Como funciona o fluxo de autenticação JWT🔗

1. Autenticação🛡️ Segurança em SignalR: Autenticação e Autorização!🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real. inicial: O usuário envia login🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades./senha para a API.

2. Geração do token: Se as credenciais estiverem corretas, o servidor emite um JWT🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. que contém informações do usuário (ID, nome, data de expiração etc.).

3. Envio do token: O cliente armazena esse token, geralmente no local storage ou cookie seguro🛡️ Segurança em SignalR: Autenticação e Autorização!🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real..

4. Requisições subsequentes: Para cada endpoint📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. protegido, o cliente envia o token no cabeçalho HTTP (geralmente Authorization: Bearer {token}) ou em um cookie.

5. Validação e autorização🛡️ Segurança em SignalR: Autenticação e Autorização!🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real.: O servidor valida se o token é íntegro e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. ainda não expirou. Se estiver válido, a requisição segue; caso contrário, é negada.

⚙️ Configurando JWT no ASP.NET Core🔗

Você pode adicionar suporte ao JWT dentro do seu projeto .NET de maneira relativamente simples. Suponhamos que você já tenha criado um projeto ASP.NET Core🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real.. No arquivo Program.cs (ou Startup.cs, dependendo da versão), podemos configurar a autenticação🛡️ Segurança em SignalR: Autenticação e Autorização!🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real. assim:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
// =============================
// 1. Configurar serviços
// =============================
builder.Services.AddControllers();
// Configura a autenticação JWT
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    // Aqui definimos como o token será validado
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,          // Valida se o emissor é confiável
        ValidateAudience = true,        // Valida se o destinatário do token é correto
        ValidateLifetime = true,        // Verifica se o token expirou
        ValidateIssuerSigningKey = true,// Verifica a assinatura digital
        ValidIssuer = "MinhaAPI",       // Issuer esperado
        ValidAudience = "MeuApp",       // Audience esperada
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("chave-super-secreta"))
    };
});
var app = builder.Build();
// =============================
// 2. Configurar pipeline
// =============================
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();

Observações Importantes:

🔧 Implementando a Geração de Tokens🔗

Agora vamos ver como criar o token no momento em que o usuário faz login com credenciais corretas. Exemplo de um método em um controller🛠️ Controllers: Rotas que Respondem como Mágica!🛠️ Controllers: Rotas que Respondem como Mágica!Aprenda a criar e configurar controllers no ASP.NET Core com dicas práticas, exemplos de rotas e integração de serviços, elevando a qualidade da sua API. para gerar o token:

[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
    [HttpPost("login")]
    public IActionResult Login([FromBody] LoginModel model)
    {
        // 1. Verificar se o usuário existe e se a senha está correta.
        if (model.Username != "admin" || model.Password != "123")
        {
            return Unauthorized("Usuário ou senha inválidos!");
        }
        // 2. Construir o token
        var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("chave-super-secreta"));
        var credentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);
        var token = new JwtSecurityToken(
            issuer: "MinhaAPI",
            audience: "MeuApp",
            expires: DateTime.Now.AddHours(2),
            signingCredentials: credentials
        );
        // 3. Escrever a string do token
        var tokenString = new JwtSecurityTokenHandler().WriteToken(token);
        // 4. Retornar o token para o cliente
        return Ok(new { Token = tokenString });
    }
}
public class LoginModel
{
    public string Username { get; set; }
    public string Password { get; set; }
}

Neste controller🛠️ Controllers: Rotas que Respondem como Mágica!🛠️ Controllers: Rotas que Respondem como Mágica!Aprenda a criar e configurar controllers no ASP.NET Core com dicas práticas, exemplos de rotas e integração de serviços, elevando a qualidade da sua API., caso o login🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. password estejam corretos, geramos um JWT🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real.. Observe que definimos o issuer e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. audience de forma consistente com o que configuramos no TokenValidationParameters.

🛡️ Protegendo rotas com [Authorize]🔗

Para que uma rota passe a exigir o token JWT, basta anotar o controlador🛠️ Controllers: Rotas que Respondem como Mágica!🛠️ Controllers: Rotas que Respondem como Mágica!Aprenda a criar e configurar controllers no ASP.NET Core com dicas práticas, exemplos de rotas e integração de serviços, elevando a qualidade da sua API. ou a action com o atributo📜 Atributos Customizados: Metadados que Guiam seu Código!📜 Atributos Customizados: Metadados que Guiam seu Código!Descubra como atributos customizados potencializam a organização do código, facilitam auditorias e testes, e garantem eficiência. [Authorize]. Por exemplo:

[ApiController]
[Route("api/[controller]")]
[Authorize] // Agora todos os endpoints daqui exigem token válido
public class ProductsController : ControllerBase
{
    [HttpGet]
    public IActionResult GetProducts()
    {
        return Ok(new { Message = "Aqui estão os produtos, mas você só enxerga se estiver autenticado! :)" });
    }
}

Quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. o cliente fizer uma requisição para api🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real./products, deverá passar no cabeçalho HTTP algo como:

Authorization: Bearer <seu-token-jwt>

Se o token estiver ausente ou inválido, a resposta será 401 Unauthorized.

🔍 Testando com Swagger e Postman🔗

Configure o Swagger📄 Swagger/OpenAPI: Documente sua API Automaticamente!📄 Swagger/OpenAPI: Documente sua API Automaticamente!Descubra como gerar documentação interativa e automatizada em APIs com o Swagger/OpenAPI. Aprenda a configurar no .NET e testar endpoints facilmente. para aceitar JWT:

builder.Services.AddSwaggerGen(c =>
{
    // ... outras configurações
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Description = "JWT Authorization header using the Bearer scheme",
        Type = SecuritySchemeType.Http,
        Scheme = "bearer"
    });
    c.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,
                    Id = "Bearer"
                }
            },
            new string[] {}
        }
    });
});

Exemplo de requisição no Postman🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real.:

GET /api/payments
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

🚨 Boas Práticas e Armadilhas🔗

// appsettings.json
"Jwt": {
  "Key": "ChaveSuperSecretaComNoMinimo32Caracteres!",
  "Issuer": "https://seudominio.com",
  "Audience": "https://seudominio.com"
}

🎯 Desafio Prático🔗

1. Crie um sistema de roles🛡️ Segurança em SignalR: Autenticação e Autorização!🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real. (admin, user, guest)

2. Implemente um endpoint📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. que só admins podem acessar

3. Adicione expiração de token de 1 hora

4. Implemente renovação de token via refresh token

// Exemplo de refresh token
public class RefreshToken
{
    public string Token { get; set; }
    public DateTime Expires { get; set; }
    public DateTime Created { get; set; }
    public string CreatedByIp { get; set; }
}

Conclusão🔗

O JWT traz simplicidade e segurança para a autenticação de APIs ao trabalhar de forma desacoplada e sem estado. Entender sua anatomia e aplicação no ASP.NET Core é fundamental para criar soluções escaláveis e seguras. Depois de configurar a autenticação com JWT, basta manter boas práticas🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados. no uso dos tokens e na proteção de suas rotas para que o sistema se beneficie ao máximo desse modelo de autenticação.

Com essa base, você já tem o necessário para implementar tokens JWT na sua Web API em ASP.NET Core🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real.. Daqui em diante, o próximo passo é explorar sistemas de refresh token, analisar como clientes (front-end, mobile, etc.) vão usar esses tokens e garantir que tudo seja feito em um ambiente seguro🛡️ Segurança em SignalR: Autenticação e Autorização!🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real.. Boa codificação!

Leia também:🔗

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados