支援客戶身分與存取管理 (CIAM) 和多租戶

2024 年 6 月 20 日,作者:Pedro Igor

親愛的 Keycloak 社群:

感謝社群和紅帽 IT 的許多人共同努力,我們在 Keycloak 25 中推出了 Keycloak 組織功能。

我們很高興宣布,我們已開始一段漫長的旅程,以支援客戶身分與存取管理 (CIAM),並在一定程度上支援多租戶,當領域需要與客戶和業務夥伴等第三方整合時。

Keycloak 組織功能利用 Keycloak 現有的身分與存取管理 (IAM) 功能,以解決 CIAM 使用案例,例如企業對企業 (B2B) 和企業對企業對客戶 (B2B2C) 整合。透過利用領域的現有功能,此功能的首次發布提供了核心功能,允許領域與業務夥伴和客戶整合。

該功能最初作為技術預覽功能發布,最終目標是在 Keycloak 26 中提供支援。此功能的路線圖中還有許多其他功能,我們認為這組初始功能是該功能的核心,這將使我們能夠在其基礎上構建更多功能。因此,您的回饋非常重要,以確保我們走在解決 CIAM 實際使用案例的正確道路上。

請考慮查看我們的每晚版本,以查看最新更新和下一個主要版本中將會發布的內容。

有關該功能的更多詳細資訊,請參閱官方文件中提供的文件。

開始使用

Keycloak 組織功能引入了使用者如何驗證領域身分,以識別使用者是在組織或領域的範圍內進行驗證的變更。

該功能在驗證方面引入的主要變更之一是,每當您驗證已啟用「組織」設定的領域身分時,都會引入身分優先的登入流程。

啟動 Keycloak

Keycloak 組織功能是一項技術預覽功能,需要在啟動(或建置伺服器的最佳化映像)時啟用

docker run --name kc-orgs -d -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin -p 8080:8080 quay.io/keycloak/keycloak start-dev --features organization

一旦您執行上述命令,請確保您可以存取 https://127.0.0.1:8080/ 上的伺服器,並使用以下憑證登入管理主控台

  • 使用者名稱:admin

  • 密碼:admin

建立領域

讓我們從建立一個名為 orgdemo 的新領域開始。orgdemo 領域是一家想要與第三方(即「organizations」)整合的第一方公司,以便他們的使用者可以存取在 orgdemo 領域中可用的用戶端應用程式提供的受保護資源。

為此,請透過管理主控台建立一個以 orgdemo 作為名稱的新領域。

orgdemo 領域中建立使用者

您還需要在 orgdemo 領域中擁有某些使用者,才能驗證身分並遵循後續步驟。

mjane 使用者是一個領域使用者,其電子郵件帳戶與領域中的任何組織都不符。我們將使用此使用者來表示 orgdemo 領域中現有的「領域」使用者,該使用者與任何組織都沒有關聯。為此,請建立如下使用者

  • 使用者名稱:mjane

  • 電子郵件:mjane@orgdemo.com

  • 名字:Mary

  • 姓氏:Jane

請務必為此使用者設定密碼,以便您可以驗證領域身分。

現在,建立 alice@orga.com 使用者。此使用者將充當現有的領域使用者,其電子郵件符合設定給組織的其中一個網域,但還不是該組織的成員。此使用者可能是透過自行註冊、與自訂身分存放區整合,甚至是從領域中可用的身分提供者聯合建立的

  • 使用者名稱:alice

  • 電子郵件:alice@orga.com

  • 名字:Alice

  • 姓氏:Chains

請務必為此使用者設定密碼,以便您可以驗證領域身分。

了解啟用此功能時驗證流程的變更

建立領域時,會自動更新驗證流程,以啟用特定步驟來驗證身分和加入組織成員。更新的驗證流程如下

  • 瀏覽器

  • 首次代理登入

browser 流程的主要變更是它預設為身分優先的登入,以便在提示使用者輸入憑證之前先識別使用者。關於 first broker login 流程,主要變更是,一旦使用者透過與組織關聯的身分提供者進行驗證並成功完成流程,便會自動將使用者新增為組織成員。

是否應進行身分優先的登入的決定取決於領域中是否有任何組織可用。如果尚未存在任何組織,則使用者將遵循通常的步驟,使用使用者名稱和密碼或設定為 browser 流程的任何其他步驟來驗證身分。

嘗試存取 https://127.0.0.1:8080/realms/orgdemo/account,您將會看到通常的登入頁面。從此頁面,您可以像往常一樣使用以下憑證驗證領域身分

  • 使用者名稱:mjane

  • 密碼:<password>

一旦您提交登入表單,您就會驗證領域身分,並自動重新導向至代表使用者執行的用戶端應用程式。在此情況下,為帳戶主控台。

當有組織時驗證領域身分

現在,讓我們在 orgademo 領域中建立一個組織。為此,我們需要透過導覽至「領域設定」頁面並啟用「組織」設定,來為領域啟用組織。

一旦您啟用組織,您可以按一下功能表中的「組織」區段。按一下「建立組織」按鈕以建立新的組織,如下所示

  • 名稱:OrgA Inc

  • 網域:orga.com

建立 orga 組織後,請從用戶端應用程式登出,然後嘗試再次登入。此時,您應該會看到身分優先的登入頁面。

與之前的嘗試不同,orgdemo 領域有一個組織,並且驗證流程已變更為先識別使用者,然後再提示使用者輸入任何憑證。

在身分優先的登入頁面上,您仍然可以驗證 mjane 使用者的身分。但是,使用者現在將分兩個步驟進行驗證。第一步只會要求使用者輸入使用者名稱或電子郵件,然後在第二步中提供密碼。

