Entra ID
Início de sessão único com o Microsoft Entra ID (Azure AD), com funções a partir dos grupos do Entra ID do utilizador
- Como funciona
- Registar a aplicação
- Adicionar o fornecedor
- Mapeamento para funções
- Endpoint do Microsoft Graph
- Limitações
Como funciona
Com um fornecedor Entra ID ativado, a página de início de sessão mostra um botão Entra ID por baixo de Iniciar sessão. Um início de sessão decorre então assim:
- O botão envia o navegador para
/api/v2/auth/entraid, que o redireciona para a Microsoft. - O utilizador inicia sessão na Microsoft, que redireciona de volta para o URL de redirecionamento com um código de autorização. O servidor troca esse código com a Microsoft pelo ID token e por um access token para o Microsoft Graph.
- O servidor lê os grupos do utilizador no Microsoft Graph (
/v1.0/me/transitiveMemberOf), por isso os grupos aninhados também contam. - Os grupos são filtrados com o Filtro de grupos pelo seu nome de apresentação, e cada grupo que fica é guardado duas vezes, como
azuread/<object id>e comoazuread/<display name>.
O nome de utilizador é a claim upn do token, ex. jdoe@example.com, ou a claim preferred_username quando o token não tem upn; numa conta profissional ambas contêm o mesmo valor.
Registar a aplicação
O AnsibleForms precisa de um registo de aplicação no Entra admin center, em App registrations > New registration:
- Dê-lhe um nome, escolha Accounts in this organizational directory only como tipos de conta suportados e adicione um URI de redirecionamento do tipo Web:
https://af.example.com/api/v2/auth/entraid/callback. - Em Certificates & secrets, crie um client secret e copie o seu valor; só é mostrado uma vez.
- Em API permissions, adicione as permissões delegated do Microsoft Graph
User.ReadeGroupMember.Read.All, e conceda-lhes o consentimento de administrador. - Na página Overview, anote o Application (client) ID e o Directory (tenant) ID.
O URI de redirecionamento é o endereço em que os utilizadores chegam ao AnsibleForms, seguido de /api/v2/auth/entraid/callback. Com BASE_URL /forms, passa a ser https://af.example.com/forms/api/v2/auth/entraid/callback. Tem de corresponder exatamente ao URI de redirecionamento da credencial do fornecedor.
Até à 7.2.0 o caminho era /api/v2/auth/azureadoauth2/callback. Continua a funcionar a partir da 7.3.0, por isso um registo existente não precisa de alterações; uma credencial com o URI de redirecionamento vazio usa o novo caminho, por isso adicione-o então ao registo.
O AnsibleForms lê os grupos do Graph e não usa uma claim de grupos no token, por isso não é preciso configurar nenhuma claim de grupos no registo.
Adicionar o fornecedor
Adicione o fornecedor em Acesso > SSO: um assistente pede os seus campos em quatro passos, com Microsoft Entra ID no passo Tipo:
| Passo | Campo | Significado |
|---|---|---|
| Detalhes | Nome, Descrição | Um nome único para o fornecedor, e uma descrição opcional |
| Tipo | Fornecedor | Microsoft Entra ID; definido na criação, não muda |
| Credenciais | Credencial | Uma credencial Microsoft Entra ID de Ligações > Credenciais, ver abaixo |
| Grupos | Filtro de grupos | Expressão regular; só ficam os grupos cujo nome de apresentação corresponde. Vazio mantém todos os grupos |
A credencial contém o registo da aplicação, por isso só um admin a pode adicionar ou alterar:
| Campo | Significado |
|---|---|
| Tenant ID | Obrigatório. O Directory (tenant) ID, um GUID, ou um dos domínios do tenant. Só os utilizadores desse tenant podem iniciar sessão |
| Client ID | O Application (client) ID |
| Client secret | O valor do client secret, guardado cifrado ou lido de um cofre de segredos |
| URI de redirecionamento | Tal como registado, ex. https://af.example.com/api/v2/auth/entraid/callback. Vazio: o URL da aplicação e o caminho de callback |
Uma credencial com o tenant ID vazio é recusada ao ser guardada. Os endpoints multi-tenant common, organizations e consumers são recusados quando se guarda o fornecedor que nomeia a credencial, porque deixariam iniciar sessão utilizadores de qualquer tenant da Microsoft. No início de sessão, o servidor verifica também que o token vem do tenant configurado. Um fornecedor guardado anteriormente sem tenant ID não deixa ninguém iniciar sessão: até o tenant ID ser preenchido, o servidor regista Could not enable Microsoft Entra ID: set the tenant id to your tenant ('' would let any Microsoft tenant log in).
Até à 7.2.0, o tenant, o client ID, o secret e o URL de redirecionamento eram campos do fornecedor. A atualização para a 7.3.0 move-os para uma credencial chamada <provider>-sso, consulte Endereços nas credenciais. Escolha uma credencial para cada fornecedor novo: o servidor continua a aceitar um fornecedor com o seu próprio client ID e secret de antes da 7.3.0, que inicia sessão com eles até ser escolhida uma credencial.
Só um fornecedor Entra ID está ativado de cada vez, aquele com que o botão Entra ID inicia sessão. Ativar no menu da linha de outro, ou o seu interruptor Ativado, desativa os outros do mesmo tipo; a coluna Ativado da lista mostra qual está em uso. Um fornecedor pode também saltar a página de início de sessão, consulte Alternar o início de sessão único. Guardar aplica-o de imediato, sem reiniciar.
Mapeamento para funções
No config.yaml, um grupo do Entra ID é entraid/<object id> ou entraid/<display name>, e um utilizador é entraid/<upn>. O object id é único no tenant, por isso é a escolha mais segura; um nome de apresentação é mais fácil de ler:
roles:
- name: admin
groups:
- local/admins
- entraid/0b6c8e1a-2f4d-4c7e-9a3b-5d1e7f2a4c6b
- name: operator
groups:
- entraid/AF-Operators
users:
- entraid/jdoe@example.com
Até à 7.2.0 o prefixo era azuread/. Numa função continua a corresponder aos mesmos membros a partir da 7.3.0 e será removido na 8.0; o editor de funções escreve entraid/. Só as funções aceitam entraid/: os grupos do utilizador são guardados como azuread/<object id> e azuread/<display name>, e a página de perfil e o extravar ansibleforms_user mostram-nos assim. Um Filtro de grupos como ^AF- mantém só os grupos que as suas funções usam; consulte Funções. A partir da 7.1.0 o token de início de sessão deixou de transportar os grupos, por isso o seu tamanho já não cresce com eles. O filtro continua a ser importante para utilizadores em muitos grupos: em cada início de sessão são comparados menos grupos com as funções, e o registo de diretório do utilizador lista só os grupos que contam. Antes da 7.1.0, um utilizador em cem grupos ou mais precisa dele para ver qualquer formulário, consulte Formulários e tarefas vazios depois de um início de sessão único.
Endpoint do Microsoft Graph
O servidor inicia a sessão dos utilizadores em https://login.microsoftonline.com e chama o Microsoft Graph em https://graph.microsoft.com por predefinição:
| Variável | O que altera |
|---|---|
ENTRA_AUTHORITY_URI | A autoridade de início de sessão, para uma cloud nacional como https://login.microsoftonline.us |
ENTRA_GRAPH_URI | O endpoint do Graph de onde são lidos os grupos, como https://graph.microsoft.us |
Ambas recebem um URI base sem barra final, e são novas na 7.3.0. AZURE_AUTHORITY_URI e AZURE_GRAPH_URI continuam a ser lidas quando aquelas não estão definidas, com um aviso no registo, e serão removidas na 8.0. O servidor tem de chegar ao Graph: um início de sessão falha quando os grupos não podem ser lidos.
Limitações
Os utilizadores do Entra ID iniciam sessão com a Microsoft, por isso algumas coisas funcionam de forma diferente das contas locais e LDAP:
- Não têm palavra-passe no AnsibleForms, por isso não a podem alterar lá; um token de API é criado a partir da sua sessão.
- Os nomes de apresentação não são únicos no Entra ID: dois grupos com o mesmo nome correspondem à mesma função. Nomeie o grupo pelo seu object id na função,
entraid/<object id>, para corresponder só a esse grupo.