SAML 2.0驗證 saml-2-0-authentication

瞭解如何為您選擇的SAML 2.0相容的IDP設定及驗證一般使用者(而非AEM作者)。

AEM as a Cloud Service適用的SAML為何?

SAML 2.0與AEM Publish (或預覽)整合,允許AEM型網頁體驗的一般使用者向非AdobeIDP (身分提供者)進行驗證,並以已命名的授權使用者身分存取AEM。

AEM 作者
AEM 發佈
SAML 2.0支援
瞭解使用AEM的SAML 2.0流程

AEM Publish SAML整合的典型流程如下:

  1. 使用者向AEM Publish提出要求,並指示需要驗證。

    • 使用者請求受CUG/ACL保護的資源。
    • 使用者請求受驗證需求約束的資源。
    • 使用者依循明確要求登入動作的AEM登入端點連結(即/system/sling/login)。
  2. AEM會向IDP發出AuthnRequest,要求IDP啟動驗證程式。

  3. 使用者向IDP進行驗證。

    • IDP會提示使用者輸入認證。
    • 使用者已透過IDP驗證,無需再提供認證。
  4. IDP會產生包含使用者資料的SAML宣告,並使用IDP的私人憑證加以簽署。

  5. IDP會透過HTTPPOST,透過使用者的網頁瀏覽器,將SAML宣告傳送至AEM Publish。

  6. AEM Publish會收到SAML判斷提示,並使用IDP公開憑證驗證SAML判斷提示的完整性和真實性。

  7. AEM Publish會根據SAML 2.0 OSGi設定和SAML宣告的內容來管理AEM使用者記錄。

    • 建立使用者
    • 同步使用者屬性
    • 更新AEM使用者群組成員資格
  8. AEM Publish會在HTTP回應上設定AEM login-token Cookie,以用來向AEM Publish驗證後續請求。

  9. AEM Publish會將使用者重新導向至saml_request_path Cookie所指定的AEM Publish上的URL。

設定逐步說明

本影片逐步解說如何設定SAML 2.0與AEM as a Cloud Service Publish服務整合,以及使用Okta做為IDP。

先決條件

設定SAML 2.0驗證時,需要下列專案:

  • 部署管理員對Cloud Manager的存取權
  • AEM管理員對AEM as a Cloud Service環境的存取權
  • IDP的管理員存取權
  • 選擇性地存取用來加密SAML裝載的公開/私人金鑰組

SAML 2.0僅支援向AEM Publish或預覽驗證使用。 若要使用和IDP管理AEM Author的驗證,請整合IDP與Adobe IMS

在AEM上安裝IDP公開憑證

IDP的公開憑證會新增至AEM的全域信任存放區,並用來驗證IDP傳送的SAML宣告是否有效。

SAML宣告簽署流程

SAML 2.0 - IDP SAML宣告簽署

  1. 使用者向IDP進行驗證。
  2. IDP會產生包含使用者資料的SAML宣告。
  3. IDP會使用IDP的私人憑證來簽署SAML宣告。
  4. IDP會向AEM Publish的SAML端點(.../saml_login)起始使用者端HTTPPOST,其中包含已簽署的SAML宣告。
  5. AEM Publish會收到包含已簽署SAML宣告的HTTPPOST,並使用IDP公開憑證驗證簽名。

將IDP公開憑證新增至全域信任存放區

  1. 從IDP取得​ 公用憑證 ​檔案。 此憑證可讓AEM驗證IDP提供給AEM的SAML判斷提示。

    憑證為PEM格式,應類似於:

    code language-none
    -----BEGIN CERTIFICATE-----
    MIIC4jCBAcoCCQC33wnybT5QZDANBgkqhkiG9w0BAQsFADAyMQswCQYDVQQGEwJV
    ...
    m0eo2USlSRTVl7QHRTuiuSThHpLKQQ==
    -----END CERTIFICATE-----
    
  2. 以AEM管理員身分登入AEM Author。

  3. 瀏覽至​ 工具>安全性>信任存放區

  4. 建立或開啟全域信任存放區。 如果建立全域信任存放區,請將密碼存放於安全的地方。

  5. 展開​ 從CER檔案 ​新增憑證。

  6. 選取​ 選取憑證檔案,然後上傳IDP提供的憑證檔案。

  7. 保留​ 將憑證對應到使用者 ​空白。

  8. 選取​ 提交

  9. 新增的憑證出現在​ 從CRT檔案 ​新增憑證區段上方。

  10. 記下​ 別名,因為此值用於SAML 2.0驗證處理常式OSGi設定

  11. 選取「儲存並關閉」。

