瞭解如何為您選擇的SAML 2.0相容的IDP設定及驗證一般使用者(而非AEM作者)。
SAML 2.0與AEM Publish (或Preview)整合,可讓AEM型網頁體驗的一般使用者向非AdobeIDP (身分提供者)進行驗證,並以已命名的授權使用者身分存取AEM。
AEM 作者 | AEM 發佈 | |
---|---|---|
SAML 2.0支援 | ✘ | ✔ |
AEM Publish SAML整合的典型流程如下:
/system/sling/login
)以明確要求登入動作。login-token
HTTP回應上的Cookie,用於向AEM Publish驗證後續請求。saml_request_path
Cookie。此影片逐步解說如何設定SAML 2.0與AEMas a Cloud Service發佈服務的整合,以及使用Okta作為IDP。
設定SAML 2.0驗證時需要下列專案:
僅支援SAML 2.0向AEM Publish或Preview驗證使用者。 若要使用和IDP管理AEM作者驗證, 將IDP與Adobe IMS整合.
IDP的公開憑證會新增至AEM全域信任存放區,並用來驗證IDP傳送的SAML宣告是否有效。
.../saml_login
),其中包含簽署的SAML判斷提示。取得 公開憑證 IDP中的檔案。 此憑證可讓AEM驗證IDP提供給AEM的SAML判斷提示。
憑證為PEM格式,應類似於:
-----BEGIN CERTIFICATE-----
MIIC4jCBAcoCCQC33wnybT5QZDANBgkqhkiG9w0BAQsFADAyMQswCQYDVQQGEwJV
...
m0eo2USlSRTVl7QHRTuiuSThHpLKQQ==
-----END CERTIFICATE-----
以AEM管理員身分登入AEM作者。
導覽至 「工具>安全性>信任存放區」.
建立或開啟全域信任存放區。 如果建立全域信任存放區,請將密碼存放於安全的位置。
展開 從CER檔案新增憑證.
選取 選取憑證檔案,並上傳IDP提供的憑證檔案。
離開 將憑證對應到使用者 空白。
選取 提交.
新新增的憑證會顯示在 從CRT檔案新增憑證 區段。
記下 別名,此值用於 SAML 2.0驗證處理常式OSGi設定.
選取 儲存並關閉.
全域信任存放區已在AEM Author上使用IDP的公開憑證設定,但由於SAML僅用於AEM Publish,因此必須將全域信任存放區復寫至AEM Publish,才能在IDP公開憑證中存取。
Global Trust Store
1.0.0
com.your.company
/etc/truststore
./etc/truststore
)到AEM Publish。當下列情況時,需要建立驗證服務的金鑰存放區: SAML 2.0驗證處理常式OSGi設定屬性 handleLogout
設為 true
或 AuthnRequest簽署/SAML宣告加密 為必填
以AEM管理員身分登入AEM作者以上傳私密金鑰。
導覽至 「工具>安全性>使用者」,並選取 authentication-service 使用者,並選取 屬性 從頂端動作列取得。
選取 金鑰存放區 標籤。
建立或開啟金鑰存放區。 如果建立金鑰存放區,請妥善保管密碼。
選取 儲存並關閉.
建立包含更新版本的套件 authentication-service 使用者。
使用套件時,請使用下列臨時因應措施:
Authentication Service
1.0.0
com.your.company
/home/users/system/cq:services/internal/security/<AUTHENTICATION SERVICE UUID>/keystore
.
<AUTHENTICATION SERVICE UUID>
可瀏覽至 「工具>安全性>使用者」,並選取 authentication-service 使用者。 UUID是URL的最後一部分。可選擇安裝AEM公開/私密金鑰組
AEM Publish可設定為簽署AuthnRequests (to IDP)及加密SAML宣告(to AEM)。 這是透過提供私密金鑰至AEM Publish以及讓公開金鑰與IDP相符來達成。
AuthnRequest (起始登入程式的AEM Publish向IDP提出的請求)可由AEM Publish簽署。 為此,AEM Publish會使用私密金鑰對AuthnRequest進行簽署,讓IDP接著使用公開金鑰來驗證簽名。 這可向IDP保證AuthnRequest已啟動,並由AEM Publish請求,而不是惡意的第三方。
IDP和AEM Publish之間的所有HTTP通訊都應透過HTTPS,因此預設是安全的。 不過,如有需要,SAML宣告可以加密,以備在HTTPS提供之上需要額外的機密性時使用。 為此,IDP會使用私密金鑰加密SAML宣告資料,而AEM Publish會使用私密金鑰解密SAML宣告。
AuthnRequest簽署和SAML判斷提示加密都是選擇性的,但是兩者都是啟用的,使用 SAML 2.0驗證處理常式OSGi設定屬性 useEncryption
,表示兩者皆可使用或兩者皆不使用。
取得用來簽署AuthnRequest以及加密SAML宣告的公開金鑰、私密金鑰(DER格式為PKCS#8)和憑證鏈結檔案(這可以是公開金鑰)。 這些金鑰通常由IT組織的安全團隊提供。
$ 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作者以上傳私密金鑰。
導覽至 「工具>安全性>信任存放區」,並選取 authentication-service 使用者,並選取 屬性 從頂端動作列取得。
導覽至 「工具>安全性>使用者」,並選取 authentication-service 使用者,並選取 屬性 從頂端動作列取得。
選取 金鑰存放區 標籤。
建立或開啟金鑰存放區。 如果建立金鑰存放區,請妥善保管密碼。
選取 從DER檔案新增私密金鑰,並將私密金鑰和鏈結檔案新增至AEM:
openssl
方法,這是 aem-private-pkcs8.der
檔案openssl
方法,這是 aem-public.crt
檔案新新增的憑證會顯示在 從CRT檔案新增憑證 區段。
選取 儲存並關閉.
建立包含更新版本的套件 authentication-service 使用者。
使用套件時,請使用下列臨時因應措施:
Authentication Service
1.0.0
com.your.company
/home/users/system/cq:services/internal/security/<AUTHENTICATION SERVICE UUID>/keystore
.
<AUTHENTICATION SERVICE UUID>
可瀏覽至 「工具>安全性>使用者」,並選取 authentication-service 使用者。 UUID是URL的最後一部分。AEM SAML設定是透過 AdobeGranite SAML 2.0驗證處理常式 OSGi設定。
此設定是OSGi工廠設定,表示單一AEMas a Cloud Service發佈服務可能有多個SAML設定,涵蓋存放庫的分散資源樹狀結構;這對多網站AEM部署很有用。
OSGi屬性 | 必要 | 值格式 | 預設值 | 說明 | |
---|---|---|---|---|---|
路徑 | path |
✔ | 字串陣列 | / |
用於此驗證處理常式的AEM路徑。 |
IDP URL | idpUrl |
✔ | 字串 | 已傳送SAML驗證請求的IDP URL。 | |
IDP憑證別名 | idpCertAlias |
✔ | 字串 | 在AEM全域信任存放區中找到的IDP憑證別名 | |
idp HTTP重新導向 | idpHttpRedirect |
✘ | 布林值 | false |
指出是否有HTTP重新導向至IDP URL,而非傳送AuthnRequest。 設定為 true 用於IDP啟動的驗證。 |
IDP識別碼 | idpIdentifier |
✘ | 字串 | 唯一的IDP ID可確保AEM使用者和群組的唯一性。 如果為空, serviceProviderEntityId 會改用。 |
|
判斷提示消費者服務URL | assertionConsumerServiceURL |
✘ | 字串 | 此 AssertionConsumerServiceURL AuthnRequest中的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 |
包含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登出請求傳送至此URL。 在以下情況下需要 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 |
不要變更 from AEMas a Cloud Service的預設。 |
服務排名 | service.ranking |
✘ | 整數 | 5002 |
相同專案偏好排名較高的設定 path . |
AEM會使用以下使用者屬性,這些屬性可透過 synchronizeAttributes
屬性(在AdobeGranite SAML 2.0 Authentication Handler OSGi設定中)。 任何IDP屬性都可以同步至任何AEM使用者屬性,但是對應至AEM使用屬性屬性(如下所列)可讓AEM自然地使用它們。
使用者屬性 | 相對屬性路徑 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 |
在專案中建立OSGi設定檔案: /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~saml.cfg.json
並在IDE中開啟。
/wknd-examples/
至您的 /<project name>/
~
檔案名稱中應唯一識別此設定,因此它可能是IDP的名稱,例如 ...~okta.cfg.json
. 值應為英數字元和連字型大小。將下列JSON貼入 com.adobe.granite.auth.saml.SamlAuthenticationHandler~...cfg.json
檔案並更新 wknd
視需要參考。
{
"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設定字彙表 以上為設定屬性說明
值可能會隨著發行週期不同步變更,或值在類似環境型別/服務層級之間不同時,建議使用OSGi環境變數和秘密,但並非必要。 可使用以下專案設定預設值: $[env:..;default=the-default-value]"
語法,如上所示。
每個環境的OSGi設定(config.publish.dev
, config.publish.stage
、和 config.publish.prod
)如果SAML設定在不同環境之間有所不同,則可以使用特定屬性來定義。
時間 加密AuthnRequest和SAML判斷提示,則需要下列屬性: useEncryption
, spPrivateKeyAlias
、和 keyStorePassword
. 此 keyStorePassword
包含密碼,因此值不能儲存在OSGi設定檔案中,而是使用插入 密碼設定值
開啟 /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~saml.cfg.json
在IDE中。
新增三個屬性 useEncryption
, spPrivateKeyAlias
、和 keyStorePassword
如下所示。
{
"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
設定為 true
spPrivateKeyAlias
包含SAML整合所使用之私密金鑰的金鑰庫專案別名。keyStorePassword
包含 OSGi密碼設定變數 包含 authentication-service
使用者金鑰庫的密碼。在SAML驗證程式期間,IDP會向AEM Publish的使用者端HTTPPOST .../saml_login
端點。 如果IDP和AEM Publish存在於不同的來源,則AEM Publish的 反向連結篩選 是透過OSGi設定設定以允許來自IDP來源的HTTP POST。
建立(或編輯)專案中的OSGi設定檔,網址為 /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/org.apache.sling.security.impl.ReferrerFilter.cfg.json
.
/wknd-examples/
至您的 /<project name>/
確保 allow.empty
值設定為 true
,則 allow.hosts
(或如果您願意, allow.hosts.regexp
)包含IDP的來源,以及 filter.methods
包含 POST
. OSGi設定應該類似於:
{
"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設定需求與任何現有設定合併。
每個環境的OSGi設定(config.publish.dev
, config.publish.stage
、和 config.publish.prod
)可使用特定屬性定義,如果 allow.hosts
(或 allow.hosts.regex
)因環境而異。
在SAML驗證程式期間,IDP會向AEM Publish的使用者端HTTPPOST .../saml_login
端點。 如果IDP和AEM Publish存在於不同的主機/網域中,則AEM Publish的 CRoss-Origin資源共用(CORS) 必須設定為允許來自IDP主機/網域的HTTP POST。
此HTTPPOST請求的 Origin
標頭的值通常與AEM Publish主機不同,因此需要CORS設定。
在本機AEM SDK上測試SAML驗證時(localhost:4503
),則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
/wknd-examples/
至您的專案名稱~
檔案名稱中應唯一識別此設定,因此它可能是IDP的名稱,例如 ...CORSPolicyImpl~okta.cfg.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"
]
}
每個環境的OSGi設定(config.publish.dev
, config.publish.stage
、和 config.publish.prod
)可使用特定屬性定義,如果 alloworigin
和 allowedpaths
因環境而異。
成功驗證IDP後,IDP會將HTTPPOST協調回AEM註冊的頁面 /saml_login
端點(設定於IDP)。 此HTTPPOST至 /saml_login
Dispatcher預設會加以封鎖,因此必須使用下列Dispatcher規則明確加以允許:
dispatcher/src/conf.dispatcher.d/filters/filters.any
在IDE中。/saml_login
....
# 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 Publish中建立使用者後,AEM使用者節點即可在整個AEM Publish服務層級中進行驗證。
這需要 資料同步 和 封裝的Token 將由AEM Publish服務的Adobe支援啟用。
傳送要求給Adobe客戶支援(透過 AdminConsole >支援)要求:
方案X和環境Y的AEM Publish服務已啟用資料同步和封裝權杖。
OSGi設定必須提交到Git並使用Cloud Manager部署到AEMas 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
),使用完整棧疊部署管道。