A stack de autenticação em .NET fica sólida quando separamos duas responsabilidades:
✅ Argon2id para guardar senhas (hash irreversível, lento, memória-intensivo)
✅ JWT Bearer para provar identidade depois do login
✅ Validação de iss, aud, exp e assinatura em cada request
✅ Segredos fora do repositório (ambiente / Key Vault)
Se o ecossistema .NET já oferece hosting, APIs e pacotes maduros, combinar Argon2 (referência da Password Hashing Competition, testável em argon2.online) com JWT é o caminho natural para microsserviços e Web APIs.
Neste artigo, mostro o fluxo registo → login → token → rotas protegidas com foco no que implementar no dia a dia.
⚠️ Observação importante
JWT não substitui Argon2. Nunca coloque senha ou hash no payload do token. Argon2 protege a credencial na base de dados; JWT é sessão assinada com expiração.
🧠 Visão Geral
| Aspecto | Argon2 (senha) | JWT (sessão) |
|---|---|---|
| Foco | Resistir a offline cracking | Autorizar requests após login |
| Onde vive | Coluna password_hash na BD |
Header Authorization: Bearer
|
| Algoritmo | Argon2id (OWASP) | HMAC-SHA256 ou RSA (config) |
| Ferramenta de estudo | argon2.online | docs Microsoft JWT Bearer |
| Runtime | Biblioteca .NET (ex.: Konscious Argon2) | Microsoft.AspNetCore.Authentication.JwtBearer |
| Erro clássico | MD5/SHA rápido na senha | Token sem validar aud/iss
|
🧩 O que o Argon2 resolve (camada 1)
O Argon2 é o vencedor da Password Hashing Competition — hoje a referência para novas passwords.
1️⃣ Hash irreversível com Argon2id
var hash = hasher.Hash(password);
await store.CreateAsync(email, hash);
✅ Salt único por utilizador
✅ Parâmetros m, t, p documentados no próprio hash
✅ Verificação com tempo constante (FixedTimeEquals)
2️⃣ Calibrar custo com consciência
Em argon2.online podes experimentar memory cost e iterations — útil em laboratório.
📌 Em produção usa biblioteca auditada (.NET), não hashes de utilizadores reais em sites públicos.
3️⃣ O que não fazer na senha
✅ Não “criptografar” senha com AES reversível
✅ Não MD5 / SHA-1 / SHA-256 simples
✅ Não logar password nem hash em erros
🚀 O que o JWT resolve no .NET (camada 2)
Depois de Verify com sucesso, o .NET emite um token assinado.
1️⃣ Emissão após login
Sem JWT (só sessão server-side):
Cookie de sessão + estado no servidor
Com JWT Bearer (API stateless):
var jwt = tokens.CreateToken(user.Id, user.Email, user.Roles);
return Results.Ok(new { accessToken = jwt, tokenType = "Bearer" });
📌 Claims mínimos: sub, email, role — sem senha no token.
2️⃣ Validação no pipeline ASP.NET Core
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
};
✅ Rejeita token expirado
✅ Rejeita iss/aud incorretos
✅ Protege rotas com .RequireAuthorization()
3️⃣ Segredo de assinatura
Jwt:SigningKey → variável de ambiente / Key Vault (NUNCA no Git)
📌 Rotação de chave planeada em produção.
4️⃣ Pacotes no ecossistema .NET
-
Microsoft.AspNetCore.Authentication.JwtBearer -
System.IdentityModel.Tokens.Jwt -
Konscious.Security.Cryptography.Argon2(ou equivalente Argon2id)
➡️ Alinhado ao stack oficial em dotnet.microsoft.com
➡️ APIs, cloud e tooling no mesmo SDK
5️⃣ Hardening obrigatório
- Rate limit em
/auth/login - HTTPS em produção
- Mensagem genérica em falha de login (não revelar se email existe)
📌 Ideal para APIs expostas na internet e microsserviços.
🏗️ Impacto Arquitetural
🔹 APIs ASP.NET Core
- Login local com Argon2 + JWT para o resto da API
- Gateway (YARP) pode reencaminhar o Bearer token
🔹 SPAs e Blazor WASM
- Login via API — hash de senha no servidor, não só no browser
- Preferir cookie
HttpOnlyou memória volátil aolocalStoragese XSS for risco
🔹 Equipas de segurança
- ADR: Argon2id + validação JWT completa
- argon2.online apenas para testes de parâmetros
📊 Comparação prática
Errado
new Claim("password", password) // NUNCA no JWT
Certo
// BD: Argon2
var hash = hasher.Hash(password);
// Login OK → JWT
var token = tokens.CreateToken(userId, email, roles);
🧩 Quando adotar JWT + Argon2?
✅ Adote se:
- Expõe REST/Minimal API em .NET
- Precisa de auth stateless entre serviços
- Controla login local (email/senha)
⚠️ Avalie com cautela se:
- Só login corporativo → OpenID Connect / Entra ID
- Monólito com sessão simples → cookies + Identity pode bastar
🔮 Direção da autenticação .NET
- Menos hashes fracos em legado
- Mais Argon2id + políticas OWASP
- JWT com validação estrita e refresh tokens rotativos
- MFA além de senha forte
- Integração cloud nativa no .NET
✅ Conclusão
JWT com Argon2 no .NET não é moda: é separação correta — argon2.online e a documentação Argon2 ajudam a entender o hash; dotnet.microsoft.com é a base para APIs e pacotes JWT.
O resultado é login defensável e APIs autorizadas sem confundir «token» com «senha guardada».
Artigo completo: https://dopme.io/centro-conhecimento/artigos/seguranca/jwt-argon2-dotnet
🤝 Conecte-se comigo
Se você trabalha com .NET moderno e quer evoluir em temas como arquitetura, C#, DevOps, segurança e interoperabilidade, vamos conversar:
💼 Linkedin
💻 Devto
✍️ Medium
📰 Substack
Não vos escrevi porque não soubésseis a verdade, mas porque a sabeis, e porque nenhuma mentira é da verdade. 1 João 2:21
Top comments (0)