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 :

  1. Chemins d’accès au contenu à protéger dans le référentiel AEM.
  2. Identifiant de l’IdP à configurer. Il peut s’agir de n’importe quelle chaîne.

Informations provenant de la configuration d’IdP :

  1. ID client configuré dans l’IdP.
  2. 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
  3. Étendues configurées sur l’IdP. Il est nécessaire de fournir au moins l’étendue openid.
  4. Indique si PKCE est activé ou non sur l’IdP.
  5. 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
  6. 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 :

  1. 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.
  2. 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.
  3. 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.
  4. Gestionnaire de synchronisation par défaut  : ce composant crée l’utilisateur ou l’utilisatrice dans le référentiel.
  5. 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 :

Diagramme de configuration OIDC

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.

  1. Créez un fichier .cfg.json qui hébergera la configuration. Par exemple, vous pouvez utiliser org.apache.sling.auth.oauth_client.impl.OidcConnectionImpl~azure.cfg.json - le suffixe azure doit être un identifiant unique pour la connexion.

  2. 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"
    }
    
  3. Configurez ses propriétés comme suit :

    • Le « nom » peut être défini par l’utilisateur ou l’utilisatrice.
    • baseUrl, clientid et clientSecret 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.

  1. Créez le fichier de configuration. Pour cet exemple, nous utiliserons org.apache.sling.auth.oauth_client.impl.OidcConnectionImpl~azure.cfg.json. Le suffixe azure 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"
    }
    
  2. Configurez ensuite ses propriétés comme suit :

    • path : chemin d’accès à protéger
    • callbackUri : 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’autorisation
    • idp : 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

  1. Créez le fichier de configuration. Pour cet exemple, nous utiliserons org.apache.sling.auth.oauth_client.impl.SlingUserInfoProcessor~azure.cfg.json. Le suffixe azure 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
    }
    
  2. 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.

Nom de la propriété
Remarques
Valeur suggérée
user.expirationTime
Durée jusqu’à ce que la synchronisation d’une personne expire. Les utilisateurs et utilisatrices ne sont synchronisés qu’après l’heure d’expiration.
1h
user.membershipExpTime
Durée jusqu’à ce que l’abonnement d’une personne synchronisée expire. Les abonnements des utilisateurs et utilisatrices ne sont synchronisés qu’après l’heure d’expiration.
1h
user.dynamicMembership
Nous vous recommandons d’activer l’appartenance dynamique à un groupe.
true
user.enforceDynamicMembership
Nous vous recommandons d’activer l’application de l’appartenance dynamique à un groupe.
true
group.dynamicGroups
Nous vous recommandons d’activer les groupes dynamiques.
true
user.propertyMapping
L’implémentation fournie pour 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
Renvoie la profondeur maximale de l’imbrication de groupes lorsque les relations d’appartenance sont synchronisées. Une valeur égale à 0 désactive la recherche de l’appartenance à un groupe. Une valeur égale à 1 ajoute uniquement les groupes directs d’un utilisateur. Cette valeur n’a aucun effet sur la synchronisation de groupes individuels, mais uniquement sur la synchronisation d’une ascendance d’abonnement d’utilisateurs et d’utilisatrices.
1

Configurer le module de connexion externe configure-the-external-login-module

Enfin, vous devez configurer le module de connexion externe.

  1. 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"
    }
    
  2. Configurez ses propriétés comme suit :

    • sync.handlerName : nom du gestionnaire de synchronisation défini précédemment
    • idp.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

  1. 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 :

    Vue d’ensemble de l’application

  2. 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 :

ID de jeton de réclamation OIDC

  1. 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.

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 : .

Ajout de groupe OIDC

Pour activer la revendication de groupe dans le jeton d’ID, ajoutez-la dans la section Configuration du jeton du portail Microsoft Azure : .

ID du jeton de réclamation OIDC

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"
}
recommendation-more-help
fbcff2a9-b6fe-4574-b04a-21e75df764ab