Suporte ao Open ID Connect para AEM as a Cloud Service no nível de publicação open-id-connect-support-for-aem-as-a-cloud-service-on-publish-tier
Introdução introduction
À medida que as organizações modernizam suas experiências digitais, o gerenciamento de identidades seguro e escalável se torna um requisito fundamental. O Adobe Experience Manager (AEM) Cloud Service agora é compatível com o OpenID Connect (OIDC) no nível de publicação, permitindo integração contínua e baseada em padrões com os principais Provedores de identidade (IdPs), como Entra ID (Azure AD), Google, Okta, Auth0, Identidade de ping, ForgeRock e IDC compatíveis com os IDPs.
O OIDC é uma camada de identidade sobre o protocolo OAuth 2.0 que permite uma autenticação de usuário robusta, mantendo a simplicidade para os desenvolvedores. Ele é amplamente adotado para cenários B2C (B2C), intranet e portais de parceiros, em que são necessários logon seguro de usuários e federações de identidade.
Até agora, os clientes do AEM eram responsáveis por implementar sua própria lógica de logon personalizada no nível de publicação, o que aumentou o tempo de desenvolvimento e introduziu desafios de manutenção e segurança de longo prazo. Com suporte nativo para o OIDC, o AEM Cloud Service remove essa carga fornecendo um mecanismo de autenticação seguro, extensível e com suporte da Adobe para usuários finais que acessam ambientes de publicação.
Esteja você fornecendo um site personalizado do consumidor ou um portal interno autenticado, o OIDC on Publish simplifica a federação de identidades e reduz os riscos por meio de um controle de identidades centralizado. Também ajuda as organizações a atender aos padrões modernos de conformidade e segurança sem sacrificar a agilidade.
Configurar o AEM para autenticação OIDC configure-aem-oidc-authentication
Pré-requisitos prerequisits
Presumimos que as seguintes informações estão disponíveis ou definidas:
- Os caminhos do conteúdo a ser protegido no repositório do AEM
- Um identificador para o IdP a ser configurado. Pode ser qualquer cadeia de caracteres
Informações da configuração do IdP:
- A ID do cliente configurada no IdP
- O segredo do cliente configurado no Idp. Se PKCE foi configurado no Idp, o segredo do cliente não está disponível. Não armazene o valor de texto simples no arquivo de configuração. Usar um segredo CM e referenciá-lo
- Os escopos configurados no Idp. Pelo menos o escopo
openiddeve ser fornecido - Se o PKCE está habilitado no IdP
- O
callbackUrlé definido usando um dos caminhos configurados definidos no ponto 1 e adicionando o sufixo:/j_security_check - O
baseUrlpara acessar o arquivo.well-knownpadrão. Por exemplo, se a URL conhecida for:https://login.microsoftonline.com/53279d7a-438f-41cd-a6a0-fdb09efc8891/v2.0/.well-known/openid-configurationabaseUrlfor:https://login.microsoftonline.com/53279d7a-438f-41cd-a6a0-fdb09efc8891
Visão geral dos arquivos de configuração overview-of-the-configuration-files
Encontre abaixo uma lista de arquivos que precisam ser configurados:
- Conexão OIDC: será usada pelo
OidcAuthenticationHandlerpara autenticar os usuários ou por outros componentes para autorizar o acesso a recursos protegidos pelo IdP usando OAuth - Manipulador de autenticação OIDC: esse é o manipulador de autenticação usado para autenticar usuários que acessam os caminhos configurados
- UserInfoProcessor: esse componente processa as informações recebidas pelo IdP. Ele pode ser estendido pelos clientes para implementar uma lógica personalizada
- Manipulador de Sincronização Padrão: este componente cria o usuário no repositório
- ExternalLoginModule: este componente autentica o usuário no repositório local do oak.
O diagrama a seguir mostra como os elementos de configuração mencionados são vinculados. Observe que, como esses são ServiceFactory componentes, ~uniqueid pode ser qualquer sequência de caracteres exclusiva e aleatória:
Configurar a conexão OIDC configure-the-oidc-connection
Primeiro, precisamos configurar a conexão OIDC. É possível configurar várias conexões OIDC, e cada uma precisa ter um nome diferente.
-
Crie um novo arquivo
.cfg.jsonque hospedará a configuração. Por exemplo, você pode usarorg.apache.sling.auth.oauth_client.impl.OidcConnectionImpl~azure.cfg.json- o sufixo azure deve ser um identificador exclusivo para a conexão -
Siga o formato de configuração no exemplo abaixo:
code language-none { "name":"azure", "scopes":[ "openid" ], "baseUrl":"<https://login.microsoftonline.com/tenant-id/v2.0>", "clientId":"client-id-from-idp", "clientSecret":"xxxxxx" }
Em alguns ambientes, o provedor de identidade (IdP) pode não expor um ponto de extremidade .well-known válido.
Quando isso ocorre, os endpoints necessários podem ser definidos manualmente especificando as seguintes propriedades no arquivo de configuração.
Neste modo de configuração, a propriedade baseUrl não deve ser definida.
"authorizationEndpoint": "https://idp-url/oauth2/v1/authorize",
"tokenEndpoint": "https://idp-url/oauth2/v1/token",
"jwkSetURL":"https://idp-url/oauth2/v1/keys",
"issuer": "https://idp-url"
-
Configure as propriedades da seguinte maneira:
- O "nome" pode ser definido pelo usuário
baseUrl,clientideclientSecretsão valores de configuração que vêm do IdP.- Os escopos devem conter pelo menos o valor
openid.
Configurar o manipulador de autenticação OIDC configure-oidc-authentication-handler
Agora, configure o manipulador de autenticação OIDC. Várias conexões OIDC podem ser configuradas. Cada um tem de ter um nome diferente. Se eles compartilharem o mesmo Provedor de Identidade Externo do OAK, eles poderão compartilhar usuários.
-
Crie o arquivo de configuração. Neste exemplo, usaremos
org.apache.sling.auth.oauth_client.impl.OidcAuthenticationHandler~azure.cfg.json. O sufixoazuredeve ser um identificador exclusivo. Consulte um exemplo do arquivo de configuração abaixo:code language-none { "path":"/content/tests/us/en/test-7", "callbackUri":"http://localhost:14503/content/tests/us/en/test-7/j_security_check", "pkceEnabled":false, "defaultConnectionName":"azure" "idp": "azure-idp" } -
Em seguida, configure suas propriedades da seguinte maneira:
path: o caminho a ser protegidocallbackUri: o caminho a ser protegido, adicionando o sufixo:/j_security_check. O mesmo callbackUri também deve ser configurado no IdP remoto como url de redirecionamento.defaultConnectionName: configurar com o mesmo nome definido para a conexão OIDC na etapa anterior+pkceEnabled:trueChave de Prova para Troca de Código (PKCE) no fluxo de código de Autorizaçãoidp: o nome do Provedor de Identidade Externo do OAK. Observe que um OAK IDP diferente não pode compartilhar usuários ou grupos
Configurar SlingUserInfoProcessor configure-slinguserinfoprocessor
-
Crie o arquivo de configuração. Neste exemplo, usaremos
org.apache.sling.auth.oauth_client.impl.SlingUserInfoProcessor~azure.cfg.json. O sufixoazuredeve ser um identificador exclusivo. Consulte um exemplo do arquivo de configuração abaixo:code language-none { "groupsInIdToken":true, "groupsClaimName": "groups", "connection":"azure", "storeAccessToken": false, "storeRefreshToken": false, "idpNameInPrincipals": true } -
Em seguida, configure suas propriedades da seguinte maneira:
groupsInIdToken: Definido como verdadeiro se os grupos forem enviados no Token de ID. Se o valor for falso, ou não for especificado, os grupos serão lidos do ponto de extremidade UserInfo.groupsClaimName: O nome da declaração contém os grupos a serem sincronizados no AEM.connection: configurar com o mesmo nome definido para a conexão OIDC na etapa anteriorstoreAccessToken: verdadeiro se o token de acesso precisar ser armazenado no repositório. Por padrão, é falso. Defina como verdadeiro somente se o AEM precisar acessar recursos em nome do usuário armazenado em servidores externos protegidos pelo mesmo IdP.storeRefreshToken: verdadeiro se o token de atualização deve ser armazenado no repositório. Por padrão, é falso. Defina-o como verdadeiro somente se o AEM precisar acessar recursos em nome do usuário armazenado em servidores externos protegidos pelo mesmo IdP e precisar atualizar o token do IdP.idpNameInPrincipals: quando definido como verdadeiro, o nome do IdP é adicionado como sufixo às entidades de segurança de usuário e grupo separadas por um ';'. Por exemplo, se o nome do IdP forazure-idpe o nome de usuário forjohn.doe, a entidade de segurança armazenada no oak serájohn.doe;azure-idp. Isso é útil quando vários IdPs são configurados no oak para evitar conflitos entre usuários ou grupos com o mesmo nome vindo de IdPs diferentes. Isso também pode ser definido para evitar conflitos com usuários ou grupos criados por outros manipuladores de autenticação, como o Saml.
Observe que o token de acesso e o token de atualização são armazenados criptografados com a chave mestre do AEM.
Configurar o Manipulador de sincronização configure-the-synchronization-handler
Pelo menos um Manipulador de sincronização deve ser configurado para sincronizar os usuários autenticados no oak. Para obter mais detalhes, consulte esta página.
Crie um arquivo chamado org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~azure.cfg.json. O sufixo azure deve ser um identificador exclusivo. Para obter mais informações sobre como configurar suas propriedades, consulte a documentação sobre Sincronização de Usuários e Grupos do Oak. Encontre um exemplo de configuração abaixo:
{
"user.expirationTime":"1h",
"user.membershipExpTime":"1h",
"group.expirationTime": "1d"
"user.propertyMapping":[
"profile/givenName=profile/given_name",
"profile/familyName=profile/family_name",
"rep:fullname=profile/name",
"profile/email=profile/email",
"access_token=access_token",
"refresh_token=refresh_token"
],
"user.pathPrefix":"azure",
"handler.name":"azure"
}
Durante o desenvolvimento, os tempos de expiração podem ser reduzidos a um valor mais baixo (por exemplo: 1s) para acelerar os testes de sincronização de usuários e grupos no oak.
Abaixo alguns dos atributos mais relevantes a serem configurados em DefaultSyncHandler. Observe que a Associação de grupo dinâmico deve estar sempre habilitada nos Serviços em nuvem.
user.expirationTimeuser.membershipExpTimeuser.dynamicMembershipuser.enforceDynamicMembershipgroup.dynamicGroupsUserInfoProcessor sincroniza apenas algumas propriedades. Ele pode ser modificado e personalizado."profile/givenName=profile/given_name","profile/familyName=profile/family_name","rep:fullname=perfil/nome","profile/email=profile/email","access_token=access_token","atualizar_token=atualizar_token"user.membershipNestingDepthConfigurar o módulo de logon externo configure-the-external-login-module
Por fim, é necessário configurar o Módulo de logon externo.
-
Crie um arquivo chamado
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModuleFactory~azure.cfg.json. Consulte um exemplo de configuração abaixo:code language-none { "sync.handlerName":"azure", "idp.name":"azure-idp" } -
Configure suas propriedades da seguinte maneira:
sync.handlerName: nome do Manipulador de Sincronização definido anteriormenteidp.name: Provedor de Identidade OAK definido no Manipulador de Autenticação OIDC
Opcional: Implementar um UserInfoProcessor personalizado implement-a-custom-userinfoprocessor
O usuário é autenticado por um Token de ID e atributos adicionais são buscados no ponto de extremidade userInfo definido para o IdP. Se operações não padrão adicionais tiverem que ser executadas, uma implementação personalizada do UserInfoProcessor será a implementação padrão do Sling.
Configurar ACL para grupos externos configure-acl-for-external-groups
Quando os usuários são autenticados por meio do OIDC, suas associações de grupo normalmente são sincronizadas do provedor de identidade externo.
Esses grupos externos são criados dinamicamente no repositório do AEM, mas não são associados automaticamente a nenhuma entrada de controle de acesso.
Para garantir que os usuários tenham as permissões apropriadas, as listas de controle de acesso (ACLs) devem ser explicitamente definidas para esses grupos.
Duas abordagens principais estão disponíveis.
Opção 1 — Grupos locais
O grupo externo pode ser adicionado como membro de um grupo local que já tem as ACLs necessárias.
- O grupo externo deve existir no repositório, que ocorre automaticamente quando um usuário pertencente a esse grupo faz logon pela primeira vez.
- Essa opção geralmente é preferida quando Grupos de usuários fechados (CUGs) estão em uso, pois o grupo local existe em ambos os ambientes, autor e publicação.
Opção 2 — ACLs diretas em grupos externos via RepoInit
As ACLs podem ser aplicadas diretamente a grupos externos usando scripts RepoInit.
-
Essa abordagem é mais eficiente e é preferível quando os CUGs não são usados.
-
O exemplo a seguir mostra uma configuração RepoInit que atribui permissões de leitura a um grupo externo. A opção
ignoreMissingPrincipalpermite a criação da ACL mesmo se o grupo ainda não existir no repositório:code language-none { "scripts":[ "set ACL for \"my-group;my-idp\" (ACLOptions=ignoreMissingPrincipal)\r\n allow jcr:read on /content/wknd/us/en/magazine\r\nend" ] }
Exemplo: configurar a autenticação OIDC com o Azure Ative Diretory
Configurar um novo Aplicativo no Azure Ative Diretory configure-a-new-application-in-azure-ad
-
Crie um novo aplicativo no Azure Ative Diretory seguindo a documentação do Azure Ative Diretory. Veja abaixo a aparência da tela que detalha a visão geral do aplicativo:
-
Se forem necessários Grupos ou funções de aplicativo, siga a documentação para habilitá-los para o aplicativo e envie-os no Token de ID. Abaixo, um exemplo de grupos configurados:
-
Siga as etapas documentadas anteriormente para criar os arquivos de configuração necessários. Abaixo um exemplo específico do Azure AD, onde:
- Definimos o nome da conexão OIDC, Manipulador de autenticação e DefaultSyncHandler como:
azure - A URL do site é:
www.mywebsite.com - Protegemos o caminho
/content/wknd/us/en/adventuresque é acessível apenas a usuários autenticados membros do grupoadventures - O inquilino é:
tennat-id, - ID do cliente:
client-id, - O segredo é:
secret, - Os grupos são enviados no Token de ID em uma declaração chamada:
groups
- Definimos o nome da conexão OIDC, Manipulador de autenticação e DefaultSyncHandler como:
org.apache.sling.auth.oauth_client.impl.OidcConnectionImpl~azure.cfg.json
{
"name":"azure",
"scopes":[
openid", "User.Read", "profile", "email"
],
"baseUrl":"https://login.microsoftonline.com/tenant-id/v2.0",
"clientId":"client-id",
"clientSecret":"secret"
}
org.apache.sling.auth.oauth_client.impl.OidcAuthenticationHandler~azure.cfg.json
{
"callbackUri":"https://www.mywebsite.com/content/wknd/us/en/adventures/j_security_check",
"path":[
"/content/wknd/us/en/adventures"
],
"idp":"azure",
"defaultConnectionName":"azure"
}
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModuleFactory~azure.cfg.json
{
"sync.handlerName":"azure",
"idp.name":"azure"
}
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~azure.cfg.json
{
"user.expirationTime":"1h",
"user.membershipExpTime":"1h",
"group.expirationTime": "1d"
"user.propertyMapping":[
"profile/givenName=profile/given_name",
"profile/familyName=profile/family_name",
"rep:fullname=profile/name",
"profile/email=profile/email",
"access_token=access_token",
"refresh_token=refresh_token"
],
"user.pathPrefix":"azure",
"group.pathPrefix": "oidc",
"user.membershipNestingDepth": "1",
"handler.name":"azure"
}
org.apache.sling.jcr.repoinit.RepositoryInitializer~azure.cfg.json
{
"scripts":[
"set ACL for \"adventures;azure\" (ACLOptions=ignoreMissingPrincipal)\r\n allow jcr:read on /content/wknd/us/en/adventures\r\nend"
]
}
org.apache.sling.auth.oauth_client.impl.SlingUserInfoProcessorImpl~azure.cfg.json
{
"groupsInIdToken": "true",
"storeAccessToken": "false",
"storeRefreshToken": "false",
"connection": "azure",
"groupsClaimName": "groups"
}
Informações adicionais sobre grupos do Azure AD additional-information-about-azure-ad-groups
Para configurar um grupo para o aplicativo corporativo no Portal do Microsoft Azure, você precisa pesquisar o aplicativo em: Aplicativos Corporativos e adicionar os grupos:
Para habilitar a declaração de grupo no Token de Id, adicione a declaração na seção Configuração de Token do Portal do Microsoft Azure:
A configuração de SlingUserInfoProcessor deve ser modificada como no exemplo abaixo.
O nome de arquivo que precisa ser modificado é org.apache.sling.auth.oauth_client.impl.SlingUserInfoProcessorImpl.cfg.json. O conteúdo deve ser configurado da seguinte maneira:
{
"connection": "azure",
"groupsInIdToken": "true",
"storeAccessToken": "false",
"storeRefreshToken": "false"
}
Como migrar do Manipulador de autenticação Saml para o Manipulador de autenticação Oidc
Quando o AEM já estiver configurado com um Manipulador de Autenticação SAML e os usuários estiverem presentes no repositório com a sincronização de dados habilitada, poderão ocorrer conflitos entre os usuários SAML originais e os novos usuários OIDC.
- Configure o OidcAuthenticationHandler e habilite
idpNameInPrincipalsna configuração SlingUserInfoProcessor - Configuração ACL para grupos externos.
- Após o logon dos usuários, os usuários antigos criados pelo manipulador de autenticação saml podem ser excluídos.