嘗試使用與組織相符的電子郵件網域驗證不存在的使用者身分

嘗試再次登入 https://127.0.0.1:8080/realms/orgdemo/account/,然後輸入 bob@orga.com。在 orgdemo 領域中,沒有與該電子郵件關聯的帳戶。

如果不存在的使用者嘗試使用與組織網域相符的電子郵件網域進行驗證,則會再次顯示身分優先的登入頁面,並指示所提供的使用者名稱無效。此時,沒有理由在第二步中要求使用者提供憑證。

有多種方法可以註冊使用者,以便他可以驗證 orgdemo 領域的身分,並最終加入 orga 組織。

如果領域已啟用自行註冊設定,則使用者可以按一下身分優先的登入頁面上的「註冊」連結,並在 orgdemo 領域建立帳戶。之後,管理員可以向使用者傳送邀請連結,或手動將其新增為 orga 組織的成員。

如果組織有一個未設定網域的身分提供者,並且它們被標記為「公開」,則他們也可以按一下身分優先登入頁面上的身分提供者連結,以自動建立帳戶並在透過身分提供者進行驗證後加入 orga 組織。

與上述類似,如果組織設定了具有其中一個組織網域的身分提供者,則使用者將自動重新導向至身分提供者進行驗證,並在流程完成後自動建立帳戶並加入 orga 組織。

請參閱官方文件以取得更多詳細資訊。

使用與組織相符的電子郵件網域驗證現有使用者的身分

嘗試再次登入 https://127.0.0.1:8080/realms/orgdemo/account/,然後輸入 alice@orga.com

與之前不同,現在會向使用者顯示第二步,以提供憑證。鑑於使用者存在於 orgdemo 領域中,即使該使用者還不是組織成員,也應該可以驗證身分。

作為管理員,您可以稍後選擇邀請使用者加入組織,或手動將其新增至組織。

使用與設定給與組織關聯的身分提供者網域相符的電子郵件網域驗證現有使用者的身分

此功能允許您為與組織關聯的身分提供者設定網域。當您要確保使用特定電子郵件網域的使用者始終透過身分提供者進行驗證時,此功能非常有用。

讓我們建立一個 orga 領域,以便使用 orgdemo 領域的身分提供者從中聯合使用者,其中身分提供者將與 orga 組織關聯。

建立 orga 領域後,請在此領域建立一個 OpenID Connect 用戶端,如下所示

  • 用戶端類型:OpenID Connect

  • 用戶端 ID:orgdemo-broker

  • 用戶端驗證:開啟

  • 有效的重新導向 URI:*(為了簡化起見使用 *,請勿在生產環境中使用)

現在建立一個使用者,以便我們稍後可以使用來自 orgdemo 領域的身份提供者來聯合此使用者。

  • 使用者名稱:jdoe

  • 電子郵件:jdoe@orga.com

  • 名字:John

  • 姓氏:Doe

請務必為此使用者設定密碼,以便您可以驗證領域身分。

現在讓我們在 orgdemo 領域中建立一個 OpenID Connect 身份提供者,如下所示

  • 別名:orga-broker

  • 顯示名稱:OrgA Inc.

  • 探索端點:https://127.0.0.1:8080/realms/orga/.well-known/openid-configuration

  • 用戶端 ID:orgdemo-broker

  • 客戶端密鑰:<當您在 orga 領域中建立 orgdemo-broker 客戶端時產生的憑證>

最後,讓我們將剛在 orgdemo 領域中建立的身份提供者與 orga 組織連結起來。為此,請點選選單中的「組織」部分,然後選擇「OrgA Inc」組織。導覽至「身份提供者」選項卡,然後點選「連結身份提供者」按鈕,並提供以下設定

  • 身份提供者:orga-broker

  • 網域:orga.com

  • 當電子郵件網域符合時重新導向:開啟

再次嘗試登入 https://127.0.0.1:8080/realms/orgdemo/account/ 並輸入 jdoe@orga.com。使用者現在會自動重新導向到 orga 領域進行驗證。

當一個在領域中還不存在的使用者嘗試使用與組織網域匹配的電子郵件網域進行驗證,並且該網域也設定為與該組織關聯的身份提供者時,使用者會自動重新導向到該身份提供者。

這樣做之後,您現在可以使用以下憑證在 orga 領域進行驗證

  • 使用者名稱:jdoe@orga.com

  • 密碼:<password>

一旦使用者完成驗證,它將會自動重新導向回 orgdemo 領域以建立帳戶,並自動加入 orga 組織。

如果您重新以 jdoe@orga.com 使用者身分重新驗證,情況也是如此。但是,這次使用者已經與身份提供者連結,並且將始終通過該身份提供者進行驗證。

在持有者權杖中使用組織元數據,以從領域中的客戶端存取受保護的資源

到目前為止,我們一直在使用 orgdemo 領域的帳戶控制台客戶端來驗證使用者。作為 OpenID Connect 客戶端,成功驗證後會發出一個存取權杖。

當在組織的上下文中進行驗證時,存取權杖會自動更新,其中包含有關使用者所屬組織的特定宣告。

要將特定於組織的宣告映射到權杖中,客戶端在向伺服器發送授權請求時需要請求 organization 範圍。

因此,權杖將包含如下的宣告

"organization": {
    "orga": {}
}

客戶端(例如:來自 ID 權杖)和資源伺服器(例如:來自存取權杖)可以使用 organization 宣告,根據使用者所屬的組織來授權存取受保護的資源。

organization 範圍是領域中內建的**可選**客戶端範圍。因此,預設情況下,它會新增到領域中建立的任何客戶端。