Introdução
Quando o assunto é autenticação e autorização em aplicações modernas, a primeira reação de muitos times é recorrer a soluções pagas de cloud — Azure Entra ID, AWS Cognito, Auth0 ou Firebase Auth. São serviços excelentes, mas carregam custos que podem surpreender à medida que a base de usuários cresce: planos por MAU (Monthly Active Users), limites de tokens, cobranças por login social e MFA. Em muitos cenários, especialmente startups, projetos pessoais, ambientes on-premises e empresas que valorizam soberania de dados, existe uma alternativa gratuita, open-source e de nível enterprise que merece toda atenção: o Keycloak.
O Keycloak é um servidor de identidade e gerenciamento de acesso mantido pela Cloud Native Computing Foundation (CNCF) como projeto incubado, originalmente criado pela Red Hat. Ele implementa os protocolos OAuth 2.0, OpenID Connect e SAML 2.0 — os mesmos utilizados por Azure Entra ID, Google e outros provedores de identidade — mas roda na sua infraestrutura, sem custos de licença, sem limites de usuários e com total controle sobre os dados. Se você já entende os fundamentos de autenticação e autorização com JWT, OAuth2 e OpenID Connect, está pronto para dar o próximo passo: colocar um identity provider completo em funcionamento com Docker ou Podman e integrá-lo à sua aplicação ASP.NET Core com C# 8.0+.
Neste artigo, vamos colocar o Keycloak para rodar em container, configurar um realm e client, integrar com uma API REST em C#, customizar a tela de login com logo e tema personalizado, e comparar com os principais provedores de identidade da cloud. O foco é prático, funcional e 100% gratuito.
💡 Dica: Embora os exemplos deste artigo utilizem C# com ASP.NET Core, o Keycloak é agnóstico de linguagem e framework. Por implementar protocolos abertos (OAuth 2.0, OpenID Connect, SAML 2.0), ele funciona com qualquer tecnologia que suporte esses padrões — incluindo Java/Spring Boot, Python/Django/Flask/FastAPI, Node.js/Express/NestJS, Go, PHP/Laravel, Ruby on Rails, Rust e Angular/React/Vue no front-end. O setup do Keycloak em container e a configuração de realm/client são idênticos independentemente da linguagem da sua aplicação.
📦 Código-fonte: A implementação completa deste artigo está no repositório blog-zocateli-sample no GitHub. Clone, explore e adapte ao seu contexto.
Por Que Escolher o Keycloak?
Custo Zero vs Provedores de Cloud
O principal argumento a favor do Keycloak é simples: não custa nada. Enquanto provedores de cloud cobram por usuário ativo ou por funcionalidade premium, o Keycloak oferece tudo gratuitamente:
| Funcionalidade | Keycloak (Gratuito) | Azure Entra ID | AWS Cognito | Auth0 |
|---|---|---|---|---|
| Custo base | $0 | Grátis até 50.000 MAU (External ID) | Grátis até 50.000 MAU | Grátis até 7.500 MAU |
| Usuários ilimitados | ✅ | ❌ (cobra após limite) | ❌ (cobra após limite) | ❌ (cobra após limite) |
| Login social | ✅ Ilimitado | ✅ | ✅ | ✅ (limitado no free) |
| MFA (Multi-Factor) | ✅ Incluído | ✅ | ✅ (custo adicional SMS) | ✅ (limitado no free) |
| SAML + OIDC | ✅ Ambos | ✅ Ambos | ✅ OIDC / ⚠️ SAML limitado | ✅ Ambos |
| Customização de UI | ✅ Total (temas FreeMarker) | ⚠️ Limitada | ⚠️ Limitada | ✅ (planos pagos) |
| Self-hosted | ✅ Obrigatório | ❌ SaaS only | ❌ SaaS only | ⚠️ Plano Enterprise |
| Soberania dos dados | ✅ Total | ❌ Dados na Microsoft | ❌ Dados na AWS | ❌ Dados na Auth0 |
💡 Dica: O Keycloak não substitui necessariamente provedores de cloud em todos os cenários. Se sua empresa já está no ecossistema Azure e precisa de integração nativa com Microsoft 365, Teams e Entra ID, o Azure Entra continua sendo a melhor escolha. O Keycloak brilha quando você precisa de controle total, custo previsível (zero) e independência de vendor.
Principais Funcionalidades
O Keycloak inclui funcionalidades que em provedores de cloud são cobradas separadamente:
- Single Sign-On (SSO) — login único entre múltiplas aplicações
- Identity Brokering — federação com provedores externos (Google, GitHub, Facebook, Azure AD, SAML)
- User Federation — integração com LDAP e Active Directory
- Fine-grained Authorization — políticas de autorização baseadas em roles, groups, scopes e resources
- Multi-Factor Authentication (MFA) — TOTP, WebAuthn/FIDO2, SMS, email
- Account Management Console — portal self-service para o usuário gerenciar perfil, sessões e 2FA
- Admin Console — painel web completo para gerenciar realms, clients, users e roles
- Event Logging e Audit Trail — registro detalhado de eventos de autenticação
- API REST para Administração — automação completa via API
- Extensibilidade via SPI — Service Provider Interfaces para customizações avançadas
Pré-requisitos
- Docker Desktop ou Podman instalado e funcionando
- .NET 8.0 SDK (ou superior) instalado — download aqui
- VS Code ou Visual Studio como IDE
- Conhecimento básico de OAuth2 e OpenID Connect
Keycloak em Container: Setup Completo
Docker Compose para Desenvolvimento
A forma mais rápida e recomendada de rodar o Keycloak localmente é via container. Vamos usar o docker-compose com PostgreSQL como banco de dados (o mesmo banco que você usaria em produção):
| |
⚠️ Atenção: O comando
start-devhabilita o modo de desenvolvimento com HTTP, cache local e hot-reload de temas. Nunca usestart-devem produção — usestartcom HTTPS configurado e as variáveis de produção adequadas.
Inicie o stack:
| |
Após alguns segundos, acesse o painel admin em http://localhost:8180 com as credenciais admin / admin.
Configuração Inicial: Realm e Client
O Keycloak organiza tudo em Realms — cada realm é um espaço isolado com seus próprios usuários, clients, roles e configurações. O realm master é reservado para administração do servidor. Vamos criar um realm para sua aplicação:
1. Criar um Realm
- No painel admin, clique no dropdown
masterno canto superior esquerdo - Clique em Create Realm
- Preencha: Realm name =
meu-app - Clique em Create
2. Criar um Client (para a API ASP.NET Core)
- No realm
meu-app, vá em Clients → Create client - Preencha:
- Client type: OpenID Connect
- Client ID:
minha-api
- Na tela seguinte:
- Client authentication: ON (confidential client)
- Authorization: ON (se quiser usar authorization services)
- Em Valid Redirect URIs:
https://localhost:5001/*ehttp://localhost:5000/* - Em Web Origins:
+(permite todos os origins dos redirect URIs) - Clique em Save
3. Obter o Client Secret
- Após salvar, vá na aba Credentials
- Copie o Client secret — você vai precisar dele na configuração da API
4. Criar um Usuário de Teste
- Vá em Users → Add user
- Preencha:
- Username:
usuario.teste - Email:
[email protected] - First Name:
Usuário - Last Name:
Teste - Email verified: ON
- Username:
- Clique em Create
- Vá na aba Credentials → Set password
- Defina uma senha e desmarque Temporary
5. Criar Roles
- Vá em Realm roles → Create role
- Crie as roles:
admin,user,manager - Associe roles ao usuário: Users → selecione o usuário → aba Role mapping → Assign role
ℹ️ Informação: Tudo que fizemos manualmente acima pode ser automatizado via Keycloak Admin REST API ou via importação de realm em JSON — ideal para pipelines de CI/CD.
Visão Geral do Fluxo de Autenticação
Antes de mergulhar no código, veja como as peças se encaixam. O diagrama abaixo mostra o fluxo completo: o Browser autentica via OpenID Connect no Keycloak, recebe um JWT e o envia como Bearer Token para a API ASP.NET Core, que valida o token consultando as chaves públicas (JWKS) do Keycloak:
Integração com C# e ASP.NET Core
Os exemplos a seguir usam C# com ASP.NET Core, mas o mesmo fluxo se aplica a qualquer linguagem/framework. O Keycloak se comunica via protocolos padrão (OIDC/OAuth2), então a integração se resume a configurar a validação de JWT Bearer na sua stack — algo que todas as plataformas modernas suportam nativamente ou via biblioteca:
| Linguagem / Framework | Biblioteca / Recurso de Integração |
|---|---|
| C# / ASP.NET Core | Microsoft.AspNetCore.Authentication.JwtBearer (usado neste artigo) |
| Java / Spring Boot | Spring Security OAuth2 Resource Server — spring-boot-starter-oauth2-resource-server |
| Python / Django | django-allauth ou mozilla-django-oidc |
| Python / FastAPI | python-jose + validação manual de JWT ou fastapi-keycloak |
| Node.js / Express | keycloak-connect (adaptador oficial) ou jsonwebtoken + JWKS |
| Node.js / NestJS | nest-keycloak-connect |
| Go | go-oidc (CoreOS) |
| PHP / Laravel | socialiteproviders/keycloak ou robsontenorio/laravel-keycloak-guard |
| Ruby on Rails | omniauth-keycloak |
| Angular / React / Vue | keycloak-js (adaptador oficial para SPAs) |
ℹ️ Informação: O Keycloak também oferece adaptadores oficiais para várias plataformas. No entanto, para novas integrações, a recomendação é usar bibliotecas genéricas de OIDC/JWT da sua linguagem — assim você não fica acoplado a um adaptador específico do Keycloak.
Configuração da API
Vamos criar uma API REST protegida pelo Keycloak usando ASP.NET Core 8 com autenticação OpenID Connect / JWT Bearer:
| |
Configure o appsettings.json com os dados do Keycloak:
| |
⚠️ Atenção: Em produção,
RequireHttpsMetadatadeve sertruee oClientSecretdeve vir de variáveis de ambiente ou Azure Key Vault, nunca hardcoded noappsettings.json.
Program.cs — Configuração Completa
| |
💡 Dica: O Keycloak armazena as roles do realm dentro de um claim chamado
realm_accessno JWT. O código acima extrai essas roles e as mapeia paraClaimTypes.Roledo .NET, permitindo usar[Authorize(Roles = "admin")]normalmente. Sem esse mapeamento, oUser.IsInRole("admin")não funciona.
Controller Protegido
Crie um controller que demonstra os diferentes níveis de acesso:
| |
Obtendo um Token para Testes
Para testar a API, você precisa obter um token do Keycloak. Use o fluxo Resource Owner Password (apenas para testes/desenvolvimento):
| |
A resposta conterá o access_token. Use-o para chamar a API:
| |
Output esperado:
| |
Service para Comunicação com a Admin API
Para cenários onde sua aplicação precisa gerenciar usuários, roles ou sessões programaticamente, o Keycloak expõe uma Admin REST API completa. Veja como criar um serviço para consumir essa API:
| |
Registre no Program.cs:
| |
ℹ️ Informação: Para que o client
minha-apiconsiga acessar a Admin API, é necessário habilitar a Service Account do client no Keycloak e associar a rolerealm-management→realm-adminà service account.
Implementando o Logout
O logout em uma integração com o Keycloak vai além de simplesmente descartar o token no lado do cliente. Para que a sessão seja completamente encerrada, é necessário notificar o Keycloak para que ele invalide a sessão no servidor de identidade também — isso é chamado de RP-Initiated Logout (especificação OpenID Connect).
O Keycloak expõe o endpoint de logout em:
| |
Logout via API (Back-Channel)
Para invalidar a sessão do usuário diretamente pela sua API, use o refresh_token ou o id_token_hint:
| |
Registre o IHttpClientFactory no Program.cs (caso ainda não esteja registrado):
| |
Testando o Logout
1. Obtenha um token (incluindo o refresh_token):
| |
💡 Dica: O scope
offline_accessgarante que o Keycloak retorne umrefresh_tokenna resposta. Sem ele, dependendo da configuração do client, o refresh token pode não ser emitido.
2. Realize o logout via API:
| |
3. Ou obtenha a URL de logout para redirecionamento (front-channel):
| |
Logout no Front-End (SPA)
Para aplicações front-end (Angular, React, Vue), o logout geralmente é feito via redirecionamento para o endpoint do Keycloak:
| |
Se estiver usando o adaptador oficial keycloak-js, o logout é ainda mais simples:
| |
⚠️ Atenção: Para que o
post_logout_redirect_urifuncione, a URL de redirecionamento precisa estar cadastrada nas Valid Post Logout Redirect URIs do client no Keycloak. Em desenvolvimento, adicionehttp://localhost:*. Em produção, use apenas as URLs exatas do seu domínio.
Customização da Tela de Login
Uma das grandes vantagens do Keycloak sobre provedores de cloud é a liberdade total para customizar a tela de login. Você pode trocar o logo, alterar cores, fontes, textos e até criar temas completamente do zero usando templates FreeMarker.
Estrutura de um Tema Keycloak
O Keycloak usa um sistema de temas baseado em FreeMarker Templates. Cada tema pode sobrescrever parcialmente o tema padrão (keycloak ou keycloak.v2):
| |
Criando o Tema Customizado
1. Arquivo theme.properties
| |
2. CSS Customizado (resources/css/login.css)
| |
3. Mensagens em Português (messages/messages_pt_BR.properties)
| |
Montando o Tema no Container
Adicione o volume do tema no docker-compose.keycloak.yml:
| |
Alternativamente, ative o tema pelo painel admin:
- Vá em Realm Settings → aba Themes
- Em Login theme, selecione
meu-tema - Clique em Save
💡 Dica: No modo
start-dev, o Keycloak faz hot-reload dos temas automaticamente. Basta salvar o arquivo CSS ou o template FreeMarker e recarregar a página de login para ver as mudanças instantaneamente — sem precisar reiniciar o container.
Resultado Visual
Após aplicar o tema, a tela de login terá:
- ✅ Logo da sua empresa no topo
- ✅ Cores personalizadas nos botões e campos
- ✅ Textos em português brasileiro
- ✅ Card de login com bordas arredondadas e sombra suave
- ✅ Background com gradiente customizado
- ✅ Favicon personalizado
📝 Exemplo: Empresas como a Red Hat, Siemens e Deutsche Telekom usam Keycloak com temas totalmente customizados que são indistinguíveis de soluções SaaS proprietárias. O usuário final nunca percebe que está usando um identity provider open-source.
Keycloak em Produção com Container
Docker Compose para Produção
Para produção, as diferenças em relação ao setup de desenvolvimento são:
| |
⚠️ Atenção: Para produção, considere usar
buildao invés de volumes para o tema. A imagem oficial suporta multi-stage build comkc.sh buildpara otimizar o startup:
| |
Dicas de Produção — Segurança e Performance
Proxy reverso com Nginx:
Se o Keycloak estiver atrás de um Nginx (como na arquitetura descrita no padrão BFF), configure o location para proxy reverso:
| |
Dicas e Boas Práticas
Separe o realm de produção do admin — nunca use o realm
masterpara seus usuários. Crie realms específicos por aplicação ou domínio de negócio.Exporte e versione a configuração do realm — use o endpoint de exportação do Keycloak (
/admin/realms/{realm}/export) para salvar a configuração como JSON e versioná-la no Git. Isso permite recriar o ambiente inteiro a partir do código (Infrastructure as Code).Habilite rate limiting no proxy reverso — o Keycloak lida com autenticação, que é alvo frequente de ataques de força bruta. Configure
limit_reqno Nginx para restringir requisições ao endpoint de login.Configure o cache do Infinispan corretamente — em produção com múltiplas instâncias (cluster), o Keycloak usa o Infinispan para cache distribuído de sessões. Consulte a documentação oficial de caching para cenários de alta disponibilidade.
Monitore com health checks e métricas — habilite
KC_HEALTH_ENABLEDeKC_METRICS_ENABLEDpara expor endpoints de/healthe/metrics(compatíveis com Prometheus).Use
start --optimizedem produção — o comandostartcom a flag--optimizedpré-compila as configurações e reduz drasticamente o tempo de startup (de ~30s para ~5s).Atualize regularmente — o Keycloak recebe atualizações de segurança frequentes. Siga o blog oficial e teste novas versões em staging antes de atualizar produção.
Faça backup do banco regularmente — o PostgreSQL do Keycloak contém todos os dados de identidade. Um
pg_dumpagendado é obrigatório para qualquer ambiente de produção.
Comparativo: Quando Usar Keycloak vs Cloud
| Cenário | Recomendação |
|---|---|
| Startup com orçamento limitado | ✅ Keycloak — zero custo, todas as features |
| Empresa já no ecossistema Microsoft 365 | ⚡ Azure Entra ID — integração nativa |
| Aplicação 100% AWS com Serverless | ⚡ AWS Cognito — integração com Lambda/API Gateway |
| Requisito de soberania de dados (LGPD, GDPR) | ✅ Keycloak — dados ficam na sua infra |
| Time sem experiência em infra/containers | ⚡ Auth0 ou Firebase Auth — SaaS gerenciado |
| Cenário on-premises ou air-gapped | ✅ Keycloak — única opção viável |
| Necessidade de customização total da UX | ✅ Keycloak — temas FreeMarker ilimitados |
| Alta escala (milhões de MAU) | 🤔 Depende — Keycloak escala, mas exige expertise em cluster |
ℹ️ Informação: Nada impede o uso híbrido. Muitas empresas usam o Keycloak como identity broker federando com Azure AD/Google Workspace. Assim, os funcionários fazem login com SSO corporativo (Azure AD), mas os dados de sessão e autorização ficam centralizados no Keycloak.
Conclusão
O Keycloak é uma das ferramentas mais subestimadas do ecossistema open-source. Ele entrega, gratuitamente, funcionalidades que provedores de cloud cobram centenas ou milhares de dólares por mês: SSO, MFA, identity brokering, user federation, customização completa de UI e uma API REST poderosa para automação. Rodar em container com Docker ou Podman é trivial, e a integração via OpenID Connect é direta — neste artigo demonstramos com ASP.NET Core e C#, mas o mesmo fluxo funciona com Java, Python, Node.js, Go, PHP, Ruby e qualquer outra tecnologia que suporte JWT e OIDC. O Keycloak é um servidor de identidade agnóstico de linguagem: a camada de autenticação roda no container, e sua aplicação apenas valida tokens padrão.
Se você trabalha em um cenário onde o custo importa, onde a soberania de dados é requisito, ou simplesmente quer controle total sobre a autenticação e autorização da sua aplicação — independentemente da linguagem ou framework —, o Keycloak merece um lugar de destaque na sua stack. Comece pequeno, em ambiente de desenvolvimento com Docker Compose, valide o fluxo com sua aplicação, customize a tela de login com a identidade visual da sua marca e, quando estiver confiante, promova para produção com HTTPS, proxy reverso e backups.
A autenticação é a porta de entrada do seu sistema — e com o Keycloak, essa porta é gratuita, segura e completamente sua.
Leia Também
- Autenticação e Autorização: JWT, OAuth2 e OpenID Connect — fundamentos dos protocolos que o Keycloak implementa
- BFF Backend For Frontend: Segurança em SPAs — padrão arquitetural que combina perfeitamente com Keycloak como identity provider
Referências
- Keycloak — Site Oficial — documentação, downloads e guia de início rápido
- Keycloak Server Administration Guide — guia completo de administração do servidor
- Keycloak Docker Image — Quay.io — imagem oficial do container
- Keycloak Admin REST API — referência completa da API de administração
- Keycloak Themes Documentation — guia de customização de temas
- Microsoft — JWT Bearer Authentication in ASP.NET Core — documentação oficial do .NET para autenticação JWT
- CNCF — Keycloak Project — página do projeto na Cloud Native Computing Foundation
- Repositório blog-zocateli-sample — Keycloak — Código-fonte completo dos exemplos deste artigo
Ao comentar, você concorda com nossa Política de Privacidade, Termos de Uso e Política de Exclusão de Dados.