Dia 7: Federação SAML com Entra ID e Keycloak
A federação SAML permite que o Entra ID (antigo Azure AD) funcione como Fornecedor de Identidade central para aplicações externas, eliminando passwords múltiplas e centralizando a gestão de identidade. Neste sétimo dia do curso M365, vamos configurar SSO SAML com enterprise applications, mapear claims personalizadas, integrar Keycloak como identity broker e explorar cenários multi-tenant e B2B.
Neste artigo
- 1. Introdução à Federação SAML
- 2. Enterprise Applications no Entra ID
- 3. Configurar SSO SAML
- 4. Claims e Token Configuration
- 5. Keycloak como Identity Broker
- 6. Multi-Tenant e B2B
- 7. Erros Comuns e Lista de Verificação
1. Introdução à Federação SAML
O protocolo SAML 2.0 (Security Assertion Markup Language) é o padrão de facto para federar identidade entre organizações e aplicações. Ao contrário do OIDC (baseado em OAuth 2.0), o SAML usa tokens XML assinados — as assertions — para transmitir informação de identidade de forma segura entre um Fornecedor de Identidade (IdP) e um Service Provider (SP).
No contexto do Entra ID, a federação SAML permite que aplicações que suportam SAML (como Salesforce, ServiceNow, Amazon AWS e aplicações on-premises) autentiquem os utilizadores através do Entra ID, sem que estes precisem de memorizar credenciais adicionais. O fluxo básico é:
- O utilizador acede à aplicação (SP)
- A aplicação redireciona para o Entra ID (IdP)
- O utilizador autentica-se no Entra ID (com MFA, Conditional Access, etc.)
- O Entra ID devolve uma SAML assertion assinada à aplicação
- A aplicação valida a assertion e concede acesso
Para uma visão geral completa do SSO no Entra ID, consulte a documentação oficial de Enterprise Applications.
ℹ O SSO SAML elimina passwords múltiplas — os utilizadores autenticam-se uma vez no Entra ID e acedem a todas as aplicações federadas.
| Aspecto | SAML 2.0 | OIDC |
|---|---|---|
| Formato do token | XML assinado | JWT (JSON) |
| Caso de uso típico | Aplicações enterprise legadas | Aplicações modernas, SPAs |
| Complexidade de configuração | Média-alta (certificados, metadados) | Baixa (client ID + secret) |
| Suporte no Entra ID | Gallery + Non-gallery apps | App registrations |
2. Enterprise Applications no Entra ID
As Enterprise Applications são o ponto de entrada para configurar SSO no Entra ID. Existem três tipos principais:
- Gallery Applications — aplicações pré-configuradas (mais de 4000 no catálogo, incluindo Salesforce, ServiceNow, AWS)
- Non-gallery Applications — aplicações SAML customizadas, sem predefinição do catálogo
- On-premises Applications — aplicações internas publicadas via Application Proxy
Cada enterprise application cria automaticamente um Service Principal no Entra ID, que representa a instância da aplicação no directório. O Service Principal contém a configuração de SSO, as atribuições de utilizadores e grupos, e as políticas de acesso condicional.
# Listar enterprise applications com SAML SSO configurado
Connect-MgGraph -Scopes "Application.Read.All"
Get-MgServicePrincipal -Filter "samlSingleSignOnSettings ne null" | Select-Object DisplayName, AppId
# Verificar certificados de assinatura SAML (data de expiração)
Get-MgServicePrincipal | ForEach-Object {
$certs = $_.KeyCredentials | Where-Object {$_.Usage -eq "Verify"}
if ($certs) {
[PSCustomObject]@{
App = $_.DisplayName
Expiry = $certs.EndDateTime
}
}
} | Sort-Object Expiry
A diferença entre App Registrations e Enterprise Applications causa confusão frequente: a App Registration define a aplicação no abstracto (client ID, redirect URIs, permissões), enquanto a Enterprise Application (Service Principal) representa a instância concreta no tenant, com utilizadores atribuídos, claims configuradas e SSO activo.
3. Configurar SSO SAML
A configuração de SSO SAML envolve três passos fundamentais: importar a metadados da aplicação, configurar o Entra ID com os endpoints correctos e trocar certificados de assinatura.
Passo 1 — Configuração básica SAML
No portal do Entra ID, navegar para Enterprise Applications → [Aplicação] → Single início de sessão → SAML. Os parâmetros essenciais são:
| Parâmetro | Descrição | Obrigatório |
|---|---|---|
| Identifier (Entity ID) | URI único que identifica a aplicação | Sim |
| Reply URL (ACS) | Endpoint onde o Entra ID envia a assertion | Sim |
| Sign on URL | URL de início de sessão iniciado pelo SP | Opcional |
| Relay State | URL de destino após autenticação | Opcional |
Passo 2 — Troca de metadados e certificados
O Entra ID gera automaticamente um certificado de assinatura SAML com validade de 3 anos. É necessário descarregar a Federation Metadados XML e fornecer à aplicação, ou copiar manualmente os valores de Login URL, Entra ID Identifier e Certificate (Base64).
# Criar uma enterprise application SAML (non-gallery)
New-MgServicePrincipal -AppId "app-id-here" -DisplayName "Aplicação Externa"
# Verificar modo de SSO configurado
Get-MgServicePrincipal -ServicePrincipalId "sp-id" | Select-Object PreferredSingleSignOnMode
# Descarregar federation metadados XML
# Entra ID → Enterprise Applications → App → Single início de sessão → Download Federation Metadados XML
Passo 3 — Atribuir utilizadores e grupos
Por defeito, ninguém tem acesso a uma enterprise application nova. É necessário atribuir explicitamente utilizadores ou grupos. Para empresas com muitos utilizadores, recomenda-se atribuir grupos em vez de utilizadores individuais — isto simplifica a gestão e permite escalar.
⚠ O certificado de assinatura SAML expira — sem renovação, todas as aplicações federadas deixam de funcionar. Monitorizar a data de expiração.
4. Claims e Token Configuration
As claims são atributos do utilizador incluídos na SAML assertion. Por defeito, o Entra ID envia user.userprincipalname (Name ID), user.givenname e user.surname. A maioria das aplicações requer claims adicionais como email, departamento ou role.
Claims essenciais
| Claim | Origem (Entra ID) | Uso típico |
|---|---|---|
| emailaddress | user.mail | Identificação do utilizador na app |
| department | user.department | Autorização baseada em departamento |
| role | directoryRole / appRole | RBAC na aplicação |
| employeeid | user.employeeid | Mapeamento com HR |
# Configurar claims via portal:
# Entra ID → Enterprise Applications → App → Single início de sessão
# → Attributes & Claims → Add new claim
#
# Adicionar claims: email, department, role
# Transform claims: extra → tolower(user.mail) para normalizar email
#
# Via Microsoft Graph PowerShell:
$params = @{
ClaimsMapping = @{
AdditionalProperties = @(
@{ Name = "email"; Source = "user"; SourceId = "mail" }
@{ Name = "department"; Source = "user"; SourceId = "department" }
@{ Name = "role"; Source = "user"; SourceId = "assignedroles" }
)
}
}
Update-MgServicePrincipalClaimMapping -ServicePrincipalId "sp-id" -BodyParameter $params
As claims transformations permitem modificar valores antes de os enviar. Por exemplo, converter o email para minúsculas (ToLower(user.mail)), extrair o domínio (ExtractMailDomain(user.mail)) ou juntar atributos (Join(user.givenname, " ", user.surname)).
5. Keycloak como Identity Broker
O Keycloak é um Fornecedor de Identidade código aberto que pode funcionar como identity broker — uma camada intermédia entre o Entra ID e aplicações que não suportam SAML nativamente ou que precisam de um IdP próprio. Neste padrão, o Keycloak federar com o Entra ID (recebendo identidades) e oferece OIDC ou SAML às aplicações a jusante.
Para detalhes sobre a configuração específica de Keycloak com Entra ID e forçar reautenticação, consulte o artigo Keycloak como Identity Broker com Entra ID: Federação SAML e Forçar Reautenticação no kbase.pt.
Configuração do Keycloak como IdP Broker
# Keycloak como IdP broker
# Keycloak → Fornecedor de Identidades → Add → OpenID Connect ou SAML 2.0
#
# Para federar com Entra ID via OIDC:
# Configurar:
# Client ID: [do App Registration no Entra ID]
# Client Secret: [gerado no Entra ID]
# Authorization URL: https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize
# Token URL: https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token
# Issuer: https://login.microsoftonline.com/{tenant-id}/v2.0
# Scope: openid email profile
#
# Para federar via SAML 2.0:
# Importar metadados XML do Entra ID
# Single Sign-On Service URL: do metadados
# Single Logout Service URL: do metadados
# Signing Certificate: do metadados
A documentação completa do Keycloak está disponível em keycloak.org/documentation.
Fluxo de autenticação intermediada
- Utilizador acede à aplicação configurada com Keycloak
- Keycloak mostra página de login com opção “Início de sessão with Entra ID”
- Keycloak redireciona para o Entra ID (IdP a montante)
- Entra ID autentica (MFA, Conditional Access) e devolve token ao Keycloak
- Keycloak mapeia identidade e emite token próprio (OIDC ou SAML) à aplicação
| Cenário | Recomendação | Justificação |
|---|---|---|
| App suporta SAML nativo | Directo Entra ID → App | Menos saltos, menor latência |
| App suporta apenas OIDC | Directo Entra ID → App (OIDC) | Entra ID suporta OIDC nativamente |
| Múltiplas apps on-premises | Keycloak como broker | Centraliza SSO, simplifica certificados |
| App só suporta SAML legado | Keycloak traduz OIDC→SAML | Evita SAML directo no Entra ID |
6. Multi-Tenant e B2B
O Entra ID suporta dois padrões de multi-tenancy para federação SAML: multi-tenant applications (uma aplicação serve múltiplos tenants) e Entra B2B (utilizadores externos convidados para o tenant).
Multi-tenant Applications
Para SaaS providers que servem múltiplas organizações, a App Registration é configurada como multi-tenant. Cada tenant cria o seu próprio Service Principal com claims e SSO específicos. O fluxo SAML multi-tenant funciona com IdP-initiated ou SP-initiated, mas requer que o Issuer (Entity ID) seja único por tenant.
# App Registration multi-tenant
# No portal: New registration → Supported account types
# ◦ Accounts in any organizational directory (Any Entra ID tenant - Multitenant)
#
# Para SAML SSO multi-tenant, cada tenant configura:
# - Entity ID único (ex: https://app.exemplo.com/tenant-contoso)
# - Reply URL específica por tenant
# - Claims mapping por tenant (atributos podem diferir)
#
# Verificar configuração multi-tenant via Graph:
Get-MgApplication -ApplicationId "app-obj-id" | Select-Object DisplayName, SignInAudience
# SignInAudience deve ser "AzureADMultipleOrgs"
Entra B2B Collaboration
O Entra B2B permite convidar utilizadores externos (de outros tenants Entra ID ou de IdPs federados) como utilizadores convidados. Estes utilizadores autenticam-se no seu IdP de origem, mas recebem acesso a aplicações no tenant anfitrião. O fluxo B2B com federação SAML é especialmente útil para parceiros que já têm um IdP próprio (Keycloak, Okta, AD FS).
| Funcionalidade | Multi-tenant App | B2B Collaboration |
|---|---|---|
| Quem cria a identidade | Tenant de origem do utilizador | Tenant de origem (guest) |
| Onde reside a conta | Tenant de origem | Tenant anfitrião (como guest) |
| Acesso a apps | Apps no próprio tenant | Apps no tenant anfitrião |
| Conditional Access | Tenant de origem | Tenant anfitrião |
A escolha entre multi-tenant e B2B depende do controlo necessário: multi-tenant dá autonomia a cada organização; B2B dá controlo centralizado ao tenant anfitrião sobre políticas de acesso e Conditional Access.
7. Erros Comuns e Lista de Verificação
A configuração SAML tem vários pontos de falha. Seguem-se os erros mais frequentes e uma lista de verificação para resolver problemas.
Erros mais comuns
| Problema | Causa | Solução |
|---|---|---|
| AADSTS50158 | Utilizador não atribuído à app | Atribuir utilizador/grupo na app |
| AADSTS75005 | SAML request malformado | Verificar Reply URL e Entity ID |
| Certificado expirado | Cert SAML não renovado | Renovar e actualizar na app |
| Claims em falta | Mapeamento não configurado | Adicionar claims em Attributes & Claims |
| NameID mismatch | Formato NameID errado | Verificar formato esperado pela app |
# Diagnosticar erros SAML com Registos de início de sessão
# Entra ID → Monitoring & health → Registos de início de sessão
# Filtrar por: Application = [nome da app]
# Verificar coluna "Status" → detalhes do erro
#
# Via Graph PowerShell:
Get-MgAuditLogSignIn -Filter "appId eq 'app-id-here'" -Top 10 |
Select-Object CreatedDateTime, Status, ErrorDescription
Lista de verificação final
- ✓ Entity ID (Identifier) corresponde exactamente ao configurado na aplicação
- ✓ Reply URL (ACS) é HTTPS e corresponde ao endpoint da aplicação
- ✓ Certificado de assinatura SAML não expira nos próximos 30 dias
- ✓ Utilizadores ou grupos atribuídos à enterprise application
- ✓ Claims necessárias configuradas (email, role, department conforme app)
- ✓ Formato Name ID correcto (email, UPN ou unspecified)
- ✓ Conditional Access aplicado à app (MFA, localização, dispositivo)
- ✓ Federation Metadados XML actualizada na aplicação
- ✓ Registos de início de sessão sem erros para pelo menos um utilizador de teste
- ✓ Keycloak broker (se aplicável): mapeamento de claims IdP → realm configurado
A federação SAML entre Entra ID e aplicações externas é uma peça fundamental da estratégia de identidade moderna. Com SSO bem configurado, os utilizadores ganham produtividade, a equipa de TI centraliza o controlo, e a segurança aumenta com MFA e Conditional Access aplicados uniformemente. No próximo dia exploraremos a governação de identidade e Privileged Identity Management (PIM).
Artigos Relacionados
- Dia 4: Autenticação Moderna — MFA, Conditional Access e Passwordless
- Keycloak como Identity Broker com Entra ID: Federação SAML e Forçar Reautenticação
- Dia 2: Introdução ao Entra ID e Gestão de Identidades (em breve)
Artigo publicado no âmbito do Curso M365 para SysAdmins — kbase.pt