全域信任存放區在AEM Author上設定了IDP的公開憑證,但由於SAML僅用於AEM Publish,因此必須將全域信任存放區復寫到AEM Publish,才能在那裡存取IDP公開憑證。

將全域信任存放區復寫到AEM Publish

  1. 瀏覽至​ 工具>部署>封裝

  2. 建立套件

    • 封裝名稱: Global Trust Store
    • 版本: 1.0.0
    • 群組: com.your.company
  3. 編輯新的​ 全域信任存放區 ​封裝。

  4. 選取​ 篩選器 ​索引標籤,並為根路徑/etc/truststore新增篩選器。

  5. 選取​ 完成,然後選取​ 儲存

  6. 選取​ 全域信任存放區 ​封裝的​ 建置 ​按鈕。

  7. 建置後,選取​ 更多 > 復寫 ​以啟動全域信任存放區節點(/etc/truststore)至AEM Publish。

建立驗證服務金鑰存放區 authentication-service-keystore

SAML 2.0驗證處理常式OSGi組態屬性handleLogout設定為true或需要AuthnRequest簽署/SAML宣告加密時,需要建立驗證服務的金鑰存放區

  1. 以AEM管理員身分登入AEM Author,以上傳私密金鑰。

  2. 導覽至​ 工具>安全性>使用者,然後選取​ 驗證服務 ​使用者,並從頂端動作列選取​ 屬性

  3. 選取​ 金鑰存放區 ​索引標籤。

  4. 建立或開啟金鑰存放區。 如果建立金鑰存放區,請妥善儲存密碼。

  5. 選取「儲存並關閉」。

  6. 建立包含已更新​ authentication-service ​使用者的封裝。

    使用套件使用以下暫時因應措施:

    1. 瀏覽至​ 工具>部署>封裝

    2. 建立套件

      • 封裝名稱: Authentication Service
      • 版本: 1.0.0
      • 群組: com.your.company
    3. 編輯新的​ 驗證服務金鑰存放區 ​封裝。

    4. 選取​ 篩選器 ​索引標籤,並為根路徑/home/users/system/cq:services/internal/security/<AUTHENTICATION SERVICE UUID>/keystore新增篩選器。

      • 瀏覽至​ 工具>安全性>使用者,並選取​ 驗證服務 ​使用者,即可找到<AUTHENTICATION SERVICE UUID>。 UUID是URL的最後一部分。
    5. 選取​ 完成,然後選取​ 儲存

    6. 選取​ Authentication Service Key Store ​封裝的​ 建置 ​按鈕。

    7. 建置後,選取​ 更多 > 復寫 ​以啟用AEM Publish的驗證服務金鑰存放區。

安裝AEM公開/私密金鑰組 install-aem-public-private-key-pair

安裝AEM公開/私密金鑰組為選用

AEM Publish可設定為簽署AuthnRequests (to IDP)及加密SAML宣告(to AEM)。 這是透過提供私密金鑰給AEM Publish以及比對公開金鑰給IDP來達成。

瞭解AuthnRequest簽署流程(選用)

AEM Publish可簽署AuthnRequest (起始登入程式的AEM Publish對IDP發出的請求)。 為此,AEM Publish使用私密金鑰對AuthnRequest進行簽名,讓IDP接著使用公開金鑰來驗證簽名。 這可向IDP保證AuthnRequest是由AEM Publish發起和要求的,而不是惡意的第三方。

SAML 2.0 - SP AuthnRequest簽署

  1. 使用者向AEM Publish發出HTTP請求,這會導致向IDP發出SAML驗證請求。
  2. AEM Publish會產生要傳送給IDP的SAML請求。
  3. AEM Publish使用AEM私密金鑰簽署SAML請求。
  4. AEM Publish會起始AuthnRequest,此HTTP使用者端重新導向至包含已簽署SAML請求的IDP。
  5. IDP會收到AuthnRequest,並使用AEM的公開金鑰來驗證簽名,保證AEM Publish起始AuthnRequest。
  6. AEM Publish接著使用IDP公開憑證來驗證解密的SAML宣告的完整性和真實性。
瞭解SAML宣告加密流程(選擇性)

IDP與AEM Publish之間的所有HTTP通訊都應透過HTTPS,因此預設情況下是安全的。 不過,如有需要,SAML宣告可以加密,以備在HTTPS提供之保密性以外需要額外機密性的情況。 為此,IDP會使用私密金鑰加密SAML宣告資料,而AEM Publish會使用私密金鑰解密SAML宣告。

