Prise en charge d’Open ID Connect pour AEM as a Cloud Service au niveau publication open-id-connect-support-for-aem-as-a-cloud-service-on-publish-tier
Présentation introduction
À mesure que les organisations modernisent leurs expériences numériques, la gestion sécurisée et évolutive des identités devient une exigence fondamentale. Cloud Service d’Adobe Experience Manager (AEM) prend désormais en charge Open ID Connect (OIDC) au niveau publication, ce qui permet une intégration transparente et normalisée avec les principaux fournisseurs d’identité (IdP) tels qu’Entra ID (Azure AD), Google, Okta, Auth0, Ping Identity, ForgeRock et les fournisseurs d’identité pris en charge par OIDC.
OIDC est une couche d’identité qui se place sur le protocole OAuth 2.0 et qui permet une authentification robuste des personnes, tout en restant simple pour les développeurs et développeuses. Il est largement adopté pour les scénarios de business-to-consumer (B2C), d’intranet et de portails partenaires, où des fédérations d’identités et de connexion sécurisées sont requises.
Jusqu’à présent, les clientes et clients AEM devaient mettre en œuvre leur propre logique de connexion personnalisée au niveau publication, ce qui accroissait les délais de développement et introduisait des difficultés de maintenance et de sécurité à long terme. Grâce à la prise en charge native d’OIDC, AEM Cloud Service élimine cette responsabilité en proposant un mécanisme d’authentification sécurisé, extensible et pris en charge par Adobe pour les utilisateurs et utilisatrices qui accèdent aux environnements de publication.
Qu’il s’agisse de diffuser un site web client personnalisé ou un portail interne authentifié, OIDC installé au niveau publication simplifie la fédération des identités et réduit les risques grâce à une gouvernance d’identité centralisée. Il aide également les organisations à respecter les normes de conformité et de sécurité modernes sans sacrifier leur agilité.
Configurer AEM pour l’authentification OIDC configure-aem-oidc-authentication
Prérequis prerequisits
Nous partons de l’hypothèse que les informations suivantes sont disponibles ou définies :
- Chemins d’accès au contenu à protéger dans le référentiel AEM.
- Identifiant de l’IdP à configurer. Il peut s’agir de n’importe quelle chaîne.
Informations provenant de la configuration d’IdP :
- ID client configuré dans l’IdP.
- Secret client configuré dans l’IdP. Si PKCE a été configuré sur l’IdP, le secret client n’est pas disponible. Ne stockez pas la valeur en texte brut dans le fichier de configuration. Utiliser un secret CM et le référencer
- Étendues configurées sur l’IdP. Il est nécessaire de fournir au moins l’étendue
openid
. - Indique si PKCE est activé ou non sur l’IdP.
- L’
callbackUrl
est définie à l’aide de l’un des chemins configurés définis au point 1 et en ajoutant le suffixe :/j_security_check
- L’
baseUrl
permettant d’accéder au fichier.well-known
standard. Par exemple, si l’URL connue est :https://login.microsoftonline.com/53279d7a-438f-41cd-a6a0-fdb09efc8891/v2.0/.well-known/openid-configuration
, l’baseUrl
est :https://login.microsoftonline.com/53279d7a-438f-41cd-a6a0-fdb09efc8891
.
Vue d’ensemble des fichiers de configuration overview-of-the-configuration-files
Vous trouverez ci-dessous une liste des fichiers qui doivent être configurés :
- Connexion OIDC : elle sera utilisée par le
OidcAuthenticationHandler
pour authentifier les utilisateurs ou utilisatrices, ou par d'autres composants pour autoriser l’accès aux ressources protégées par l’IdP à l’aide d’OAuth. - Gestionnaire d’authentification OIDC : il s’agit du gestionnaire d’authentification utilisé pour authentifier les utilisateurs et utilisatrices qui accèdent aux chemins configurés.
- UserInfoProcessor : ce composant traite les informations reçues par l’IdP. Il peut être étendu par les clientes et clients pour implémenter une logique personnalisée.
- Gestionnaire de synchronisation par défaut : ce composant crée l’utilisateur ou l’utilisatrice dans le référentiel.
- ExternalLoginModule : ce composant authentifie l’utilisateur ou l’utilisatrice dans le référentiel oak local.
Le diagramme suivant montre la façon dont les éléments de configuration mentionnés sont liés. Notez que puisqu’il s’agit de composants ServiceFactory
, l’~uniqueid
peut être n’importe quelle chaîne unique aléatoire :
Configurer la connexion OIDC configure-the-oidc-connection
Tout d’abord, nous devons configurer la connexion OIDC. Il est possible de configurer plusieurs connexions OIDC. Chacune doit avoir un nom différent.
-
Créez un fichier
.cfg.json
qui hébergera la configuration. Par exemple, vous pouvez utiliserorg.apache.sling.auth.oauth_client.impl.OidcConnectionImpl~azure.cfg.json
- le suffixe azure doit être un identifiant unique pour la connexion. -
Suivez le format de configuration de l’exemple ci-dessous :
code language-none { "name":"azure", "scopes":[ "openid" ], "baseUrl":"<https://login.microsoftonline.com/53279d7a-438f-41cd-a6a0-fdb09efc8891/v2.0>", "clientId":"5199fc45-8000-473e-ac63-989f1a78759f", "clientSecret":"xxxxxx" }
-
Configurez ses propriétés comme suit :
- Le « nom » peut être défini par l’utilisateur ou l’utilisatrice.
baseUrl
,clientid
etclientSecret
sont des valeurs de configuration qui proviennent de l’IdP.- Les étendues doivent contenir au moins la valeur
openid
.
Configurer le gestionnaire d’authentification OIDC configure-oidc-authentication-handler
Configurez maintenant le gestionnaire d’authentification OIDC. Il est possible de configurer plusieurs connexions OIDC. Chacune doit avoir un nom différent. Si elles partagent le même fournisseur d’identité externe OAK, elles peuvent partager des utilisateurs et des utilisatrices.
-
Créez le fichier de configuration. Pour cet exemple, nous utiliserons
org.apache.sling.auth.oauth_client.impl.OidcConnectionImpl~azure.cfg.json
. Le suffixeazure
doit être un identifiant unique. Consultez un exemple du fichier de configuration ci-dessous :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" }
-
Configurez ensuite ses propriétés comme suit :
path
: chemin d’accès à protégercallbackUri
: vers le chemin d’accès à protéger, en ajoutant le suffixe :/j_security_check
defaultConnectionName
: configurez avec le nom défini pour la connexion OIDC à l’étape précédente.pkceEnabled
:true
clé de vérification pour l’échange de code (PKCE) sur le flux de code d’autorisationidp
: nom du fournisseur d’identité externe OAK. Notez qu’un fournisseur d’identité OAK différent ne peut pas partager d’utilisateurs, d’utilisatrices ou de groupes.
Configurer SlingUserInfoProcessor
-
Créez le fichier de configuration. Pour cet exemple, nous utiliserons
org.apache.sling.auth.oauth_client.impl.SlingUserInfoProcessor~azure.cfg.json
. Le suffixeazure
doit être un identifiant unique. Consultez un exemple du fichier de configuration ci-dessous :code language-none { "groupsInIdToken":true, "groupsClaimName": "groups", "connection":"azure", "storeAccessToken": false, "storeRefreshToken": false }
-
Configurez ensuite ses propriétés comme suit :
groupsInIdToken
: défini sur true si les groupes sont envoyés dans le jeton d’ID. Si la valeur est false ou n’est pas spécifiée, les groupes sont lus à partir du point d’entrée UserInfo.groupsClaimName
: le nom de la réclamation contient les groupes à synchroniser dans AEM.connection
: configurez avec le nom défini pour la connexion OIDC à l’étape précédente.storeAccessToken
: true si le jeton d’accès doit être stocké dans le référentiel. Par défaut, cette valeur est définie sur false. Définissez-la sur true uniquement si AEM doit accéder aux ressources pour le compte de l’utilisateur ou l’utilisatrice stocké dans des serveurs externes protégés par le même IdP.storeRefreshToken
: true si le jeton d’actualisation doit être stocké dans le référentiel. Par défaut, cette valeur est définie sur false. Définissez-le sur true uniquement si AEM doit accéder aux ressources pour le compte de l’utilisateur ou l’utilisatrice stocké sur des serveurs externes protégés par le même IdP et doit actualiser le jeton à partir de l’IdP.
Notez que le jeton d’accès et le jeton d’actualisation sont stockés chiffrés avec la clé principale AEM.
Configurer le gestionnaire de synchronisation configure-the-synchronization-handler
Au moins un gestionnaire de synchronisation doit être configuré pour synchroniser les utilisateurs et utilisatrices authentifiés dans Oak. Pour plus d’informations, consultez cette page.
Créez un fichier nommé org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~azure.cfg.json
. Le suffixe azure doit être un identifiant unique. Pour plus d’informations sur la configuration de ses propriétés, consultez la documentation sur la synchronisation des utilisateurs et utilisatrices et des groupes Oak. Vous trouverez un exemple de configuration ci-dessous :
{
"user.expirationTime":"300s",
"user.membershipExpTime":"300s",
"user.propertyMapping":[
"profile/familyName=profile/familyName",
"profile/givenName=profile/givenName",
"rep:fullname=cn",
"profile/email=profile/email",
"oauth-tokens"
],
"user.pathPrefix":"azure",
"handler.name":"azure"
}
Vous trouverez ci-dessous certains des attributs les plus pertinents à configurer dans DefaultSyncHandler. Notez que l’appartenance à un groupe dynamique doit toujours être activée dans les services cloud.
user.expirationTime
user.membershipExpTime
user.dynamicMembership
user.enforceDynamicMembership
group.dynamicGroups
UserInfoProcessor
synchronise uniquement quelques propriétés. Elle peut être modifiée et personnalisée.« 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.membershipNestingDepth
Configurer le module de connexion externe configure-the-external-login-module
Enfin, vous devez configurer le module de connexion externe.
-
Créez un fichier nommé
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModuleFactory~azure.cfg.json
. Découvrez un exemple de configuration ci-dessous :code language-none { "sync.handlerName":"azure", "idp.name":"azure-idp" }
-
Configurez ses propriétés comme suit :
sync.handlerName
: nom du gestionnaire de synchronisation défini précédemmentidp.name
: fournisseur d’identité OAK défini dans le gestionnaire d’authentification OIDC
Facultatif : implémentation d’un UserInfoProcessor personnalisé implement-a-custom-userinfoprocessor
L’utilisateur ou l’utilisatrice est authentifié par un jeton d’ID et des attributs supplémentaires sont récupérés dans le point d’entrée userInfo
défini pour l’IdP. Si d’autres opérations non standard doivent être effectuées, une implémentation personnalisée du UserInfoProcessor est l’implémentation par défaut provenant de Sling.
Exemple : configuration de l’authentification OIDC avec Azure Active Directory
Configurer une nouvelle application dans Azure Active Directory configure-a-new-application-in-azure-ad
-
Créez une application dans Azure Active Directory en vous reportant à la documentation Azure Active Directory. Consultez ci-dessous l’écran montrant à quoi doit ressembler la vue d’ensemble de l’application :
-
Si des rôles de groupe ou d’application sont requis, reportez-vous à la documentation pour les activer pour l’application et les envoyer dans le jeton d’ID. Voici un exemple de groupes configurés :
-
Suivez les étapes décrites précédemment pour créer les fichiers de configuration requis. Voici un exemple spécifique à Azure AD dans lequel :
- Nous définissons le nom de la connexion OIDC, du gestionnaire d’authentification et de DefaultSyncHandler comme suit :
azure
- L’URL du site web est :
www.mywebsite.com
- Nous protégeons le chemin
/content/wknd/us/en/adventures
. - Le client ou la cliente est :
tennat-id
, - L’ID de client ou cliente est :
client-id
, - Le secret est :
secret
, - Les groupes sont envoyés dans le jeton d’ID dans une réclamation appelée :
groups
.
- Nous définissons le nom de la connexion OIDC, du gestionnaire d’authentification et de DefaultSyncHandler comme suit :
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":"1s",
"user.membershipExpTime":"1s",
"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.auth.oauth_client.impl.SlingUserInfoProcessorImpl~azure.cfg.json
{
"groupsInIdToken": "true",
"storeAccessToken": "false",
"storeRefreshToken": "false",
"connection": "azure",
"groupsClaimName": "groups"
}
Informations supplémentaires sur les groupes Azure AD additional-information-about-azure-ad-groups
Afin de configurer un groupe pour l’application d’entreprise dans le portail Microsoft Azure, vous devez rechercher l’application dans Applications d’entreprise et ajouter les groupes : .
Pour activer la revendication de groupe dans le jeton d’ID, ajoutez-la dans la section Configuration du jeton du portail Microsoft Azure : .
La configuration de SlingUserInfoProcessor
doit être modifiée comme dans l’exemple ci-dessous.
Le nom de fichier qui doit être modifié est org.apache.sling.auth.oauth_client.impl.SlingUserInfoProcessorImpl.cfg.json
. Le contenu doit être configuré comme suit :
{
"connection": "azure",
"groupsInIdToken": "true",
"storeAccessToken": "false",
"storeRefreshToken": "false"
}