Crie Uma API Completa de E-commerce com ASP.NET Core
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!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!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
🌍 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. e por que usar?
- Estrutura de um Token JWT
🌍 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.
- Como funciona o fluxo de autenticação JWT
📄 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.
- Configurando JWT no ASP.NET Core
🌍 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.
- Implementando a Geração de Tokens
- [Protegendo rotas
🛠️ 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. com Authorize]
- Testando com Swagger
📄 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. e Postman
- Boas práticas
🔢 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. e dicas de segurança
- Conclusão
🧩 O que é JWT e por que usar?🔗
JWT _(JSON Web Token🌍 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!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?🔗
- Independência: O token fica no cliente e
📊 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. é stateless
📡 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., ou seja, o servidor não precisa rastrear sessões de usuário.
- Performance
🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!Descubra como o StringBuilder otimiza a concatenação em C#, evitando desperdício de memória e melhorando a performance das aplicações. Veja exemplos práticos!: Reduz a interação com o banco de dados para validação de sessão.
- Simplicidade de compartilhamento: Como é um objeto JSON assinado, é fácil transmiti-lo através de vários serviços e se basear na assinatura para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! verificar integridade.
🧱 Estrutura de um Token JWT🔗
Um token típico tem 3 partes:
Parte | Descrição | Exemplo |
---|---|---|
Header | Algoritmo e tipo do token | {"alg": "HS256", "typ": "JWT"} |
Payload | Dados do usuário (claims) | {"sub": "123", "name": "Maria", "role": "admin"} |
Signature | Assinatura digital | HMACSHA256(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!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!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!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!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!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!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!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!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!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:
IssuerSigningKey
: é a chave🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. usada para assinar o token. Não exponha ou versione essa chave em repositórios
📦 Repository Pattern: Abstraia seu Acesso a Dados!Descubra como o Repository Pattern organiza o acesso a dados, isolando a lógica de persistência e facilitando manutenção, testes e escalabilidade. públicos.
ValidIssuer
e📊 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.
ValidAudience
: ajudam a identificar de onde o token saiu e para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! onde vai. Se algo não bater com o token recebido, a validação falha.
🔧 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!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!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!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!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!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!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!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!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!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
, deverá passar no cabeçalho HTTP algo como:🌍 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
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!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!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🔗
- Armadilha 1: Não armazene segredos
🗝️ Azure Key Vault: Gerencie Segredos como um Especialista!Aprenda a proteger e gerenciar segredos, chaves e certificados com o Azure Key Vault em aplicações .NET, seguindo as melhores práticas de segurança na nuvem. no código
// appsettings.json
"Jwt": {
"Key": "ChaveSuperSecretaComNoMinimo32Caracteres!",
"Issuer": "https://seudominio.com",
"Audience": "https://seudominio.com"
}
- Boas Práticas
🔢 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.:
- Use HTTPS em produção
- Implemente refresh tokens
- Revogue tokens comprometidos
- Valide expiration time
- Use roles
🛡️ 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. com moderação
🎯 Desafio Prático🔗
1. Crie um sistema de roles🛡️ 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!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!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!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!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:🔗
- Documentação oficial JWT
🌍 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. em .NET
- Implementando refresh tokens
- Melhores práticas de segurança
🔏 Criptografia Assimétrica: Domine RSA e Troca de Chaves!Descubra como a criptografia assimétrica protege a troca de chaves e garante segurança em sistemas digitais usando RSA, C# e práticas recomendadas. JWT
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- .NET Documentation: learn.microsoft.com/pt-br/dotnet/
- Awesome .NET: github.com/quozd/awesome-dotnet
- C# Language Specification: learn.microsoft.com/pt-br/dotnet/csharp/language-reference/language-specification/
- GitHub: Microsoft/.NET: github.com/dotnet
- Microsoft Learn: C# e .NET: learn.microsoft.com/pt-br/dotnet/csharp/