SAML 2.0 - SP SAML宣告加密

  1. 使用者向IDP進行驗證。
  2. IDP會產生包含使用者資料的SAML宣告,並使用IDP的私人憑證加以簽署。
  3. 然後IDP使用AEM的公開金鑰加密SAML宣告,這需要AEM私密金鑰來解密。
  4. 加密的SAML宣告會透過使用者的網頁瀏覽器傳送至AEM Publish。
  5. AEM Publish會收到SAML宣告,並使用AEM私密金鑰將其解密。
  6. IDP會提示使用者進行驗證。

AuthnRequest簽署和SAML宣告加密都是選用專案,但是兩者都是使用SAML 2.0驗證處理常式OSGi組態屬性useEncryption啟用的,這表示兩者都無法使用或都不使用。

AEM驗證服務金鑰存放區

  1. 取得用來簽署AuthnRequest以及加密SAML宣告的公開金鑰、私密金鑰(DER格式為PKCS#8)及憑證鏈結檔案(這有可能是公開金鑰)。 這些金鑰通常由IT組織的安全團隊提供。

    • 可使用​ openssl ​產生自我簽署金鑰組:
    code language-none
    $ openssl req -x509 -sha256 -days 365 -newkey rsa:4096 -keyout aem-private.key -out aem-public.crt
    
    # Provide a password (keep in safe place), and other requested certificate information
    
    # Convert the keys to AEM's required format
    $ openssl rsa -in aem-private.key -outform der -out aem-private.der
    $ openssl pkcs8 -topk8 -inform der -nocrypt -in aem-private.der -outform der -out aem-private-pkcs8.der
    
  2. 將公開金鑰上傳至IDP。

    • 使用上述openssl方法,公開金鑰是aem-public.crt檔案。
  3. 以AEM管理員身分登入AEM Author,以上傳私密金鑰。

  4. 瀏覽至​ 工具>安全性>信任存放區,然後選取​ 驗證服務 ​使用者,並從最上方的動作列選取​ 內容

  5. 導覽至​ 工具>安全性>使用者,然後選取​ 驗證服務 ​使用者,並從頂端動作列選取​ 屬性

  6. 選取​ 金鑰存放區 ​索引標籤。

  7. 建立或開啟金鑰存放區。 如果建立金鑰存放區,請妥善儲存密碼。

  8. 選取​ 從DER檔案新增私密金鑰,並將私密金鑰和鏈結檔案新增至AEM:

    • 別名:提供有意義的名稱,通常是IDP的名稱。
    • 私密金鑰檔案:上傳私密金鑰檔案(DER格式為PKCS#8)。
      • 使用上述openssl方法,這是aem-private-pkcs8.der檔案
    • 選取憑證鏈結檔案:上傳隨附的鏈結檔案(可能是公開金鑰)。
      • 使用上述openssl方法,這是aem-public.crt檔案
    • 選取​ 提交
  9. 新增的憑證出現在​ 從CRT檔案 ​新增憑證區段上方。

  10. 選取「儲存並關閉」。

  11. 建立包含已更新​ authentication-service ​使用者的封裝。

    使用套件使用以下暫時因應措施:

    1. 瀏覽至​ 工具>部署>封裝

    2. 建立套件

      • 封裝名稱: Authentication Service
      • 版本: 1.0.0
      • 群組: com.your.company
    3. 編輯新的​ 驗證服務金鑰存放區 ​封裝。

    4. 選取​ 篩選器 ​索引標籤,並為根路徑/home/users/system/cq:services/internal/security/<AUTHENTICATION SERVICE UUID>/keystore新增篩選器。

      • 瀏覽至​ 工具>安全性>使用者,並選取​ 驗證服務 ​使用者,即可找到<AUTHENTICATION SERVICE UUID>。 UUID是URL的最後一部分。
    5. 選取​ 完成,然後選取​ 儲存

    6. 選取​ Authentication Service Key Store ​封裝的​ 建置 ​按鈕。

    7. 建置後,選取​ 更多 > 復寫 ​以啟用AEM Publish的驗證服務金鑰存放區。

設定SAML 2.0驗證處理常式 configure-saml-2-0-authentication-handler

AEM SAML設定是透過​ AdobeGranite SAML 2.0驗證處理常式 OSGi設定來執行。
此設定是OSGi工廠設定,表示單一AEM as a Cloud Service Publish服務可能有多個SAML設定,涵蓋存放庫的分散資源樹狀結構;這對於多網站AEM部署很有用。

SAML 2.0驗證處理常式OSGi設定字彙表

AdobeGranite SAML 2.0驗證處理常式OSGi設定 configure-saml-2-0-authentication-handler-osgi-configuration

table 0-row-6 1-row-6 2-row-6 3-row-6 4-row-6 5-row-6 6-row-6 7-row-6 8-row-6 9-row-6 10-row-6 11-row-6 12-row-6 13-row-6 14-row-6 15-row-6 16-row-6 17-row-6 18-row-6 19-row-6 20-row-6 21-row-6 22-row-6 23-row-6 24-row-6 25-row-6 26-row-6 27-row-6 3-align-center 4-align-center 10-align-center 11-align-center 17-align-center 18-align-center 24-align-center 25-align-center 31-align-center 32-align-center 38-align-center 39-align-center 45-align-center 46-align-center 52-align-center 53-align-center 59-align-center 60-align-center 66-align-center 67-align-center 73-align-center 74-align-center 80-align-center 81-align-center 87-align-center 88-align-center 94-align-center 95-align-center 101-align-center 102-align-center 108-align-center 109-align-center 115-align-center 116-align-center 122-align-center 123-align-center 129-align-center 130-align-center 136-align-center 137-align-center 143-align-center 144-align-center 150-align-center 151-align-center 157-align-center 158-align-center 164-align-center 165-align-center 171-align-center 172-align-center 178-align-center 179-align-center 185-align-center 186-align-center 192-align-center 193-align-center
OSGi屬性 必填 值格式 預設值 說明
路徑 path 字串陣列 / 此驗證處理常式使用的AEM路徑。
IDP URL idpUrl 字串 IDP URL:傳送SAML驗證請求。
IDP憑證別名 idpCertAlias 字串 在AEM全域信任存放區中找到的IDP憑證別名
IDP HTTP重新導向 idpHttpRedirect 布林值 false 指出是否有HTTP重新導向至IDP URL,而非傳送AuthnRequest。 針對IDP啟動的驗證設定為true
IDP識別碼 idpIdentifier 字串 唯一IDP ID可確保AEM使用者和群組的唯一性。 如果空白,則改用serviceProviderEntityId
判斷提示消費者服務URL assertionConsumerServiceURL 字串 AuthnRequest中的AssertionConsumerServiceURL URL屬性,指定必須將<Response>訊息傳送至AEM的位置。
SP實體ID serviceProviderEntityId 字串 向IDP唯一識別AEM;通常是AEM主機名稱。
SP加密 useEncryption 布林值 true 指示IDP是否加密SAML宣告。 需要設定spPrivateKeyAliaskeyStorePassword
SP私密金鑰別名 spPrivateKeyAlias 字串 authentication-service使用者金鑰庫中私密金鑰的別名。 如果useEncryption設定為true則為必要。
SP金鑰庫密碼 keyStorePassword 字串 'authentication-service'使用者金鑰存放區的密碼。 如果useEncryption設定為true則為必要。
預設重新導向 defaultRedirectUrl 字串 / 成功驗證後的預設重新導向URL。 可以是AEM主機的相對值(例如,/content/wknd/us/en/html)。
使用者ID屬性 userIDAttribute 字串 uid 包含AEM使用者之使用者ID的SAML宣告屬性名稱。 留空將使用Subject:NameId
自動建立AEM使用者 createUser 布林值 true 表示是否會在成功驗證時建立AEM使用者。
AEM使用者中間路徑 userIntermediatePath 字串 建立AEM使用者時,此值會作為中繼路徑(例如/home/users/<userIntermediatePath>/jane@wknd.com)。 需要createUser設定為true
AEM使用者屬性 synchronizeAttributes 字串陣列 要儲存在AEM使用者上的SAML屬性對應清單,格式為[ "saml-attribute-name=path/relative/to/user/node" ] (例如[ "firstName=profile/givenName" ])。 檢視原生AEM屬性的完整清單
將使用者新增至AEM群組 addGroupMemberships 布林值 true 表示在成功驗證後,AEM使用者是否自動新增到AEM使用者群組。
AEM群組成員資格屬性 groupMembershipAttribute 字串 groupMembership SAML宣告屬性的名稱,其中包含使用者應新增至的AEM使用者群組清單。 需要addGroupMemberships設定為true
預設AEM群組 defaultGroups 字串陣列 已驗證身分的AEM使用者群組清單一律會新增至(例如,[ "wknd-user" ])。 需要addGroupMemberships設定為true
NameIDPolicy格式 nameIdFormat 字串 urn:oasis:names:tc:SAML:2.0:nameid-format:transient 要在AuthnRequest訊息中傳送的NameIDPolicy格式引數值。
儲存SAML回應 storeSAMLResponse 布林值 false 指示samlResponse值是否儲存在AEM cq:User節點上。
處理登出 handleLogout 布林值 false 指出此SAML驗證處理常式是否處理登出要求。 需要設定logoutUrl
登出URL logoutUrl 字串 IDP的URL,將SAML登出請求傳送至此處。 如果handleLogout設定為true則為必要。
時鐘公差 clockTolerance 整數 60 驗證SAML宣告時,IDP和AEM (SP)時鐘扭曲容許度。
摘要方法 digestMethod 字串 http://www.w3.org/2001/04/xmlenc#sha256 IDP在簽署SAML訊息時使用的摘要演演算法。
簽章方法 signatureMethod 字串 http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 IDP在簽署SAML訊息時使用的簽章演演算法。
身分同步型別 identitySyncType defaultidp default 請勿變更AEM as a Cloud Service的from預設值。
服務排名 service.ranking 整數 5002 相同path偏好較高等級的設定。

AEM使用者屬性 aem-user-attributes

AEM使用以下使用者屬性,這些屬性可透過AdobeGranite SAML 2.0驗證處理常式OSGi設定中的synchronizeAttributes屬性填入。 任何IDP屬性都可以同步至任何AEM使用者屬性,但是對應至AEM使用屬性屬性(如下所列)可讓AEM自然地使用這些屬性。

table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 5-row-2 6-row-2 7-row-2 8-row-2 9-row-2 10-row-2 11-row-2
使用者屬性 來自rep:User節點的相對屬性路徑
標題(例如,Mrs profile/title
名字(即名字) profile/givenName
姓氏 profile/familyName
職稱 profile/jobTitle
電子郵件地址 profile/email
街道地址 profile/street
城市 profile/city
郵遞區號 profile/postalCode
國家/地區 profile/country
電話號碼 profile/phoneNumber
關於我 profile/aboutMe
  1. /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~saml.cfg.json的專案中建立OSGi設定檔,並在IDE中開啟。

    • /wknd-examples/變更為您的/<project name>/
    • 檔案名稱中~之後的識別碼應唯一識別此組態,因此它可能是IDP的名稱,例如...~okta.cfg.json。 值應為英數字元和連字型大小。
  2. 將下列JSON貼到com.adobe.granite.auth.saml.SamlAuthenticationHandler~...cfg.json檔案中,並視需要更新wknd參考。

    code language-json
    {
        "path": [ "/content/wknd", "/content/dam/wknd" ],
        "idpCertAlias": "$[env:SAML_IDP_CERT_ALIAS;default=certalias___1652125559800]",
        "idpIdentifier": "$[env:SAML_IDP_ID;default=http://www.okta.com/exk4z55r44Jz9C6am5d7]",
        "idpUrl": "$[env:SAML_IDP_URL;default=https://dev-5511372.okta.com/app/dev-5511372_aemasacloudservice_1/exk4z55r44Jz9C6am5d7/sso/saml]",
        "serviceProviderEntityId": "$[env:SAML_AEM_ID;default=https://publish-p123-e456.adobeaemcloud.com]",
        "useEncryption": false,
        "createUser": true,
        "userIntermediatePath": "wknd/idp",
        "synchronizeAttributes":[
            "firstName=profile/givenName"
        ],
        "addGroupMemberships": true,
        "defaultGroups": [
            "wknd-users"
        ]
    }
    
  3. 依專案要求更新值。 如需設定屬性說明,請參閱上述​ SAML 2.0驗證處理常式OSGi設定字彙表

  4. 值可能會隨著發行週期不同步變更,或類似環境型別/服務層之間的值不同時,建議使用OSGi環境變數和秘密,但並非必要。 預設值可使用如上所示的$[env:..;default=the-default-value]"語法進行設定。

如果SAML設定在不同環境之間不同,則每個環境(config.publish.devconfig.publish.stageconfig.publish.prod)的OSGi設定可以使用特定屬性來定義。

使用加密

加密AuthnRequest和SAML判斷提示時,需要下列屬性: useEncryptionspPrivateKeyAliaskeyStorePasswordkeyStorePassword包含密碼,因此值不能儲存在OSGi組態檔中,而是使用密碼組態值插入

可選擇更新OSGi設定以使用加密
  1. 在IDE中開啟/ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~saml.cfg.json

  2. 新增三個屬性useEncryptionspPrivateKeyAliaskeyStorePassword,如下所示。

    code language-json
    {
    "path": [ "/content/wknd", "/content/dam/wknd" ],
    "idpCertAlias": "$[env:SAML_IDP_CERT_ALIAS;default=certalias___1234567890]",
    "idpIdentifier": "$[env:SAML_IDP_ID;default=http://www.okta.com/abcdef1235678]",
    "idpUrl": "$[env:SAML_IDP_URL;default=https://dev-5511372.okta.com/app/dev-123567890_aemasacloudservice_1/abcdef1235678/sso/saml]",
    "serviceProviderEntityId": "$[env:SAML_AEM_ID;default=https://publish-p123-e456.adobeaemcloud.com]",
    "useEncryption": true,
    "spPrivateKeyAlias": "$[env:SAML_AEM_KEYSTORE_ALIAS;default=aem-saml-encryption]",
    "keyStorePassword": "$[secret:SAML_AEM_KEYSTORE_PASSWORD]",
    "createUser": true,
    "userIntermediatePath": "wknd/idp"
    "synchronizeAttributes":[
        "firstName=profile/givenName"
    ],
    "addGroupMemberships": true,
    "defaultGroups": [
        "wknd-users"
    ]
    }
    
  3. 加密所需的三個OSGi設定屬性是:

  • useEncryption已設定為true
  • spPrivateKeyAlias包含SAML整合使用之私密金鑰的金鑰庫專案別名。
  • keyStorePassword包含包含authentication-service使用者金鑰儲存區密碼的OSGi密碼設定變數

設定反向連結篩選器

在SAML驗證程式期間,IDP會向AEM Publish的.../saml_login端點起始使用者端HTTPPOST。 如果IDP和AEM Publish存在於不同的來源,則AEM Publish的​ 反向連結篩選器 ​會透過OSGi組態設定為允許來自IDP來源的HTTP POST。

  1. /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/org.apache.sling.security.impl.ReferrerFilter.cfg.json的專案中建立(或編輯) OSGi設定檔。

    • /wknd-examples/變更為您的/<project name>/
  2. 請確定allow.empty值設為trueallow.hosts (或如果您偏好,allow.hosts.regexp)包含IDP的來源,且filter.methods包含POST。 OSGi設定應該類似於:

    code language-json
    {
        "allow.empty": true,
        "allow.hosts.regexp": [ ],
        "allow.hosts": [
            "$[env:SAML_IDP_REFERRER;default=dev-123567890.okta.com]"
        ],
        "filter.methods": [
            "POST",
        ],
        "exclude.agents.regexp": [ ]
    }
    

AEM Publish支援單一反向連結篩選設定,因此請將SAML設定需求與任何現有設定合併。

如果allow.hosts (或allow.hosts.regex)在不同環境之間有所差異,則每個環境(config.publish.devconfig.publish.stageconfig.publish.prod)的OSGi設定都可以與特定屬性一起定義。

設定跨原始資源共用(CORS)

在SAML驗證程式期間,IDP會向AEM Publish的.../saml_login端點起始使用者端HTTPPOST。 如果IDP和AEM Publish存在於不同的主機/網域上,AEM Publish的​ CRoss來源資源共用(CORS) ​必須設定為允許來自IDP主機/網域的HTTP POST。

此HTTPPOST請求的Origin標頭通常與AEM Publish主機的值不同,因此需要CORS設定。

在本機AEM SDK (localhost:4503)上測試SAML驗證時,IDP可能會將Origin標頭設定為null。 若是如此,請將"null"新增至alloworigin清單。

  1. /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.cors.impl.CORSPolicyImpl~saml.cfg.json的專案中建立OSGi設定檔

    • /wknd-examples/變更為您的專案名稱
    • 檔案名稱中~之後的識別碼應唯一識別此組態,因此它可能是IDP的名稱,例如...CORSPolicyImpl~okta.cfg.json。 值應為英數字元和連字型大小。
  2. 將下列JSON貼入com.adobe.granite.cors.impl.CORSPolicyImpl~...cfg.json檔案。

{
    "alloworigin": [
        "$[env:SAML_IDP_ORIGIN;default=https://dev-1234567890.okta.com]",
        "null"
    ],
    "allowedpaths": [
        ".*/saml_login"
    ],
    "supportedmethods": [
        "POST"
    ]
}

如果alloworiginallowedpaths在不同環境之間不同,則每個環境(config.publish.devconfig.publish.stageconfig.publish.prod)的OSGi設定可以使用特定屬性來定義。

設定AEM Dispatcher以允許SAML HTTP POST

成功驗證IDP後,IDP會將HTTPPOST協調回AEM註冊的/saml_login端點(在IDP中設定)。 對/saml_login的此HTTPPOST預設在Dispatcher中遭到封鎖,因此必須使用下列Dispatcher規則明確允許此事件:

  1. 在IDE中開啟dispatcher/src/conf.dispatcher.d/filters/filters.any
  2. 在檔案底部新增允許規則,將HTTP POST新增至結尾為/saml_login的URL。
...

# Allow SAML HTTP POST to ../saml_login end points
/0190 { /type "allow" /method "POST" /url "*/saml_login" }

如果已設定Apache Webserver上的URL重新寫入(dispatcher/src/conf.d/rewrites/rewrite.rules),請確定對.../saml_login端點的要求不會意外遭到竄改。

如何為新環境中的SAML使用者啟用動態群組成員資格

為了大幅增強新AEM as a Cloud Service環境中的群組評估效能,建議在新環境中啟用動態群組成員資格功能。
這也是在啟動資料同步時的必要步驟。 更多詳細資料在此
若要這麼做,請將下列屬性新增至OSGI設定檔:

/apps/example/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~example.cfg.json

使用此組態,使用者和群組會建立為Oak外部使用者。 在AEM中,外部使用者和群組有由[user name];[idp][group name];[idp]組成的預設rep:principalName
指出存取控制清單(ACL)與使用者或群組的PrincipalName相關聯。
在先前未指定identitySyncType或設為default的現有部署中部署此設定時,將會建立新的使用者和群組,且必須將ACL套用至這些新使用者和群組。 請注意,外部群組不能包含本機使用者。 Repoinit可用來建立SAML外部群組的ACL,即使這些群組僅在使用者執行登入時才會建立。
為避免在ACL上重構此功能,已實作標準移轉功能

成員資格如何儲存在具有動態群組成員資格的本機及外部群組中

在本機群組上,群組成員儲存在Oak屬性中: rep:members。 屬性包含群組每個成員的uid清單。 其他詳細資料可在這裡找到。
範例:

{
  "jcr:primaryType": "rep:Group",
  "rep:principalName": "operators",
  "rep:managedByIdp": "SAML",
  "rep:members": [
    "635afa1c-beeb-3262-83c4-38ea31e5549e",
    "5e496093-feb6-37e9-a2a1-7c87b1cec4b0",
    ...
  ],
   ...
}

具有動態群組成員資格的外部群組不會儲存群組專案中的任何成員。
群組成員資格會儲存在使用者專案中。 其他檔案可在這裡找到。 例如,這是群組的OAK節點:

{
  "jcr:primaryType": "rep:Group",
  "jcr:mixinTypes": [
    "rep:AccessControllable"
  ],
  "jcr:createdBy": "",
  "jcr:created": "Tue Jul 16 2024 08:58:47 GMT+0000",
  "rep:principalName": "GROUP_1;aem-saml-idp-1",
  "rep:lastSynced": "Tue Jul 16 2024 08:58:47 GMT+0000",
  "jcr:uuid": "d9c6af8a-35c0-3064-899a-59af55455cd0",
  "rep:externalId": "GROUP_1;aem-saml-idp-1",
  "rep:authorizableId": "GROUP_1;aem-saml-idp-1"
}

這是該群組之使用者成員的節點:

{
  "jcr:primaryType": "rep:User",
  "jcr:mixinTypes": [
    "rep:AccessControllable"
  ],
  "surname": "Test",
  "rep:principalName": "testUser",
  "rep:externalId": "test;aem-saml-idp-1",
  "rep:authorizableId": "test",
  "rep:externalPrincipalNames": [
    "projects-users;aem-saml-idp-1",
    "GROUP_2;aem-saml-idp-1",
    "GROUP_1;aem-saml-idp-1",
    "operators;aem-saml-idp-1"
  ],
  ...
}

自動移轉至現有環境的動態群組成員資格

啟用此移轉時,會在使用者驗證期間執行,並包含下列步驟:

  1. 本機使用者會移轉至外部使用者,同時保留原始使用者名稱。 這表示已移轉的本機使用者(現在為外部使用者)會保留其原始使用者名稱,而非遵循上一節中所述的命名語法。 將新增一個額外的屬性,稱為: rep:externalId,其值為[user name];[idp]。 未修改使用者PrincipalName
  2. 對於SAML判斷提示中收到的每個外部群組,都會建立一個外部群組。 如果存在對應的本機群組,外部群組會作為成員新增至本機群組。
  3. 使用者會新增為外部群組的成員。
  4. 然後,本機使用者會從他曾是成員的所有Saml本機群組中移除。 Saml本機群組由OAK屬性識別: rep:managedByIdp。 當屬性syncType未指定或設定為default時,此屬性是由Saml驗證處理常式所設定。

例如,如果移轉之前user1是本機使用者,且是本機群組group1的成員,則移轉之後會發生下列變更:
user1成為外部使用者。 屬性rep:externalId已新增至他的設定檔。
user1成為外部群組的成員: group1;idp
user1不再是本機群組的直接成員: group1
group1;idp是本機群組的成員: group1
然後user1會透過繼承成為本機群組group1的成員

外部群組的群組成員資格儲存在屬性rep:authorizableId的使用者設定檔中

如何設定自動移轉至動態群組成員資格

  1. 啟用SAML OSGI組態檔中的屬性"identitySyncType": "idp_dynamic_simplified_id"com.adobe.granite.auth.saml.SamlAuthenticationHandler~...cfg.json
  2. 使用屬性設定新的OSGI服務,PID為: com.adobe.granite.auth.saml.migration.SamlDynamicGroupMembershipMigration~...
{
  "idpIdentifier": "<vaule of identitySyncType of saml configuration to be migrated>"
}

部署SAML設定

OSGi設定必須提交至Git並使用Cloud Manager部署至AEM as a Cloud Service。

$ git remote -v
adobe   https://git.cloudmanager.adobe.com/myOrg/myCloudManagerGit/ (fetch)
adobe   https://git.cloudmanager.adobe.com/myOrg/myCloudManagerGit/ (push)
$ git add .
$ git commit -m "SAML 2.0 configurations"
$ git push adobe saml-auth:develop

使用完整棧疊部署管道部署目標Cloud Manager Git分支(在此範例中為develop)。

叫用SAML驗證

您可以建立巧盡心思打造的連結或按鈕,從AEM Site網頁叫用SAML驗證流程。 以下所述的引數可以視需要以程式設計方式設定,因此,例如,登入按鈕可能會根據按鈕的內容,將使用者在成功SAML驗證時採取的saml_request_path設定到不同的AEM頁面。

GET要求

可以透過以下格式建立HTTPGET請求來叫用SAML驗證:

HTTP GET /system/sling/login

並提供查詢引數:

查詢引數名稱
查詢引數值
resource
AdobeGranite SAML 2.0驗證處理常式OSGi設定的 path屬性中所定義,任何SAML驗證處理常式監聽的JCR路徑或子路徑。
saml_request_path
成功SAML驗證後,使用者應該前往的URL路徑。

例如,此HTML連結將觸發SAML登入流程,成功後將使用者帶至/content/wknd/us/en/protected/page.html。 您可以視需要以程式設計方式設定這些查詢引數。

<a href="/system/sling/login?resource=/content/wknd&saml_request_path=/content/wknd/us/en/protected/page.html">
    Log in using SAML
</a>

POST要求

可以透過以下格式建立HTTPPOST請求來叫用SAML驗證:

HTTP POST /system/sling/login

並提供表單資料:

表單資料名稱
表單資料值
resource
AdobeGranite SAML 2.0驗證處理常式OSGi設定的 path屬性中所定義,任何SAML驗證處理常式監聽的JCR路徑或子路徑。
saml_request_path
成功SAML驗證後,使用者應該前往的URL路徑。

例如,此HTML按鈕將使用HTTPPOST來觸發SAML登入流程,並在成功後將使用者帶至/content/wknd/us/en/protected/page.html。 您可以視需要以程式設計方式設定這些表單資料引數。

<form action="/system/sling/login" method="POST">
    <input type="hidden" name="resource" value="/content/wknd">
    <input type="hidden" name="saml_request_path" value="/content/wknd/us/en/protected/page.html">
    <input type="submit" value="Log in using SAML">
</form>

Dispatcher設定

HTTPGET和POST方法都需要使用者端存取AEM的/system/sling/login端點,因此必須透過AEM Dispatcher允許它們。

根據是否使用GET或POST,允許必要的URL模式

# Allow GET-based SAML authentication invocation
/0191 { /type "allow" /method "GET" /url "/system/sling/login" /query="*" }

# Allow POST-based SAML authentication invocation
/0192 { /type "allow" /method "POST" /url "/system/sling/login" }
recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69