SAML 2.0身份驗證
瞭解如何設定最終用戶(而非作者)並AEM驗證其是否與您選擇的SAML 2.0相容的IDP。
SAML 2.0與AEMPublish(或預覽)整合,允許基於Web體驗的最終用戶向非AdobeIDP(身份提供方)進行身份驗證,並以已命AEM名的授權用戶身份訪問。
AEM Publish SAML整合的典型流程如下:
-
使用者向AEM發佈提出要求,並指示需要驗證。
- 使用者請求受CUG/ACL保護的資源。
- 使用者請求受驗證需求約束的資源。
- 使用者依循明確要求登入動作的AEM登入端點連結(即
/system/sling/login)。
-
AEM會向IDP發出AuthnRequest,要求IDP開始驗證程式。
-
使用者向IDP進行驗證。
- IDP會提示使用者輸入認證。
- 使用者已透過IDP驗證,無需再提供認證。
-
IDP會產生包含使用者資料的SAML宣告,並使用IDP的私人憑證加以簽署。
-
IDP會透過HTTP POST,透過使用者的網頁瀏覽器(RESPONSIVE_PROTECTED_PATH/saml_login)將SAML宣告傳送至AEM Publish。
-
AEM Publish會收到SAML判斷提示,並使用IDP公開憑證驗證SAML判斷提示的完整性和真實性。
-
AEM Publish會根據SAML 2.0 OSGi設定和SAML宣告的內容來管理AEM使用者記錄。
- 建立使用者
- 同步使用者屬性
- 更新AEM使用者群組成員資格
-
AEM Publish會在HTTP回應上設定AEM
login-tokenCookie,用於向AEM Publish驗證後續請求。 -
AEM發佈會將使用者重新導向至
saml_request_pathCookie所指定的AEM發佈上的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裝載的公開/私人金鑰組
- AEM Sites頁面(或頁面樹),發佈AEM到Publish,受關閉用戶組(CUG)保護
SAML 2.0僅支援對Publish或預覽AEM進行身份驗證。 要管理使用和AEMIDP的作者身份驗證,將IDP與Adobe IMS整合。
AEM作為雲服務預覽服務支援
AEM上支援SAML 2.0作為雲服務,包括預AEM覽。 但是,中的SAML配AEM置依賴於OSGi配置,並且AEMPreview和AEMPublish共用相同的OSGi運行模式解析(config.publish)。 因此,您無法為預覽和Publish建立單獨的SAML配置檔案。
相反,在OSGi配置中使用特定於環境的配置值,並為預覽和Publish環境設定適當的變數值。
在上安裝IDP公共證AEM書
IDP的公共證書將添加到全AEM局信任儲存,用於驗證由IDP發送的SAML斷言是否有效。
- 用戶驗證到IDP。
- IDP生成包含用戶資料的SAML斷言。
- IDP使用IDP的私有證書籤署SAML聲明。
- IDP啟動客戶端HTTPPOST,AEM到Publish的SAML終結點(
.../saml_login),該終結點包括簽名的SAML斷言。 - AEMPublish收到包含簽名的SAML斷言的HTTPPOST,可以使用IDP公共證書驗證簽名。
-
從IDP取得 公用憑證 檔案。 此憑證可讓AEM驗證IDP提供給AEM的SAML判斷提示。
憑證為PEM格式,應類似於:
code language-none -----BEGIN CERTIFICATE----- MIIC4jCBAcoCCQC33wnybT5QZDANBgkqhkiG9w0BAQsFADAyMQswCQYDVQQGEwJV ... m0eo2USlSRTVl7QHRTuiuSThHpLKQQ== -----END CERTIFICATE----- -
以管理員身AEM份登錄到作AEM者。
-
導航到工具>安全>信任儲存。
-
建立或開啟全局信任儲存。 如果建立全局信任儲存,請將密碼儲存到某個安全位置。
-
展開 從CER檔案 添加證書。
-
選擇選擇證書檔案,然後上載IDP提供的證書檔案。
-
將 將證書映射到用戶 留空。
-
選取提交。
-
新增的憑證出現在 從CRT檔案 新增憑證區段上方。
-
記下別名,因為此值在SAML 2.0身份驗證處理程式OSGi配置中使用。
-
選取「儲存並關閉」。
全局信任儲存在Author上配置了IDP的公共證書AEM,但由於SAML僅在AEMPublish上使用,因此必須將全局信任儲存複製到AEMPublish,才能在那裡訪問IDP公共證書。
-
導航到工具>部署>包。
-
建立套件
- 封裝名稱:
Global Trust Store - 版本:
1.0.0 - 群組:
com.your.company
- 封裝名稱:
-
編輯新的 全域信任存放區 封裝。
-
選取 篩選器 索引標籤,並為根路徑
/etc/truststore新增篩選器。 -
選取完成,然後選取儲存。
-
選取 全域信任存放區 封裝的 建置 按鈕。
-
建置後,選取更多 > 復寫以啟動全域信任存放區節點(
/etc/truststore)至AEM Publish。
建立驗證服務金鑰存放區 authentication-service-keystore
當SAML 2.0驗證處理常式OSGi組態屬性handleLogout設定為true或需要AuthnRequest簽署/SAML宣告加密時,需要建立驗證服務的金鑰存放區
-
以AEM管理員身分登入AEM Author以上傳私密金鑰。
-
導覽至工具>安全性>使用者,然後選取 驗證服務 使用者,並從頂端動作列選取屬性。
-
選取 金鑰存放區 索引標籤。
-
建立或開啟金鑰存放區。 如果建立金鑰存放區,請妥善儲存密碼。
- 只有在需要AuthnRequest簽署/SAML宣告加密時,才會將公用/私用金鑰存放區安裝至此金鑰存放區。
- 如果此SAML整合支援登出,但不支援AuthnRequest簽署/SAML判斷提示,則空的金鑰儲存區就足夠了。
-
選取「儲存並關閉」。
-
建立包含已更新的 身份驗證服務 用戶的包。
使用包:_使用以下臨時解決方法(_U)
-
導航到工具>部署>包。
-
建立包
- 封裝名稱:
Authentication Service - 版本:
1.0.0 - 群組:
com.your.company
- 封裝名稱:
-
編輯新的 驗證服務金鑰存放區 封裝。
-
選取 篩選器 索引標籤,並為根路徑
/home/users/system/cq:services/internal/security/<AUTHENTICATION SERVICE UUID>/keystore新增篩選器。- 導航到
<AUTHENTICATION SERVICE UUID>工具>安全性>用戶 並選擇 身份驗證服務用戶,即可找到。 UUID是URL的最後一部分。
- 導航到
-
選擇完成,然後選擇保存。
-
為 身份驗證服務密鑰儲存 包選擇 生成 按鈕。
-
生成後,選擇更多 > 複製以激活到Publish的身份驗證服務密鑰AEM儲存。
-
安AEM裝公鑰/私鑰對 install-aem-public-private-key-pair
安裝AEM公共/私鑰對是可選的
可AEM以將Publish配置為簽名AuthnRequests(到IDP),並加密SAML斷言(到AEM)。 這是通過向Publish提供私鑰AEM而實現的,並且它與國內流離失所者匹配公鑰。
AuthnRequest(啟動登錄過程的AEMPublish向IDP發出的請求)可由AEMPublish簽署。 為此,AEMPublish使用私鑰簽署AuthnRequest,然後IDP使用公鑰驗證簽名。 這保證AuthnRequest是由Publish發起和請求的,而AEM不是惡意的第三方向國內流離失所者發出的。
- 用戶向Publish發出HTTPAEM請求,該請求會向IDP發出SAML驗證請求。
- AEMPublish生成SAML請求以發送給IDP。
- AEMPublish使用私鑰簽AEM署SAML請求。
- AEMPublish啟動AuthnRequest,HTTP客戶端重定向到包含簽名的SAML請求的IDP。
- IDP接收AuthnRequest ,並使用公鑰驗證簽AEM名,保證AEMPublish發起AuthnRequest。
- AEM Publish接著會使用IDP公開憑證來驗證解密的SAML宣告的完整性和真實性。
IDP與AEM Publish之間的所有HTTP通訊都應透過HTTPS,因此預設情況下是安全的。 但是,在需要HTTPS提供的保密性之外,SAML斷言可以根據需要進行加密。 為此,IDP使用私鑰對SAML斷言資料進行加密,AEMPublish使用私鑰對SAML斷言進行解密。
- 用戶驗證到IDP。
- IDP生成包含用戶資料的SAML斷言,並使用IDP的私有證書對其進行簽名。
- 然後,IDP使用公鑰對SAML斷言AEM進行加密,這需要AEM私鑰才能解密。
- 加密的SAML宣告會透過使用者的網頁瀏覽器傳送至AEM Publish。
- AEM Publish會收到SAML宣告,並使用AEM的私密金鑰加以解密。
- IDP會提示使用者進行驗證。
AuthnRequest簽名和SAML斷言加密都是可選的,但都是啟用的,使用SAML 2.0身份驗證處理程式OSGi配置屬性useEncryption,這意味著兩者都不能使用,也不能同時使用。
-
獲取用於對AuthnRequest進行簽名和加密SAML斷言的公鑰、私鑰(PKCS#8以DER格式)和證書鏈檔案(這可能是公鑰)。 密鑰通常由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 -
將公鑰上載到IDP。
- 使用上述
openssl方法,公開金鑰是aem-public.crt檔案。
- 使用上述
-
以AEM管理員身分登入AEM Author以上傳私密金鑰。
-
瀏覽至工具>安全性>信任存放區,然後選取 驗證服務 使用者,並從最上方的動作列選取內容。
-
導覽至工具>安全性>使用者,然後選取 驗證服務 使用者,並從頂端動作列選取屬性。
-
選取 金鑰存放區 索引標籤。
-
建立或開啟金鑰存放區。 如果建立金鑰存放區,請妥善儲存密碼。
-
選取從DER檔案新增私密金鑰,並將私密金鑰和鏈結檔案新增至AEM:
- 別名:提供有意義的名稱,通常是IDP的名稱。
- 私密金鑰檔案:上傳私密金鑰檔案(DER格式為PKCS#8)。
- 使用上述
openssl方法,這是aem-private-pkcs8.der檔案
- 使用上述
- 選取憑證鏈結檔案:上傳隨附的鏈結檔案(可能是公開金鑰)。
- 使用上述
openssl方法,這是aem-public.crt檔案
- 使用上述
- 選取提交
-
新增的憑證出現在 從CRT檔案 新增憑證區段上方。
- 記下別名,因為它用於SAML 2.0驗證處理常式OSGi設定
-
選取「儲存並關閉」。
-
建立包含已更新 authentication-service 使用者的封裝。
使用包:_使用以下臨時解決方法(_U)
-
導航到工具>部署>包。
-
建立包
- 包名稱:
Authentication Service - 版本:
1.0.0 - 群組:
com.your.company
- 包名稱:
-
編輯新的 驗證服務金鑰存放區 封裝。
-
選取 篩選器 索引標籤,並為根路徑
/home/users/system/cq:services/internal/security/<AUTHENTICATION SERVICE UUID>/keystore新增篩選器。- 瀏覽至
<AUTHENTICATION SERVICE UUID>工具>安全性>使用者 ,並選取 驗證服務使用者,即可找到。 UUID是URL的最後一部分。
- 瀏覽至
-
選擇完成,然後選擇保存。
-
為 身份驗證服務密鑰儲存 包選擇 生成 按鈕。
-
生成後,選擇更多 > 複製以激活到Publish的身份驗證服務密鑰AEM儲存。
-
配置SAML 2.0身份驗證處理程式 configure-saml-2-0-authentication-handler
通AEM過AdobeGranite SAML 2.0身份驗證處理程式 OSGi配置執行SAML配置。
此設定是OSGi工廠設定,表示單一AEM as a Cloud Service Publish服務可能有多個SAML設定,涵蓋存放庫的分散資源樹狀結構;這對於多網站AEM部署很有用。
Adobe花崗岩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 |
✔ | 字串 | 在全局信任儲存中找到的IDP證AEM書的別名 | |
| IDP HTTP重定向 | idpHttpRedirect |
✘ | 布林值 | false |
指示HTTP是否重定向到IDP URL,而不是發送AuthnRequest。 設定為true以進行IDP啟動的身份驗證。 |
| IDP識別碼 | idpIdentifier |
✘ | 字串 | 唯一IDP ID可確保AEM使用者和群組的唯一性。 如果為空,則改用serviceProviderEntityId。 |
|
| 斷言使用者服務URL | assertionConsumerServiceURL |
✘ | 字串 | AuthnRequest中的AssertionConsumerServiceURL URL屬性,指定必須將<Response>訊息傳送至AEM的位置。 |
|
| SP實體ID | serviceProviderEntityId |
✔ | 字串 | 向IDP唯一識別AEM;通常是AEM主機名稱。 | |
| SP加密 | useEncryption |
✘ | 布林值 | true |
指示IDP是否加密SAML宣告。 需要設定spPrivateKeyAlias和keyStorePassword。 |
| SP私密金鑰別名 | spPrivateKeyAlias |
✘ | 字串 | authentication-service使用者金鑰庫中私密金鑰的別名。 如果useEncryption設定為true則為必要。 |
|
| SP金鑰庫密碼 | keyStorePassword |
✘ | 字串 | 'authentication-service'使用者金鑰存放區的密碼。 如果useEncryption設定為true則為必要。 |
|
| 預設重新導向 | defaultRedirectUrl |
✘ | 字串 | / |
成功驗證後的預設重新導向URL。 可相對於AEM主機(例如/content/wknd/us/en/html)。 |
| 使用者ID屬性 | userIDAttribute |
✘ | 字串 | uid |
包含用戶ID的SAML斷言屬性的名AEM稱。 留空以使用Subject:NameId。 |
| 自動建立用AEM戶 | createUser |
✘ | 布林值 | true |
指示是否AEM在成功驗證時建立用戶。 |
| AEM使用者中間路徑 | userIntermediatePath |
✘ | 字串 | 建立AEM使用者時,此值會作為中繼路徑(例如/home/users/<userIntermediatePath>/jane@wknd.com)。 需要createUser設定為true。 |
|
| AEM使用者屬性 | synchronizeAttributes |
✘ | 字串陣列 | 要以[ "saml-attribute-name=path/relative/to/user/node" ]格式(例AEM如[ "firstName=profile/givenName" ])儲存在用戶上的SAML屬性映射清單。 請參閱本機屬AEM性的完整清單。 |
|
| 將用戶添加到AEM組 | addGroupMemberships |
✘ | 布林值 | true |
指示在成功AEM驗證後是否將用戶自AEM動添加到用戶組。 |
| AEM群組成員資格屬性 | groupMembershipAttribute |
✘ | 字串 | groupMembership |
SAML斷言屬性的名稱,該屬性包含應AEM將用戶添加到的用戶組清單。 需要將addGroupMemberships設定為true。 |
| 預設AEM組 | defaultGroups |
✘ | 字串陣列 | 身份驗證AEM的用戶組清單始終添加到(例如,[ "wknd-user" ])。 需要將addGroupMemberships設定為true。 |
|
| 名稱IDPolicy格式 | 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 |
✘ | default 或 idp |
default |
請勿變更AEM as a Cloud Service的from預設值。 |
| 服務排名 | service.ranking |
✘ | 整數 | 5002 |
相同path偏好較高等級的設定。 |
AEM使用者屬性 aem-user-attributes
AEM使用以下使用者屬性,這些屬性可透過Adobe Granite 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 |
-
在
/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。 值應為英數字元和連字型大小。
- 將
-
將下列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" ] } -
依專案要求更新值。 如需設定屬性說明,請參閱上述SAML 2.0驗證處理常式OSGi設定字彙表。
path應包含受關閉用戶組(CUG)保護且需要身份驗證的內容樹,此身份驗證處理程式應負責保護。 -
建議但不必使用OSGi環境變數和機密,當值可能與發行週期不同步時,或當類似環境類型/服務層之間的值不同時,則應使用OSGi。 可以使用上面所示的
$[env:..;default=the-default-value]"語法設定預設值。
如果SAML配置在不同環境之間不同,則可以使用特定屬性定義每個環境(config.publish.dev、config.publish.stage和config.publish.prod)的OSGi配置。
使用加密
當加密AuthnRequest和SAML判斷提示時,需要下列屬性: useEncryption、spPrivateKeyAlias和keyStorePassword。 keyStorePassword包含密碼,因此該值不得儲存在OSGi配置檔案中,而應使用機密配置值注入
-
在IDE中開啟
/ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~saml.cfg.json。 -
添加三個屬性
useEncryption、spPrivateKeyAlias和keyStorePassword,如下所示。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" ] } -
加密所需的三個OSGi設定屬性是:
useEncryption已設定為truespPrivateKeyAlias包含SAML整合使用之私密金鑰的金鑰庫專案別名。keyStorePassword包含包含使用者金鑰儲存區密碼的OSGi密碼設定變數authentication-service。
設定反向連結篩選器
在SAML驗證程式期間,IDP會向AEM Publish的.../saml_login端點起始使用者端HTTP POST。 如果IDP和AEM Publish存在於不同的來源,AEM Publish的 反向連結篩選器 會透過OSGi設定允許來自IDP來源的HTTP POST。
-
在
/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>/
- 將
-
請確定
allow.empty值設為true,allow.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設定需求與任何現有設定合併。
如果config.publish.dev (或config.publish.stage)在不同環境之間有所差異,則每個環境(config.publish.prod、allow.hosts和allow.hosts.regex)的OSGi設定都可以與特定屬性一起定義。
設定跨原始資源共用(CORS)
在SAML驗證程式期間,IDP會向AEM Publish的.../saml_login端點起始使用者端HTTP POST。 如果IDP和AEM Publish存在於不同的主機/網域上,則AEM Publish的 CRoss-Origin Resource Sharing (CORS) 必須設定為允許來自IDP主機/網域的HTTP POST。
此HTTP POST要求的Origin標頭通常與AEM Publish主機的值不同,因此需要CORS設定。
在本機AEM SDK (localhost:4503)上測試SAML驗證時,IDP可能會將Origin標頭設定為null。 若是如此,請將"null"新增至alloworigin清單。
-
在
/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。 值應為英數字元和連字型大小。
- 將
-
將下列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"
]
}
如果config.publish.dev和config.publish.stage在不同環境之間不同,則每個環境(config.publish.prod、alloworigin和allowedpaths)的OSGi設定可以使用特定屬性來定義。
設定AEM Dispatcher以允許SAML HTTP POST
成功驗證IDP後,IDP會為AEM註冊的/saml_login端點(在IDP中設定)編排HTTP POST。 此/saml_login的HTTP POST預設會在Dispatcher中遭到封鎖,因此必須使用下列Dispatcher規則明確允許使用:
- 在IDE中開啟
dispatcher/src/conf.dispatcher.d/filters/filters.any。 - 在檔案底部新增允許規則,將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端點的要求不會意外遭到竄改。
動態群組成員資格
動態群組成員資格是Apache Jackrabbit Oak中的功能,可提升群組評估及布建的效能。 本節說明啟用此功能時如何儲存使用者和群組,以及如何修改SAML驗證處理常式的組態,以便為新環境或現有環境啟用它。
如何為新環境中的SAML使用者啟用動態群組成員資格
為了大幅增強新AEM as a Cloud Service環境中的群組評估效能,建議在新環境中啟用動態群組成員資格功能。
這也是在啟動資料同步時的必要步驟。 更多詳細資料在此。
若要這麼做,請將下列屬性新增至OSGI設定檔:
/apps/example/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~example.cfg.json
使用此組態,使用者和群組會建立為Oak外部使用者。 在AEM中,外部使用者和群組有由rep:principalName或[user name];[idp]組成的預設[group name];[idp]。
指出存取控制清單(ACL)與使用者或群組的PrincipalName相關聯。
在先前未指定identitySyncType或設為default的現有部署中部署此設定時,將會建立新的使用者和群組,且必須將ACL套用至這些新使用者和群組。 Note that external groups cannot contain local users. 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"
],
...
}
如何在現有環境中啟用SAML使用者的動態群組成員資格
如上一節所述,外部使用者和群組的格式與本機使用者和群組使用的格式略有不同。 您可以為外部群組定義新的ACL並布建新的外部使用者,或使用如下所述的移轉工具。
為具有外部使用者的現有環境啟用動態群組成員資格
SAML驗證處理常式會在指定下列屬性時建立外部使用者: "identitySyncType": "idp"。 在此情況下,可以啟用動態群組成員資格,並將這個屬性修改為: "identitySyncType": "idp_dynamic"。 不需要移轉。
針對具有本機使用者的現有環境,自動移轉至動態群組成員資格
SAML驗證處理常式會在指定下列屬性時建立本機使用者: "identitySyncType": "default"。 若未指定屬性,此亦為預設值。 在本節中,我們將說明自動移轉程式所執行的步驟。
啟用此移轉時,會在使用者驗證期間執行,並包含下列步驟:
- 本機使用者會移轉至外部使用者,同時保留原始使用者名稱。 這表示已移轉的本機使用者(現在為外部使用者)會保留其原始使用者名稱,而非遵循上一節中所述的命名語法。 將新增一個額外的屬性,稱為:
rep:externalId,其值為[user name];[idp]。 未修改使用者PrincipalName。 - 對於SAML判斷提示中收到的每個外部群組,都會建立一個外部群組。 如果存在對應的本機群組,外部群組會作為成員新增至本機群組。
- 使用者會新增為外部群組的成員。
- 然後,本機使用者會從他曾是成員的所有Saml本機群組中移除。 Saml本機群組由OAK屬性識別:
rep:managedByIdp。 當屬性syncType未指定或設定為default時,此屬性是由Saml驗證處理常式所設定。
例如,如果移轉之前user1是本機使用者,且是本機群組group1的成員,則移轉之後會發生下列變更:user1成為外部使用者。 屬性rep:externalId已新增至他的設定檔。user1成為外部群組的成員: group1;idpuser1不再是本機群組的直接成員: group1group1;idp是本機群組的成員: group1。
然後user1會透過繼承成為本機群組group1的成員
外部群組的群組成員資格儲存在屬性rep:externalPrincipalNames的使用者設定檔中
如何設定自動移轉至動態群組成員資格
- 啟用SAML OSGi組態檔中的屬性
"identitySyncType": "idp_dynamic_simplified_id":com.adobe.granite.auth.saml.SamlAuthenticationHandler~...cfg.json: - 設定新的OSGi服務,原廠PID的開頭為:
com.adobe.granite.auth.saml.migration.SamlDynamicGroupMembershipMigration~。 例如,PID可以是:com.adobe.granite.auth.saml.migration.SamlDynamicGroupMembershipMigration~myIdP。 設定下列屬性:
{
"idpIdentifier": "<value of IDP Identifier (idpIdentifier)" property from the "com.adobe.granite.auth.saml.SamlAuthenticationHandler" configuration to be migrated>"
}
若要移轉多個SAML組態,必須為com.adobe.granite.auth.saml.migration.SamlDynamicGroupMembershipMigration建立多個OSGi Factory組態,每個組態指定要移轉的idpIdentifier。
自訂SAML登入鉤點
對於進階使用案例,AEM支援開發自訂SAML登入掛接,這些是實作com.adobe.granite.auth.saml.SamlLoginHook介面的OSGi服務。 這些掛接會在SAML驗證流程中執行,並可用於實作自訂邏輯,例如其他使用者布建或自訂記錄。
有關如何開發和註冊自訂SAML登入勾點的詳細資訊,請參閱自訂SAML登入勾點檔案。
部署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網站網頁叫用SAML驗證流程。 以下所述的引數可以視需要以程式設計方式設定,因此,例如,登入按鈕可能會根據按鈕的內容,將使用者成功進行SAML驗證時所在的saml_request_path設定到不同的AEM頁面。
使用SAML時的安全快取
在AEM發佈執行個體上,通常會快取大部分頁面。 不過,對於受SAML保護的路徑,應使用auth_checker設定停用快取或啟用安全快取。 如需詳細資訊,請參閱這裡提供的詳細資料
請注意,如果您在快取受保護路徑時未啟用auth_checker,則可能會遇到無法預期的行為。
GET要求
可以透過以下格式建立HTTP GET請求來叫用SAML驗證:
HTTP GET /system/sling/login
並提供查詢引數:
resourcepath屬性中所定義,任何SAML驗證處理常式監聽的JCR路徑或子路徑。saml_request_path例如,此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要求
可以透過以下格式建立HTTP POST請求來叫用SAML驗證:
HTTP POST /system/sling/login
並提供表單資料:
resourcepath屬性中所定義,任何SAML驗證處理常式監聽的JCR路徑或子路徑。saml_request_path例如,此HTML按鈕將使用HTTP POST來觸發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 設定
HTTP GET和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" }