ID Connect-ondersteuning voor AEM as a Cloud Service openen op publicatieniveau open-id-connect-support-for-aem-as-a-cloud-service-on-publish-tier
Inleiding introduction
Naarmate organisaties hun digitale ervaringen moderniseren, wordt een veilig en schaalbaar identiteitsbeheer een fundamentele vereiste. Adobe Experience Manager (AEM) Cloud Service biedt nu ondersteuning voor OpenID Connect (OIDC) op de publicatielaag, zodat naadloze en op standaarden gebaseerde integratie met toonaangevende identiteitsproviders (IdPs) mogelijk is, zoals EnterpriseID (Azure AD), Google, Okta, Auth0, Ping Identity, ForgeRock en OIDC ondersteunde IDP’s.
OIDC is een identiteitslaag bovenop het protocol OAuth 2.0 dat robuuste gebruikersauthentificatie terwijl het handhaven van eenvoud voor ontwikkelaars toelaat. Het wordt wijd goedgekeurd voor zaken-aan-consument (B2C), Intranet, en partnerportalscenario’s, waar veilige gebruikerslogin en identiteitsfederaties worden vereist.
Tot nu toe waren AEM-klanten verantwoordelijk voor het implementeren van hun eigen aangepaste aanmeldingslogica op de publicatielaag, die de ontwikkelingstijd verlengde en langdurige onderhouds- en beveiligingsproblemen introduceerde. Met native ondersteuning voor OIDC verwijdert AEM Cloud Service deze last door een veilig, uitbreidbaar en door Adobe ondersteund verificatiemechanisme te bieden voor eindgebruikers die toegang willen tot publicatieomgevingen.
Of u nu een gepersonaliseerde consumentenwebsite of een geverifieerd intern portaal levert, OIDC on Publish vereenvoudigt identiteitsfederatie en vermindert risico door gecentraliseerd identiteitsbeheer. Het helpt organisaties ook om aan moderne naleving en veiligheidsnormen te voldoen zonder behendigheid te offeren.
AEM voor OIDC-verificatie configureren configure-aem-oidc-authentication
Vereisten prerequisits
We gaan ervan uit dat de volgende informatie beschikbaar of gedefinieerd is:
- De paden van de inhoud die in de AEM-opslagplaats moet worden beveiligd
- Een herkenningsteken voor IdP dat moet worden gevormd. Dit kan elke tekenreeks zijn
Informatie van de Configuratie IdP:
- Clientid die in IdP wordt gevormd
- Het geheim van de Cliënt dat in Idp wordt gevormd. Als PKCE op Idp werd gevormd, is het Geheim van de Cliënt niet beschikbaar. Sla de waarde voor onbewerkte tekst niet op in het configuratiebestand. Een CM-geheim gebruiken en ernaar verwijzen
- Het werkingsgebied dat op Idp wordt gevormd. Minstens het bereik
openidmoet worden opgegeven - Of PKCE op IdP wordt toegelaten
callbackUrlwordt gedefinieerd met behulp van een van de geconfigureerde paden die zijn gedefinieerd in punt 1 en waarbij het achtervoegsel wordt toegevoegd:/j_security_check- De
baseUrlvoor toegang tot het standaard.well-known-bestand. Als de bekende URL bijvoorbeeld:https://login.microsoftonline.com/53279d7a-438f-41cd-a6a0-fdb09efc8891/v2.0/.well-known/openid-configurationdebaseUrlis:https://login.microsoftonline.com/53279d7a-438f-41cd-a6a0-fdb09efc8891
Overzicht van de configuratiebestanden overview-of-the-configuration-files
Zoek onder een lijst met bestanden die moeten worden geconfigureerd:
- OIDC Verbinding: dit zal door
OidcAuthenticationHandlerworden gebruikt om de gebruikers voor authentiek te verklaren, of door andere componenten om toegang tot middelen toe te staan die door IdP worden beschermd gebruikend OAuth - OIDC de Handler van de Authentificatie: Dit is de authentificatiemanager wordt gebruikt om gebruikers voor authentiek te verklaren die toegang tot de gevormde wegen
- UserInfoProcessor: Deze component verwerkt de informatie die door IdP wordt ontvangen. Het kan door klanten worden uitgebreid om douanelogica uit te voeren
- StandaardHandler van de Synchronisatie : Deze component leidt tot de gebruiker in de bewaarplaats
- ExternalLoginModule : Deze component verklaart de gebruiker in de lokale eik bewaarplaats voor authentiek.
Het volgende diagram toont hoe de vermelde configuratieelementen verbonden zijn. Aangezien dit ServiceFactory -componenten zijn, kan ~uniqueid elke willekeurige unieke tekenreeks zijn:
De OIDC-verbinding configureren configure-the-oidc-connection
Eerst, moeten wij de verbinding vormen OIDC. De veelvoudige verbindingen OIDC kunnen worden gevormd, en elk moet een verschillende naam hebben.
-
Maak een nieuw
.cfg.json-bestand waarin de configuratie wordt opgeslagen. Bijvoorbeeld, kunt u gebruikenorg.apache.sling.auth.oauth_client.impl.OidcConnectionImpl~azure.cfg.json- het azure achtervoegsel moet een uniek herkenningsteken voor de verbinding zijn -
Volg de configuratie-indeling in het onderstaande voorbeeld:
code language-none { "name":"azure", "scopes":[ "openid" ], "baseUrl":"<https://login.microsoftonline.com/tenant-id/v2.0>", "clientId":"client-id-from-idp", "clientSecret":"xxxxxx" }
In sommige omgevingen is het mogelijk dat de identiteitsprovider (IdP) geen geldig .well-known eindpunt weergeeft.
Wanneer dit voorkomt, kunnen de vereiste eindpunten manueel worden bepaald door de volgende eigenschappen in het configuratiedossier te specificeren.
In deze configuratiemodus mag de eigenschap baseUrl niet worden ingesteld.
"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"
-
Configureer de eigenschappen als volgt:
- “naam” kan door de gebruiker worden bepaald
baseUrl,clientidenclientSecretzijn configuratiewaarden die afkomstig zijn van de IdP.- Het bereik moet ten minste de waarde
openidbevatten.
OIDC-verificatiehandler configureren configure-oidc-authentication-handler
Nu, vorm de OIDC authentificatiemanager. Er kunnen meerdere OIDC-verbindingen worden geconfigureerd. Elke naam moet een andere naam hebben. Als zij de zelfde Externe Leverancier van de Identiteit van OAK delen, kunnen zij gebruikers delen.
-
Maak het configuratiebestand. Voor dit voorbeeld gebruiken we
org.apache.sling.auth.oauth_client.impl.OidcAuthenticationHandler~azure.cfg.json. Het achtervoegselazuremoet een unieke id zijn. Zie een voorbeeld van het configuratiedossier hieronder: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" } -
Configureer vervolgens de eigenschappen als volgt:
path: het pad dat moet worden beveiligdcallbackUri: het pad dat moet worden beveiligd, waarbij het achtervoegsel/j_security_checkwordt toegevoegd. Dat zelfde callbackUri ook in verre IdP als redirect url moet worden gevormd.defaultConnectionName: configureren met dezelfde naam die is gedefinieerd voor de OIDC-verbinding in de vorige stap+pkceEnabled:trueProefsleutel voor Codeuitwisseling (PKCE) op de stroom van de machtigingscodeidp: de naam van de Externe Leverancier van de Identiteit van OAK . Houd er rekening mee dat verschillende OAK IDP geen gebruikers of groepen kan delen
SlingUserInfoProcessor configureren configure-slinguserinfoprocessor
-
Maak het configuratiebestand. Voor dit voorbeeld gebruiken we
org.apache.sling.auth.oauth_client.impl.SlingUserInfoProcessorImpl~azure.cfg.json. Het achtervoegselazuremoet een unieke id zijn. Zie een voorbeeld van het configuratiedossier hieronder:code language-none { "groupsInIdToken":true, "groupsClaimName": "groups", "connection":"azure", "storeAccessToken": false, "storeRefreshToken": false, "idpNameInPrincipals": true } -
Configureer vervolgens de eigenschappen als volgt:
groupsInIdToken: wordt ingesteld op true als de groepen worden verzonden in een ID-token. Als de waarde vals is, of niet gespecificeerd, worden de groepen gelezen van eindpunt UserInfo.groupsClaimName: De naam van de claim bevat de groepen die in AEM moeten worden gesynchroniseerd.connection: configureren met dezelfde naam die is gedefinieerd voor de OIDC-verbinding in de vorige stapstoreAccessToken: true als het toegangstoken moet worden opgeslagen in de repostory. Standaard is dit onwaar. Plaats het aan waar slechts als AEM tot middelen in naam van de gebruiker moet toegang hebben die in externe servers wordt opgeslagen die door zelfde IdP worden beschermd.storeRefreshToken: true als het token Vernieuwen moet worden opgeslagen in de repostory. Standaard is dit onwaar. Plaats het aan waar slechts als AEM tot middelen in naam van de gebruiker moet toegang hebben die in externe servers wordt opgeslagen die door zelfde IdP worden beschermd en het teken van IdP moet verfrissen.idpNameInPrincipals: wanneer ingesteld op true, wordt de naam van de IdP als achtervoegsel toegevoegd aan de principaal van de gebruiker en groep, gescheiden door een ‘;’. Als de IDP-naam bijvoorbeeldazure-idpis en de gebruikersnaamjohn.doeis, is de principal die in eiken is opgeslagen,john.doe;azure-idp. Dit is nuttig wanneer veelvoudige IdPs in eiken wordt gevormd om conflicten tussen gebruikers of groepen met de zelfde naam te vermijden die uit verschillende IdPs komen. Dit kan ook worden geplaatst om conflicten met gebruikers of groepen te vermijden die door andere authentificatiemanagers zoals Saml worden gecreeerd.
Merk op dat de Token van de Toegang en van het Vernieuwen worden opgeslagen gecodeerd met de hoofdsleutel van AEM.
Synchronisatiehandler configureren configure-the-synchronization-handler
Minstens één manager van de Synchronisatie moet me gevormd om de gebruikers te synchroniseren die in eikel voor authentiek worden verklaard. Voor meer details, zie deze pagina.
Maak een bestand met de naam org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~azure.cfg.json . Het azure achtervoegsel moet een uniek herkenningsteken zijn. Voor meer informatie over hoe te om zijn eigenschappen te vormen, raadpleeg de documentatie van de Synchronisatie van de Gebruiker van Oak en van de Groep . Hieronder vindt u een voorbeeldconfiguratie:
{
"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"
}
Tijdens de ontwikkeling, kunnen de vervaltijden tot een lagere waarde (bijvoorbeeld worden verminderd: 1s) om het testen van gebruiker en groepssynchronisatie in eiken te versnellen.
Onder enkele van de meest relevante kenmerken die in DefaultSyncHandler moeten worden geconfigureerd. Merk op dat het Dynamische Lidmaatschap van de Groep altijd in de Diensten van de Wolk zou moeten worden toegelaten.
user.expirationTimeuser.membershipExpTimeuser.dynamicMembershipuser.enforceDynamicMembershipgroup.dynamicGroupsUserInfoProcessor worden slechts enkele eigenschappen gesynchroniseerd. Deze kan worden gewijzigd en aangepast.“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.membershipNestingDepthDe externe aanmeldingsmodule configureren configure-the-external-login-module
Tot slot moet u de Externe Module van de Aanmelding vormen.
-
Maak een bestand met de naam
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModuleFactory~azure.cfg.json. Zie hieronder een voorbeeldconfiguratie:code language-none { "sync.handlerName":"azure", "idp.name":"azure-idp" } -
Configureer de eigenschappen als volgt:
sync.handlerName: naam van de eerder gedefinieerde synchronisatiehandleridp.name: OAK Identity Provider gedefinieerd in OIDC Authentication Handler
Optioneel: een aangepaste UserInfoProcessor implementeren implement-a-custom-userinfoprocessor
De gebruiker wordt voor authentiek verklaard door een Symbolisch van identiteitskaart, en de extra attributen worden gehaald van het userInfo eindpunt dat voor IdP wordt bepaald. UserInfoProcessor is verantwoordelijk voor het transformeren van de gegevens die zijn ontvangen van het identiteitsbureau naar referenties en kenmerken die AEM kan gebruiken voor gebruikerssynchronisatie.
Wanneer maakt u een aangepaste UserInfoProcessor when-to-create-custom-userinfoprocessor
Het gebrek SlingUserInfoProcessorImpl behandelt standaardOIDC- eisen en groepssynchronisatie. Mogelijk hebt u een aangepaste implementatie nodig als u:
- Aangepaste claims extraheren en verwerken van het token ID of de reactie UserInfo
- Vorderingen transformeren of toewijzen aan verschillende kenmerknamen
- Aangepaste logica implementeren voor groepsextractie uit geneste claims
- Aanvullende gebruikerskenmerken toevoegen die geen deel uitmaken van het standaard OIDC-profiel
- Toegangstokens verwerken of tokens vernieuwen voor specifieke gebruiksgevallen
- Integreren met externe systemen om gebruikersgegevens tijdens verificatie te verrijken
De interface UserInfoProcessor understanding-userinfoprocessor-interface
De interface UserInfoProcessor van het pakket org.apache.sling.auth.oauth_client.spi definieert twee methoden:
public interface UserInfoProcessor {
/**
* Process the UserInfo and token response to create OIDC credentials
*
* @param userInfo - JSON response from the UserInfo endpoint (may be null)
* @param tokenResponse - JSON response from the token endpoint
* @param oidcSubject - The subject claim from the ID token
* @param idp - The configured IDP name
* @return OidcAuthCredentials containing user attributes and group memberships
*/
@NotNull OidcAuthCredentials process(
@Nullable String userInfo,
@NotNull String tokenResponse,
@NotNull String oidcSubject,
@NotNull String idp
);
/**
* @return The name of the OIDC connection this processor is associated with
*/
@NotNull String connection();
}
Met het geretourneerde OidcAuthCredentials -object kunt u:
- Gebruikerskenmerken instellen via
setAttribute(key, value)- deze worden gesynchroniseerd op basis van deDefaultSyncHandler-eigenschapstoewijzingen - Groepslidmaatschappen toevoegen via
addGroup(groupName)- deze groepen worden gemaakt/gesynchroniseerd in AEM
Voorbeeld: Custom UserInfoProcessor-implementatie custom-userinfoprocessor-implementation
Hieronder ziet u een volledig voorbeeld van het implementeren van een aangepaste UserInfoProcessor :
package com.mycompany.aem.auth;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import org.apache.sling.auth.oauth_client.spi.OidcAuthCredentials;
import org.apache.sling.auth.oauth_client.spi.UserInfoProcessor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.Designate;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
/**
* Custom UserInfoProcessor that extracts additional claims from the ID token
* and adds custom user attributes and group memberships.
*/
@Component(service = UserInfoProcessor.class, property = {"service.ranking:Integer=50"})
@Designate(ocd = CustomUserInfoProcessor.Config.class, factory = true)
public class CustomUserInfoProcessor implements UserInfoProcessor {
private static final Logger logger = LoggerFactory.getLogger(CustomUserInfoProcessor.class);
@ObjectClassDefinition(name = "Custom UserInfo Processor")
@interface Config {
@AttributeDefinition(name = "Connection Name", description = "OIDC Connection Name")
String connection();
}
private final String connection;
@Activate
public CustomUserInfoProcessor(Config config) {
this.connection = config.connection();
logger.info("CustomUserInfoProcessor activated for connection: {}", connection);
}
@Override
public @NotNull OidcAuthCredentials process(
@Nullable String userInfo,
@NotNull String tokenResponse,
@NotNull String oidcSubject,
@NotNull String idp) {
// Parse the token response to extract tokens
JsonObject tokenJson = JsonParser.parseString(tokenResponse).getAsJsonObject();
String accessToken = tokenJson.has("access_token") ?
tokenJson.get("access_token").getAsString() : null;
String idToken = tokenJson.has("id_token") ?
tokenJson.get("id_token").getAsString() : null;
logger.debug("Processing authentication for subject: {}", oidcSubject);
// Decode and extract claims from ID Token
JsonObject claims = null;
if (idToken != null) {
claims = decodeJwtPayload(idToken);
logger.debug("Extracted claims from ID token: {}", claims);
}
// Create credentials object
OidcAuthCredentials credentials = new OidcAuthCredentials(oidcSubject, idp);
credentials.setAttribute(".token", "");
// Extract standard profile attributes
if (claims != null) {
// Standard OIDC claims
setAttributeIfPresent(credentials, claims, "given_name", "profile/given_name");
setAttributeIfPresent(credentials, claims, "family_name", "profile/family_name");
setAttributeIfPresent(credentials, claims, "email", "profile/email");
setAttributeIfPresent(credentials, claims, "name", "profile/name");
// Custom claims from your IdP
setAttributeIfPresent(credentials, claims, "department", "profile/department");
setAttributeIfPresent(credentials, claims, "employee_id", "profile/employeeId");
setAttributeIfPresent(credentials, claims, "job_title", "profile/jobTitle");
}
// Extract group memberships from claims
if (claims != null && claims.has("groups")) {
if (claims.get("groups").isJsonArray()) {
claims.get("groups").getAsJsonArray().forEach(group -> {
credentials.addGroup(group.getAsString());
});
}
}
// Optionally store tokens if needed for later API calls
// Note: Only store tokens if your application needs to call external APIs
// on behalf of the user. Tokens are encrypted before storage.
if (accessToken != null) {
credentials.setAttribute("access_token", accessToken);
}
return credentials;
}
@Override
public @NotNull String connection() {
return connection;
}
/**
* Helper method to set attribute if present in claims
*/
private void setAttributeIfPresent(OidcAuthCredentials credentials,
JsonObject claims,
String claimName,
String attributeName) {
if (claims.has(claimName) && !claims.get(claimName).isJsonNull()) {
String value = claims.get(claimName).getAsString();
if (value != null && !value.isEmpty()) {
credentials.setAttribute(attributeName, value);
}
}
}
/**
* Decode JWT payload (middle part) to extract claims
*/
private JsonObject decodeJwtPayload(String jwt) {
try {
String[] parts = jwt.split("\\.");
if (parts.length != 3) {
logger.warn("Invalid JWT format");
return null;
}
// Decode the payload (second part)
String payload = parts[1];
// Add padding if needed
payload = payload + "====".substring(0, (4 - payload.length() % 4) % 4);
// Replace URL-safe characters
payload = payload.replace('-', '+').replace('_', '/');
byte[] decoded = Base64.getDecoder().decode(payload);
String json = new String(decoded, StandardCharsets.UTF_8);
return JsonParser.parseString(json).getAsJsonObject();
} catch (Exception e) {
logger.error("Failed to decode JWT payload", e);
return null;
}
}
}
Configuratie custom-userinfoprocessor-configuration
Maak een configuratiebestand voor uw aangepaste UserInfoProcessor in uw AEM-project onder ui.config/src/main/content/jcr_root/apps/myapp/osgiconfig/config.publish/ :
com.mycompany.aem.auth.CustomUserInfoProcessor~azure.cfg.json
{
"connection": "azure"
}
De configuratie moet overeenkomen met de naam van de verbinding die is gedefinieerd in de OidcConnectionImpl -configuratie. De eigenschap service.ranking in de @Component annotatie (ingesteld op 50 in het voorbeeld) bepaalt de prioriteit of meerdere processors zijn geregistreerd voor dezelfde verbinding. Hogere classificaties hebben voorrang op de standaardwaarde SlingUserInfoProcessorImpl (met een classificatie van 0).
Afhankelijkheden custom-userinfoprocessor-dependencies
Voeg de volgende gebiedsdelen aan uw kernmodule pom.xml toe:
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.auth.oauth-client</artifactId>
<version>0.1.7</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
<scope>provided</scope>
</dependency>
Kenmerken synchroniseren met DefaultSyncHandler synchronizing-custom-attributes
Om ervoor te zorgen dat uw aangepaste kenmerken aan gebruikersknooppunten in het JCR blijven bestaan, werkt u uw DefaultSyncHandler -configuratie bij en voegt u de eigenschappentoewijzingen in:
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~azure.cfg.json
{
"user.expirationTime": "1h",
"user.membershipExpTime": "1h",
"user.propertyMapping": [
"profile/givenName=profile/given_name",
"profile/familyName=profile/family_name",
"rep:fullname=profile/name",
"profile/email=profile/email",
"profile/department=profile/department",
"profile/employeeId=profile/employeeId",
"profile/jobTitle=profile/jobTitle",
"access_token=access_token"
],
"user.pathPrefix": "azure",
"handler.name": "azure"
}
De notatie is jcrPropertyPath=credentialAttributeName . Aan de linkerkant wordt de eigenschap opgeslagen in het gebruikersknooppunt onder /home/users en aan de rechterkant komt de kenmerknaam overeen die u instelt in het UserInfoProcessor using credentials.setAttribute() .
Implementatie en testen custom-userinfoprocessor-deployment
-
bouwt en stelt uw project van AEM op dat de douane
UserInfoProcessorbevat:code language-bash mvn clean install -PautoInstallPackage -
verifieer registratie in de console OSGi bij
/system/console/components:- Zoek naar de aangepaste naam van de processorklasse
- Controleren of de component actief is en of de verbindingsconfiguratie juist is
-
de authentificatiestroom van de Test:
- Toegang tot een beveiligd pad dat is geconfigureerd in uw
OidcAuthenticationHandler - Na succesvolle authentificatie, controleer de gebruikersknoop in CRXDE bij
/home/users/<prefix>/<username> - Controleren of aangepaste kenmerken zijn gesynchroniseerd
- Groepslidmaatschappen controleren onder
/home/groups
- Toegang tot een beveiligd pad dat is geconfigureerd in uw
-
laat zuivert registreren toe om kwesties problemen op te lossen:
code language-none Logger: com.mycompany.aem.auth Log Level: DEBUG
Aanbevolen procedures custom-userinfoprocessor-best-practices
- minimaliseer symbolische opslag: Bewaar slechts toegangstokens of vernieuw tokens als uw toepassing API vraag aan externe diensten namens gebruikers moet maken. Tokens worden gecodeerd, maar er wordt nog steeds overhead aan toegevoegd.
- bevestigt eisen: Controleer altijd als de eisen bestaan en niet ongeldig zijn alvorens hen te verwerken.
- Fout behandeling: De fouten van het logboek geschikt maar verzekeren de authentificatiestroom kan voltooien zelfs als de facultatieve eisen ontbreken.
- Prestaties: Houd verwerkingslogica lichtgewichtaangezien dit op elke authentificatie loopt.
- Veiligheid: Noteer nooit gevoelige informatie zoals volledige tokens of gebruikerswachtwoorden. Gebruik
substring()als logboektokens voor foutopsporing. - het Testen: Test met diverse gebruikersprofielen van uw IdP om ervoor te zorgen alle vraagvariaties correct worden behandeld.
ACL voor externe groepen configureren configure-acl-for-external-groups
Wanneer de gebruikers door OIDC voor authentiek worden verklaard, worden hun groepslidmaatschappen typisch gesynchroniseerd van de externe identiteitsleverancier.
Deze externe groepen worden dynamisch gemaakt in de AEM-opslagplaats, maar worden niet automatisch gekoppeld aan toegangsbeheeritems.
Om ervoor te zorgen dat de gebruikers de aangewezen toestemmingen hebben, moeten de toegangsbeheerlijsten (ACLs) uitdrukkelijk voor deze groepen worden bepaald.
Er zijn twee primaire benaderingen beschikbaar.
Optie 1 — Lokale groepen
De externe groep kan als lid van een lokale groep worden toegevoegd die reeds vereiste ACLs heeft.
- De externe groep moet bestaan in de opslagplaats, die automatisch plaatsvindt wanneer een gebruiker die tot die groep behoort zich voor het eerst aanmeldt.
- Deze optie heeft over het algemeen de voorkeur wanneer Gesloten Gebruikersgroepen (CUGs) in gebruik zijn, aangezien de lokale groep op zowel auteur als publicatiemilieu’s bestaat.
Optie 2 — Directe ACLs op Externe Groepen via RepoInit
ACLs kan rechtstreeks op externe groepen worden toegepast gebruikend manuscripten RepoInit.
-
Deze aanpak is efficiënter en heeft de voorkeur wanneer CUG’s niet worden gebruikt.
-
In het volgende voorbeeld ziet u een RepoInit-configuratie die leesmachtigingen toewijst aan een externe groep. Met de optie
ignoreMissingPrincipalkunt u ACL maken, zelfs als de groep nog niet bestaat in de gegevensopslagruimte: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" ] }
Voorbeeld: OIDC-verificatie configureren met Azure Active Directory
Een nieuwe toepassing configureren in de Active Directory van Azure configure-a-new-application-in-azure-ad
-
Creeer een nieuwe toepassing in de Actieve Folder van Azure door de documentatie van de Folder van Azure Actieve te volgen. Hieronder ziet u hoe het scherm met het toepassingsoverzicht eruit moet zien:
-
Als de Groepen of de toepassingsrollen worden vereist, volg de documentatie om hen voor de toepassing toe te laten en hen in het Symbolische van identiteitskaart te verzenden. Onder een voorbeeld van gevormde groepen:
-
Volg de eerder gedocumenteerde stappen om de vereiste configuratiedossiers tot stand te brengen. Onder een specifiek voorbeeld voor Azure AD waarin:
- De namen Verbinding, Verificatiehandler en DefaultSyncHandler worden gedefinieerd als:
azure - De website-URL is:
www.mywebsite.com - Het pad
/content/wknd/us/en/adventuresdat alleen toegankelijk is voor geverifieerde gebruikers in de groep, wordt beveiligdadventures - Tennant is:
tennat-id, - Client id is:
client-id - Geheim is:
secret, - De groepen worden in het token Id verzonden in een claim die wordt aangeroepen:
groups
- De namen Verbinding, Verificatiehandler en DefaultSyncHandler worden gedefinieerd als:
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"
}
Aanvullende informatie over Azure AD-groepen additional-information-about-azure-ad-groups
Om een groep aan voor de ondernemingstoepassing in Microsoft Azure Portal te vormen, moet u de toepassing zoeken: Toepassingen van de Onderneming en de groepen toevoegen:
Om de groepseis in het Token van identiteitskaart toe te laten, voeg de eis in de Symbolische sectie van de Configuratie van het Portaal van Microsoft Azure toe:
De configuratie van SlingUserInfoProcessor moet worden gewijzigd zoals in het onderstaande voorbeeld.
De bestandsnaam die moet worden gewijzigd, is org.apache.sling.auth.oauth_client.impl.SlingUserInfoProcessorImpl.cfg.json . De inhoud moet als volgt worden geconfigureerd:
{
"connection": "azure",
"groupsInIdToken": "true",
"storeAccessToken": "false",
"storeRefreshToken": "false"
}
Aangepaste omleiding na verificatie custom-redirect-after-authentication
Standaard worden gebruikers na geslaagde OIDC-verificatie weer omgeleid naar de oorspronkelijk aangevraagde URL. U kunt dit gedrag echter aanpassen met de parameter redirect query.
Parameter omleiden gebruiken
Wanneer u verificatie start, kunt u een aangepaste omleidings-URL opgeven door de parameter redirect toe te voegen aan uw verificatieaanvraag:
/content/wknd/us/en/adventures?redirect=/content/wknd/us/en/welcome
In dit voorbeeld wordt de gebruiker, nadat de verificatie is voltooid, omgeleid naar /content/wknd/us/en/welcome in plaats van naar de oorspronkelijk aangevraagde pagina.
Beveiligingsbeperkingen
Om veiligheidsredenen heeft de parameter redirect de volgende beperkingen:
- moet een relatieve weg zijn: Redirect URL moet met
/beginnen (b.v.,/content/mysite/dashboard) - geen dwars-plaats richt: Absolute URLs (b.v.,
https://external-site.com) wordt niet toegestaan - Geen protocol-relatieve URLs: URLs die met
//beginnen wordt verworpen om protocol-relatieve omleidingen te verhinderen
Als een ongeldige omleidings-URL wordt opgegeven, mislukt de verificatie met een fout.
Voorbeelden van gevallen
-
Welkome pagina na login: Richt gebruikers aan een gepersonaliseerde welkomstpagina na hun eerste login opnieuw
code language-none /content/mysite/secure-area?redirect=/content/mysite/welcome -
Dashboard richt opnieuw: Directe gebruikers aan een specifiek dashboard na authentificatie
code language-none /content/mysite/login?redirect=/content/mysite/user/dashboard -
Deep die verbindt: Sta gebruikers toe om voor authentiek te verklaren en dan tot een specifiek middel toegang te hebben
code language-none /content/mysite/protected?redirect=/content/mysite/protected/specific-document
Hoe te van de Handler van de Authentificatie van Saml aan de Handler van de Authentificatie Oidc migreren
Wanneer AEM reeds met een Handler van de Authentificatie van SAML wordt gevormd, en de gebruikers in de bewaarplaats met toegelaten gegevenssynchronisatie aanwezig zijn, kunnen de conflicten tussen de originele gebruikers van SAML en de nieuwe gebruikers OIDC voorkomen.
- Vorm OidcAuthenticationHandler en laat
idpNameInPrincipalsin SlingUserInfoProcessor configuratie toe - Opstelling ACL voor externe groepen .
- Na login van gebruikers, kunnen de oude gebruikers die door de steekproef authentificatiemanager worden gecreeerd worden geschrapt.