Keycloak 的功能與概念

Keycloak 是一個用於 Web 應用程式和 RESTful Web 服務的單一登入解決方案。Keycloak 的目標是簡化安全性,讓應用程式開發人員能夠輕鬆保護他們在組織中部署的應用程式和服務。開發人員通常需要自行編寫的安全性功能,現在可以開箱即用,並且可以輕鬆客製化以滿足您組織的個別需求。Keycloak 提供可自訂的使用者介面,用於登入、註冊、管理和帳戶管理。您也可以使用 Keycloak 作為整合平台,將其連接到現有的 LDAP 和 Active Directory 伺服器。您還可以將驗證委派給 Facebook 和 Google 等第三方身分提供者。

功能

Keycloak 提供以下功能:

  • 瀏覽器應用程式的單一登入和單一登出。

  • OpenID Connect 支援。

  • OAuth 2.0 支援。

  • SAML 支援。

  • 身分仲介 - 使用外部 OpenID Connect 或 SAML 身分提供者進行驗證。

  • 社群登入 - 啟用使用 Google、GitHub、Facebook、Twitter 和其他社群網路登入。

  • 使用者聯合 - 從 LDAP 和 Active Directory 伺服器同步使用者。

  • Kerberos 橋接器 - 自動驗證已登入 Kerberos 伺服器的使用者。

  • 管理控制台,用於集中管理使用者、角色、角色對應、用戶端和設定。

  • 帳戶控制台,允許使用者集中管理其帳戶。

  • 佈景主題支援 - 自訂所有面向使用者的頁面,以與您的應用程式和品牌整合。

  • 雙重驗證 - 透過 Google Authenticator 或 FreeOTP 支援 TOTP/HOTP。

  • 登入流程 - 可選的使用者自助註冊、密碼恢復、驗證電子郵件、要求更新密碼等。

  • 工作階段管理 - 管理員和使用者本身都可以檢視和管理使用者工作階段。

  • 權杖對應器 - 將使用者屬性、角色等以您想要的方式對應到權杖和聲明中。

  • 每個領域、應用程式和使用者的 Not-before 撤銷原則。

  • CORS 支援 - 用戶端配接器內建支援 CORS。

  • 服務提供者介面 (SPI) - 許多 SPI 可用於自訂伺服器的各個方面。驗證流程、使用者聯合提供者、協定對應器等等。

  • 支援任何具有 OpenID Connect Relying Party 程式庫或 SAML 2.0 服務提供者程式庫的平台/語言。

Keycloak 的基本操作

Keycloak 是一個在您的網路上管理的獨立伺服器。應用程式設定為指向並由該伺服器保護。Keycloak 使用開放協定標準(如 OpenID ConnectSAML 2.0)來保護您的應用程式。瀏覽器應用程式會將使用者的瀏覽器從應用程式重新導向到 Keycloak 驗證伺服器,使用者會在該處輸入其憑證。此重新導向非常重要,因為使用者完全與應用程式隔離,且應用程式永遠不會看到使用者的憑證。應用程式會收到以密碼編譯方式簽署的身分權杖或聲明。這些權杖可以包含身分資訊,例如使用者名稱、地址、電子郵件和其他個人資料。它們也可以包含權限資料,以便應用程式可以做出授權決策。這些權杖也可以用於對基於 REST 的服務進行安全呼叫。

核心概念和術語

在嘗試使用 Keycloak 保護您的 Web 應用程式和 REST 服務之前,請考慮以下核心概念和術語。

使用者

使用者是可以登入您系統的實體。它們可以具有與其關聯的屬性,例如電子郵件、使用者名稱、地址、電話號碼和生日。可以為他們分配群組成員資格並分配特定角色。

驗證

識別和驗證使用者的過程。

授權

授予使用者存取權的過程。

憑證

憑證是 Keycloak 用於驗證使用者身分的一段資料。一些範例包括密碼、一次性密碼、數位憑證,甚至是指紋。

角色

角色識別使用者類型或類別。管理員使用者經理員工都是組織中可能存在的典型角色。應用程式通常會將存取權和權限分配給特定角色,而不是個別使用者,因為處理使用者可能太過精細且難以管理。

使用者角色對應

使用者角色對應定義角色和使用者之間的對應。使用者可以與零個或多個角色相關聯。此角色對應資訊可以封裝到權杖和聲明中,以便應用程式可以決定對其管理的各種資源的存取權限。

複合角色

複合角色是可以與其他角色相關聯的角色。例如,超級使用者複合角色可以與 銷售管理員訂單輸入管理員 角色相關聯。如果使用者對應到 超級使用者 角色,他們也會繼承 銷售管理員訂單輸入管理員 角色。

群組

群組管理使用者群組。可以為群組定義屬性。您也可以將角色對應到群組。成為群組成員的使用者會繼承該群組定義的屬性和角色對應。

領域

領域管理一組使用者、憑證、角色和群組。使用者屬於並登入領域。領域彼此隔離,只能管理和驗證它們控制的使用者。

用戶端

用戶端是可以請求 Keycloak 驗證使用者的實體。大多數情況下,用戶端是想要使用 Keycloak 保護自身並提供單一登入解決方案的應用程式和服務。用戶端也可以是只想請求身分資訊或存取權杖的實體,以便它們可以安全地呼叫由 Keycloak 保護的網路上的其他服務。

用戶端配接器

用戶端配接器是安裝到您的應用程式環境中的外掛程式,以便能夠與 Keycloak 通訊並由 Keycloak 保護。Keycloak 有許多適用於不同平台的配接器,您可以下載這些配接器。您還可以為我們未涵蓋的環境取得第三方配接器。

同意

同意是指當您作為管理員希望使用者在用戶端可以參與驗證過程之前,先給予該用戶端權限。在使用者提供其憑證後,Keycloak 將會彈出一個畫面,識別請求登入的用戶端以及使用者被要求提供的身分資訊。使用者可以決定是否批准請求。

用戶端範圍

註冊用戶端時,您必須為該用戶端定義協定對應器和角色範圍對應。通常,儲存用戶端範圍很有用,因為可以透過共用一些通用設定來簡化建立新用戶端的過程。這對於根據 scope 參數的值有條件地請求某些宣告或角色也很有用。Keycloak 為此提供了用戶端範圍的概念。

用戶端角色

用戶端可以定義特定於它們的角色。這基本上是專用於用戶端的角色命名空間。

身分權杖

提供使用者身分資訊的權杖。OpenID Connect 規格的一部分。

存取權杖

可以作為 HTTP 請求的一部分提供的權杖,該權杖授予對所調用服務的存取權。這是 OpenID Connect 和 OAuth 2.0 規格的一部分。

聲明

有關使用者的資訊。這通常與 SAML 驗證回應中包含的 XML blob 有關,該聲明提供了有關已驗證使用者的身分中繼資料。

服務帳戶

每個用戶端都有一個內建的服務帳戶,允許它取得存取權杖。

直接授權

用戶端透過 REST 呼叫代表使用者取得存取權杖的方式。

協定對應器

對於每個用戶端,您可以自訂 OIDC 權杖或 SAML 聲明中儲存的宣告和聲明。您可以透過建立和設定協定對應器來實現此目的。

工作階段

當使用者登入時,會建立工作階段來管理登入工作階段。工作階段包含諸如使用者何時登入以及哪些應用程式在該工作階段中參與單一登入之類的信息。管理員和使用者都可以檢視工作階段資訊。

使用者聯合提供者

Keycloak 可以儲存和管理使用者。通常,公司已經擁有儲存使用者和憑證資訊的 LDAP 或 Active Directory 服務。您可以將 Keycloak 指向驗證來自這些外部儲存的憑證並提取身分資訊。

身分提供者

身分提供者 (IDP) 是一種可以驗證使用者的服務。Keycloak 是一個 IDP。

身分提供者聯合

Keycloak 可以設定為將驗證委派給一個或多個 IDP。透過 Facebook 或 Google 進行社群登入是身分提供者聯合的一個範例。您也可以連接 Keycloak,將驗證委派給任何其他 OpenID Connect 或 SAML 2.0 IDP。

身分提供者對應器

在執行 IDP 聯合時,您可以將傳入的權杖和聲明對應到使用者和工作階段屬性。這有助於您將身分資訊從外部 IDP 傳播到請求驗證的用戶端。

必要動作

必要動作是使用者在驗證過程中必須執行的動作。在這些動作完成之前,使用者將無法完成驗證過程。例如,管理員可能會安排使用者每月重設其密碼。所有這些使用者都會設定 更新密碼 必要動作。

驗證流程

驗證流程是使用者在與系統的某些方面互動時必須執行的工作流程。登入流程可以定義所需的憑證類型。註冊流程定義使用者必須輸入哪些個人資料,以及是否必須使用 reCAPTCHA 之類的功能來過濾掉機器人。憑證重設流程定義使用者在重設密碼之前必須執行的動作。

事件

事件是管理員可以檢視並掛鉤的稽核串流。

佈景主題

Keycloak 提供的每個畫面都有佈景主題支援。佈景主題定義了 HTML 範本和樣式表,您可以根據需要覆寫它們。

建立第一個管理員

安裝 Keycloak 後,您需要一個管理員帳戶,該帳戶可以作為超級管理員,擁有管理 Keycloak 的完整權限。有了這個帳戶,您可以登入 Keycloak 管理主控台,您可以在其中建立領域和使用者,並註冊受 Keycloak 保護的應用程式。

在本機主機上建立帳戶

如果您的伺服器可以從 localhost 存取,請執行以下步驟。

程序
  1. 在網頁瀏覽器中,前往 https://127.0.0.1:8080 URL。

  2. 提供您記得的的使用者名稱和密碼。

    歡迎頁面

    Welcome page

遠端建立帳戶

如果您無法從 localhost 位址存取伺服器,或只是想從命令列啟動 Keycloak,請使用 KC_BOOTSTRAP_ADMIN_USERNAMEKC_BOOTSTRAP_ADMIN_PASSWORD 環境變數來建立初始管理員帳戶。

例如

export KC_BOOTSTRAP_ADMIN_USERNAME=<username>
export KC_BOOTSTRAP_ADMIN_PASSWORD=<password>

bin/kc.[sh|bat] start

設定領域

一旦您有了管理主控台的管理員帳戶,就可以設定領域。領域是您管理物件(包括使用者、應用程式、角色和群組)的空間。使用者屬於一個領域並登入該領域。一個 Keycloak 部署可以定義、儲存和管理資料庫中允許的任何數量的領域。

使用管理主控台

您可以在 Keycloak 管理主控台中設定領域並執行大多數管理工作。

先決條件
程序
  1. 前往管理主控台的 URL。

    例如,對於 localhost,請使用此 URL:https://127.0.0.1:8080/admin/

    登入頁面

    Login page

  2. 輸入您在歡迎頁面或透過環境變數建立的使用者名稱和密碼,如建立初始管理員使用者指南所述。此操作會顯示管理主控台。

    管理主控台

    Admin Console

  3. 請注意您可以使用功能表和其他選項

    • 點擊標記為 Master 的功能表,以選擇您要管理的領域或建立一個新的領域。

    • 點擊右上角的列表以檢視您的帳戶或登出。

    • 將滑鼠游標懸停在問號 ? 圖示上,以顯示描述該欄位的工具提示文字。上面的影像顯示了工具提示的運作方式。

    • 點擊問號 ? 圖示,以顯示描述該欄位的工具提示文字。上面的影像顯示了工具提示的運作方式。

從管理主控台匯出的檔案不適合用於備份或伺服器之間的資料傳輸。只有啟動時間匯出才適合用於備份或伺服器之間的資料傳輸。

主領域

在管理主控台中,存在兩種領域

  • 主領域 - 此領域是在您第一次啟動 Keycloak 時為您建立的。它包含您在第一次登入時建立的管理員帳戶。僅使用領域來建立和管理系統中的領域。

  • 其他領域 - 這些領域是由主領域中的管理員建立的。在這些領域中,管理員會管理您組織中的使用者及其需要的應用程式。應用程式歸使用者所有。

領域和應用程式

Realms and applications

領域彼此隔離,只能管理和驗證它們控制的使用者。遵循此安全性模型有助於防止意外變更,並遵循僅允許使用者帳戶存取成功完成目前任務所需的權限和權力的傳統。

其他資源
  • 如果您想停用領域並在您建立的任何新領域中定義管理員帳戶,請參閱專用領域管理主控台。每個領域都有其自己的專用管理主控台,您可以使用本機帳戶登入。

建立領域

您建立領域是為了提供管理空間,您可以在其中建立使用者並授予他們使用應用程式的權限。在首次登入時,您通常位於領域,這是您在其中建立其他領域的頂級領域。

在決定您需要哪些領域時,請考慮您希望為您的使用者和應用程式提供哪種隔離。例如,您可能會為您公司的員工建立一個領域,並為您的客戶建立一個單獨的領域。您的員工將登入員工領域,並且只能造訪公司內部應用程式。客戶將登入客戶領域,並且只能與面向客戶的應用程式互動。

程序
  1. 點擊 master realm 旁邊的 Keycloak,然後點擊 建立領域

    新增領域功能表

    Add realm menu

  2. 輸入領域的名稱。

  3. 點擊 建立

    建立領域

    Create realm

    目前的領域現在設定為您剛建立的領域。您可以透過點擊功能表中的領域名稱來在領域之間切換。

設定領域的 SSL

每個領域都有一個相關聯的 SSL 模式,該模式定義了與領域互動的 SSL/HTTPS 要求。與領域互動的瀏覽器和應用程式必須遵循 SSL 模式定義的 SSL/HTTPS 要求,否則它們無法與伺服器互動。

程序
  1. 點擊功能表中的 領域設定

  2. 點擊 一般 標籤。

    一般標籤

    General Tab

  3. 需要 SSL 設定為以下 SSL 模式之一

    • 外部請求 只要使用者堅持使用私有 IPv4 位址(例如 localhost127.0.0.110.x.x.x192.168.x.x172.16.x.x 或 IPv6 連結本機和唯一本機位址),使用者就可以在沒有 SSL 的情況下與 Keycloak 互動。如果您嘗試從非私有 IP 位址在沒有 SSL 的情況下存取 Keycloak,您將會收到錯誤。

    • Keycloak 不需要 SSL。此選擇僅適用於您在實驗且不打算支援此部署時的開發。

    • 所有請求 Keycloak 需要所有 IP 位址的 SSL。

設定領域的電子郵件

Keycloak 會向使用者傳送電子郵件以驗證他們的電子郵件地址、在他們忘記密碼時,或在管理員需要接收有關伺服器事件的通知時。若要讓 Keycloak 能夠傳送電子郵件,請向 Keycloak 提供您的 SMTP 伺服器設定。

程序
  1. 點擊功能表中的 領域設定

  2. 點擊 電子郵件 標籤。

    電子郵件標籤

    Email Tab

  3. 根據需要填寫欄位並切換開關。

範本
寄件者

寄件者 表示用於傳送電子郵件的 寄件者 SMTP 標頭的位址。

寄件者顯示名稱

寄件者顯示名稱 允許設定使用者友善的電子郵件地址別名(選用)。如果未設定,則會在電子郵件用戶端中顯示純 寄件者 電子郵件地址。

回覆至

回覆至 表示用於傳送郵件的 回覆至 SMTP 標頭的位址(選用)。如果未設定,則會使用純 寄件者 電子郵件地址。

回覆至顯示名稱

回覆至顯示名稱 允許設定使用者友善的電子郵件地址別名(選用)。如果未設定,則會顯示純 回覆至 電子郵件地址。

信封寄件者

信封寄件者 表示用於傳送郵件的 返回路徑 SMTP 標頭的 退回地址(選用)。

連線與驗證
主機

主機 表示用於傳送電子郵件的 SMTP 伺服器主機名稱。

連接埠

連接埠 表示 SMTP 伺服器連接埠。

加密

勾選其中一個核取方塊以支援發送電子郵件來恢復使用者名稱和密碼,特別是當 SMTP 伺服器位於外部網路時。您很可能需要將連接埠變更為 465,這是 SSL/TLS 的預設連接埠。

驗證

如果您的 SMTP 伺服器需要驗證,請將此開關設定為開啟。出現提示時,請提供使用者名稱密碼密碼欄位的值可以參考來自外部金鑰庫的值。

設定主題

對於給定的領域,您可以使用主題變更 Keycloak 中任何 UI 的外觀。

程序
  1. 在選單中點擊領域設定

  2. 點擊主題索引標籤。

    主題索引標籤

    Themes tab

  3. 為每個 UI 類別選擇您想要的主題,然後點擊儲存

    登入主題

    使用者名稱密碼輸入、OTP 輸入、新使用者註冊以及其他與登入相關的類似畫面。

    帳戶主題

    使用者用來管理其帳戶的控制台。

    管理控制台主題

    Keycloak 管理控制台的外觀。

    電子郵件主題

    每當 Keycloak 必須發送電子郵件時,它會使用此主題中定義的範本來製作電子郵件。

其他資源

啟用國際化

Keycloak 中的每個 UI 畫面都已國際化。預設語言為英文,但您可以選擇要支援的語言環境以及預設語言環境。

程序
  1. 在選單中點擊領域設定

  2. 點擊本地化索引標籤。

  3. 啟用國際化

  4. 選擇您要支援的語言。

    本地化索引標籤

    Localization tab

    下次使用者登入時,該使用者可以在登入頁面上選擇一種語言,以用於登入畫面、帳戶控制台和管理控制台。

其他資源
  • 伺服器開發人員指南說明如何提供其他語言。主題提供的所有國際化文字都可以被本地化索引標籤上特定於領域的文字覆寫。

使用者語言環境選擇

語言環境選擇器提供者會根據可用的資訊建議最佳語言環境。但是,使用者通常是未知的。因此,先前經過驗證的使用者的語言環境會儲存在持久的 Cookie 中。

選擇語言環境的邏輯使用以下可用的第一項

  • 使用者選取 - 當使用者使用下拉式語言環境選擇器選取了語言環境時

  • 使用者個人資料 - 當有經過驗證的使用者,且該使用者設定了偏好的語言環境時

  • 用戶端選取 - 由用戶端傳遞,例如使用 ui_locales 參數

  • Cookie - 瀏覽器上次選取的語言環境

  • 接受的語言 - 來自 Accept-Language 標頭的語言環境

  • 領域預設

  • 如果以上皆無,則退回英文

當使用者經過驗證時,會觸發一個動作來更新前面提到的持久 Cookie 中的語言環境。如果使用者已在登入頁面上透過語言環境選擇器主動切換語言環境,則使用者的語言環境也會在此時更新。

如果您想要變更選擇語言環境的邏輯,您可以選擇建立自訂的 LocaleSelectorProvider。如需詳細資訊,請參閱伺服器開發人員指南

控制登入選項

Keycloak 包含數個內建的登入頁面功能。

啟用忘記密碼

如果您啟用 忘記密碼,使用者如果忘記密碼或遺失 OTP 產生器,可以重設其登入憑證。

程序
  1. 點擊功能表中的 領域設定

  2. 點擊登入索引標籤。

    登入索引標籤

    Login Tab

  3. 忘記密碼切換為開啟

    您的登入頁面會顯示 忘記密碼?連結。

    忘記密碼連結

    Forgot Password Link

  4. 電子郵件索引標籤中指定 主機寄件者,以便 Keycloak 能夠傳送重設電子郵件。

  5. 點擊此連結以將使用者帶到他們可以輸入使用者名稱或電子郵件地址的地方,並接收一封包含重設憑證連結的電子郵件。

    忘記密碼頁面

    Forgot Password Page

電子郵件中傳送的文字是可設定的。如需更多資訊,請參閱伺服器開發人員指南

當使用者點擊電子郵件連結時,Keycloak 會要求他們更新密碼,如果他們設定了 OTP 產生器,Keycloak 會要求他們重新設定 OTP 產生器。根據您組織的安全性要求,您可能不希望使用者透過電子郵件重設其 OTP 產生器。

若要變更此行為,請執行下列步驟

程序
  1. 在選單中點擊驗證

  2. 點擊流程索引標籤。

  3. 選取重設憑證流程。

    重設憑證流程

    Reset Credentials Flow

    如果您不想重設 OTP,請將 重設 - 條件式 OTP 子流程要求設定為停用

  4. 在選單中點擊驗證

  5. 點擊必要動作索引標籤。

  6. 確認已啟用更新密碼

    必要動作

    Required Actions

啟用記住我

已登入的使用者關閉其瀏覽器會終止其工作階段,而該使用者必須再次登入。如果該使用者在登入時點擊記住我核取方塊,您可以將 Keycloak 設定為保持使用者的登入工作階段開啟。此動作會將登入 Cookie 從僅限工作階段的 Cookie 變更為持久的 Cookie。

程序
  1. 點擊功能表中的 領域設定

  2. 點擊登入索引標籤。

  3. 記住我開關切換為開啟

    登入索引標籤

    Login Tab Remember Me

    當您儲存此設定時,領域的登入頁面會顯示 記住我核取方塊。

    記住我

    Remember Me

ACR 到驗證等級 (LoA) 對應

在領域的一般設定中,您可以定義哪個 驗證內容類別參考 (ACR) 值對應到哪個 驗證等級 (LoA)。ACR 可以是任何值,而 LoA 必須是數值。acr 宣告可以在 OIDC 請求中傳送的 claimsacr_values 參數中請求,並且也包含在存取權杖和 ID 權杖中。對應的數字會用於驗證流程條件中。

如果特定用戶端需要使用與領域不同的值,也可以在用戶端層級指定對應。但是,最佳做法是堅持使用領域對應。

ACR to LoA mapping

如需更多詳細資訊,請參閱逐步驗證官方 OIDC 規格

更新電子郵件工作流程 (UpdateEmail)

使用此工作流程,使用者必須使用 UPDATE_EMAIL 動作來變更自己的電子郵件地址。

此動作與單一電子郵件輸入表單相關聯。如果領域停用了電子郵件驗證,此動作將允許在沒有驗證的情況下更新電子郵件。如果領域啟用了電子郵件驗證,此動作將傳送電子郵件更新動作權杖到新的電子郵件地址,而不會變更帳戶電子郵件。只有觸發動作權杖才會完成電子郵件更新。

應用程式能夠透過將 UPDATE_EMAIL 作為AIA (應用程式起始的動作)來將其使用者傳送到電子郵件更新表單。

UpdateEmail 是預覽,並且未完全支援。此功能預設為停用。

若要啟用,請使用 --features=preview--features=update-email 啟動伺服器

如果您啟用此功能,並且正在從先前的版本移轉,請在您的領域中啟用更新電子郵件必要動作。否則,使用者將無法更新其電子郵件地址。

設定領域金鑰

Keycloak 使用的驗證協定需要密碼簽章,有時也需要加密。Keycloak 使用非對稱金鑰配對 (私密金鑰和公開金鑰) 來完成此操作。

Keycloak 一次只會有一個有效的金鑰配對,但也可以有多個被動金鑰。有效金鑰配對用於建立新的簽名,而被動金鑰配對可用於驗證先前的簽名。這使得定期輪換金鑰成為可能,而不會對使用者造成任何停機或中斷。

建立 realm 時,會自動產生金鑰配對和自我簽署憑證。

程序
  1. 點擊功能表中的 領域設定

  2. 點擊 金鑰

  3. 從篩選下拉選單中選擇 被動金鑰 以檢視被動金鑰。

  4. 從篩選下拉選單中選擇 已停用金鑰 以檢視已停用金鑰。

金鑰配對的狀態可以是 Active (啟用中),但仍可能未被選為 realm 目前使用的有效金鑰配對。用於簽名的選定有效配對,是根據第一個能夠提供有效金鑰配對且依優先順序排序的金鑰提供者來選定的。

輪換金鑰

我們建議您定期輪換金鑰。首先,建立優先順序高於現有有效金鑰的新金鑰。您也可以建立與先前金鑰相同優先順序的新金鑰,並將先前的金鑰設為被動。

一旦新的金鑰可用,所有新的權杖和 Cookie 都將使用新的金鑰簽署。當使用者向應用程式驗證身分時,SSO Cookie 會以新的簽名更新。當 OpenID Connect 權杖更新時,新的權杖會使用新的金鑰簽署。最終,所有 Cookie 和權杖都將使用新的金鑰,過一段時間後,舊的金鑰即可移除。

刪除舊金鑰的頻率是在安全性與確保所有 Cookie 和權杖都更新之間的一種權衡。考慮每三到六個月建立新的金鑰,並在建立新金鑰後的一到兩個月刪除舊的金鑰。如果使用者在新金鑰新增到舊金鑰移除期間處於非活動狀態,則該使用者必須重新驗證身分。

輪換金鑰也適用於離線權杖。為了確保它們已更新,應用程式需要在移除舊金鑰之前重新整理權杖。

新增產生的金鑰配對

使用此程序產生金鑰配對,包括自我簽署憑證。

程序
  1. 在管理主控台中選取 realm。

  2. 點擊功能表中的 領域設定

  3. 點擊 金鑰 索引標籤。

  4. 點擊 提供者 索引標籤。

  5. 點擊 新增提供者 並選取 rsa-generated

  6. 優先順序 欄位中輸入一個數字。此數字決定新的金鑰配對是否會成為有效的金鑰配對。最高的數字會使金鑰配對生效。

  7. 選取 AES 金鑰大小 的值。

  8. 點擊 儲存

變更提供者的優先順序不會導致金鑰重新產生,但如果您想變更金鑰大小,您可以編輯提供者,系統會產生新的金鑰。

透過擷取憑證輪換金鑰

您可以透過從 RSA 產生的金鑰配對中擷取憑證,並在新金鑰儲存區中使用該憑證來輪換金鑰。

先決條件
  • 產生的金鑰配對

程序
  1. 在管理主控台中選取 realm。

  2. 點擊 Realm 設定

  3. 點擊 金鑰 索引標籤。

    會顯示 有效 金鑰清單。

  4. 在具有 RSA 金鑰的列上,點擊 公開金鑰 下方的 憑證

    憑證會以文字形式顯示。

  5. 將憑證儲存到檔案,並將其包在這些行中。

    ----Begin Certificate----
    <Output>
    ----End Certificate----
  6. 使用 keytool 命令將金鑰檔案轉換為 PEM 格式。

  7. 從金鑰儲存區中移除目前的 RSA 公開金鑰憑證。

    keytool -delete -keystore <keystore>.jks -storepass <password> -alias <key>
  8. 將新憑證匯入金鑰儲存區

    keytool -importcert -file domain.crt -keystore <keystore>.jks -storepass <password>  -alias <key>
  9. 重新建置應用程式。

    mvn clean install wildfly:deploy

新增現有的金鑰配對和憑證

若要新增從其他地方取得的金鑰配對和憑證,請選取 提供者,然後從下拉選單中選擇 rsa。您可以變更優先順序,以確保新的金鑰配對成為有效的金鑰配對。

先決條件
  • 私密金鑰檔案。檔案必須是 PEM 格式。

程序
  1. 在管理主控台中選取 realm。

  2. 點擊 Realm 設定

  3. 點擊 金鑰 索引標籤。

  4. 點擊 提供者 索引標籤。

  5. 點擊 新增提供者 並選取 rsa

  6. 優先順序 欄位中輸入一個數字。此數字決定新的金鑰配對是否會成為有效的金鑰配對。

  7. 點擊 私密 RSA 金鑰 旁邊的 瀏覽…,以上傳私密金鑰檔案。

  8. 如果您有私密金鑰的已簽署憑證,請點擊 X509 憑證 旁邊的 瀏覽…,以上傳憑證檔案。如果您沒有上傳憑證,Keycloak 會自動產生自我簽署憑證。

  9. 點擊 儲存

從 Java 金鑰儲存區載入金鑰

若要新增儲存在主機上的 Java 金鑰儲存區檔案中的金鑰配對和憑證,請選取 提供者,然後從下拉選單中選擇 java-keystore。您可以變更優先順序,以確保新的金鑰配對成為有效的金鑰配對。

若要載入相關聯的憑證鏈,必須將其匯入到 Java 金鑰儲存區檔案,並使用與載入金鑰配對相同的 金鑰別名

程序
  1. 在管理主控台中選取 realm。

  2. 點擊功能表中的 領域設定

  3. 點擊 金鑰 索引標籤。

  4. 點擊 提供者 索引標籤。

  5. 點擊 新增提供者 並選取 java-keystore

  6. 優先順序 欄位中輸入一個數字。此數字決定新的金鑰配對是否會成為有效的金鑰配對。

  7. 輸入所需的 演算法。請注意,演算法應與金鑰類型相符 (例如,RS256 需要 RSA 私密金鑰,ES256 需要 EC 私密金鑰,或 AES 需要 AES 密碼金鑰)。

  8. 輸入 金鑰儲存區 的值。這是金鑰儲存區檔案的路徑。

  9. 輸入 金鑰儲存區密碼。此選項可以參考外部 保管庫 的值。

  10. 輸入 金鑰儲存區類型 的值 (JKSPKCS12BCFKS)。

  11. 輸入 金鑰別名 的值,以從金鑰儲存區載入。

  12. 輸入 金鑰密碼。此選項可以參考外部 保管庫 的值。

  13. 輸入 金鑰用途 的值 (sig 用於簽署或 enc 用於加密)。請注意,用途應與演算法類型相符 (例如,RS256sig,但 RSA-OAEPenc)

  14. 點擊 儲存

並非所有金鑰儲存區類型都支援所有類型的金鑰。例如,所有模式中的 JKS 和 FIPS 模式 (BCFIPS 提供者) 中的 PKCS12 無法儲存密碼金鑰項目。

將金鑰設為被動

程序
  1. 在管理主控台中選取 realm。

  2. 點擊功能表中的 領域設定

  3. 點擊 金鑰 索引標籤。

  4. 點擊 提供者 索引標籤。

  5. 點擊您要設為被動的金鑰的提供者。

  6. 啟用中 切換為 關閉

  7. 點擊 儲存

停用金鑰

程序
  1. 在管理主控台中選取 realm。

  2. 點擊功能表中的 領域設定

  3. 點擊 金鑰 索引標籤。

  4. 點擊 提供者 索引標籤。

  5. 點擊您要設為被動的金鑰的提供者。

  6. 已啟用 切換為 關閉

  7. 點擊 儲存

金鑰遭洩漏

Keycloak 會將簽署金鑰僅儲存在本機,且永遠不會與用戶端應用程式、使用者或其他實體共用。但是,如果您認為您的 realm 簽署金鑰已遭洩漏,您應該先如上所述產生新的金鑰配對,然後立即移除遭洩漏的金鑰配對。

或者,您可以從 提供者 表格中刪除提供者。

程序
  1. 在選單中點擊 用戶端

  2. 點擊 security-admin-console

  3. 向下捲動至 存取設定 區段。

  4. 填寫 管理員 URL 欄位。

  5. 點擊 進階 索引標籤。

  6. 撤銷 區段中點擊 設為現在

  7. 點擊 推送

推送 not-before 原則可確保用戶端應用程式不接受遭洩漏金鑰所簽署的現有權杖。用戶端應用程式會強制從 Keycloak 下載新的金鑰配對,因此遭洩漏金鑰所簽署的權杖將失效。

REST 和機密用戶端必須設定 管理員 URL,以便 Keycloak 可以將推送的 not-before 原則要求傳送給用戶端。

使用外部儲存

組織可以擁有包含資訊、密碼和其他憑證的資料庫。通常,您無法將現有的資料儲存遷移到 Keycloak 部署,因此 Keycloak 可以聯合現有的外部使用者資料庫。Keycloak 支援 LDAP 和 Active Directory,但您也可以使用 Keycloak 使用者儲存 SPI 為任何自訂使用者資料庫編寫擴充功能。

當使用者嘗試登入時,Keycloak 會檢查該使用者的儲存空間以尋找該使用者。如果 Keycloak 找不到使用者,Keycloak 會疊代處理 realm 的每個使用者儲存提供者,直到找到相符的項目。然後,來自外部資料儲存的資料會對應到 Keycloak 執行階段所使用的標準使用者模型。然後,此使用者模型會對應到 OIDC 權杖宣告和 SAML 判斷提示屬性。

外部使用者資料庫很少具有支援 Keycloak 所有功能所需的資料,因此使用者儲存提供者可以選擇在本機的 Keycloak 使用者資料儲存中儲存項目。提供者可以在本機匯入使用者,並定期與外部資料儲存同步。此方法取決於提供者的功能和提供者的組態。例如,您的外部使用者資料儲存可能不支援 OTP。OTP 可以由 Keycloak 處理和儲存,這取決於提供者。

新增提供者

若要新增儲存提供者,請執行下列程序

程序
  1. 在選單中點擊 使用者聯合

    使用者聯合

    User federation

  2. 從列出的卡片中選取提供者類型卡片。

    Keycloak 會將您帶到該提供者的組態頁面。

處理提供者失敗

如果使用者儲存提供者失敗,您可能無法登入和檢視管理主控台中的使用者。當使用儲存提供者尋找使用者時,Keycloak 不會偵測到失敗,因此它會取消叫用。如果您有一個優先順序高的儲存提供者在使用者查詢期間失敗,則登入或使用者查詢會失敗並出現例外狀況,而且不會容錯移轉到下一個已設定的提供者。

在任何 LDAP 或自訂使用者儲存提供者之前,Keycloak 會先搜尋本機 Keycloak 使用者資料庫以解析使用者。如果連線到您的 LDAP 和後端時發生問題,請考慮在本機 Keycloak 使用者資料庫中建立管理員帳戶。

每個 LDAP 和自訂使用者儲存提供者在其管理主控台頁面上都有一個 啟用 切換。停用使用者儲存提供者會在執行查詢時略過該提供者,因此您可以檢視和登入優先順序較低的另一個提供者中的使用者帳戶。如果您的提供者使用 匯入 策略並已停用,則匯入的使用者仍可以唯讀模式進行查詢。

當儲存提供者查詢失敗時,Keycloak 不會容錯移轉,因為使用者資料庫通常在其間具有重複的使用者名稱或重複的電子郵件。重複的使用者名稱和電子郵件可能會導致問題,因為當管理員希望從另一個資料儲存載入使用者時,使用者會從一個外部資料儲存載入。

輕量型目錄存取協定 (LDAP) 和 Active Directory

Keycloak 包含 LDAP/AD 提供者。您可以在一個 Keycloak realm 中聯合多個不同的 LDAP 伺服器,並將 LDAP 使用者屬性對應到 Keycloak 通用使用者模型。

根據預設,Keycloak 會對應使用者帳戶的使用者名稱、電子郵件、名字和姓氏,但您也可以設定其他 對應。Keycloak 的 LDAP/AD 提供者支援使用 LDAP/AD 通訊協定的密碼驗證和儲存、編輯和同步模式。

設定聯合 LDAP 儲存

程序
  1. 在選單中點擊 使用者聯合

    使用者聯合

    User federation

  2. 點擊 新增 LDAP 提供者

    Keycloak 會將您帶到 LDAP 設定頁面。

儲存模式

Keycloak 會將使用者從 LDAP 匯入到本機 Keycloak 使用者資料庫。這個使用者資料庫的副本會根據需要或透過定期背景工作同步。密碼同步是個例外。Keycloak 絕不會匯入密碼。密碼驗證一律在 LDAP 伺服器上進行。

同步的優點是,所有 Keycloak 功能都能有效運作,因為任何需要的額外使用者資料都會儲存在本機。缺點是,每當 Keycloak 第一次查詢特定使用者時,Keycloak 都會執行對應的資料庫插入。

您可以與 LDAP 伺服器同步匯入。當 LDAP 對應器總是從 LDAP 而非資料庫讀取特定屬性時,匯入同步是不必要的。

您可以在不將使用者匯入 Keycloak 使用者資料庫的情況下使用 LDAP 與 Keycloak。LDAP 伺服器會備份 Keycloak 執行階段使用的通用使用者模型。如果 LDAP 不支援 Keycloak 功能所需的資料,該功能將無法運作。這種方法的優點是,您不會有將 LDAP 使用者副本匯入和同步到 Keycloak 使用者資料庫的資源使用量。

LDAP 設定頁面上的 匯入使用者 開關控制此儲存模式。若要匯入使用者,請將此開關切換為 開啟

如果您停用 匯入使用者,您就無法將使用者設定檔屬性儲存到 Keycloak 資料庫。此外,您也無法儲存中繼資料,除了對應到 LDAP 的使用者設定檔中繼資料。此中繼資料可以包含角色對應、群組對應,以及基於 LDAP 對應器設定的其他中繼資料。

當您嘗試變更非 LDAP 對應的使用者資料時,將無法更新使用者。例如,您無法停用 LDAP 對應的使用者,除非該使用者的 enabled 旗標對應到 LDAP 屬性。

編輯模式

使用者和管理員可以修改使用者中繼資料,使用者透過帳戶主控台,管理員透過管理主控台。LDAP 設定頁面上的 編輯模式 設定定義了使用者的 LDAP 更新權限。

唯讀

您無法變更使用者名稱、電子郵件、名字、姓氏和其他對應的屬性。每當使用者嘗試更新這些欄位時,Keycloak 都會顯示錯誤。不支援密碼更新。

可寫入

您可以變更使用者名稱、電子郵件、名字、姓氏和其他對應的屬性和密碼,並將它們自動與 LDAP 存放區同步。

未同步

Keycloak 會將使用者名稱、電子郵件、名字、姓氏和密碼的變更儲存在 Keycloak 本機儲存區中,因此管理員必須將這些資料同步回 LDAP。在此模式下,Keycloak 部署可以在唯讀 LDAP 伺服器上更新使用者中繼資料。當從 LDAP 將使用者匯入本機 Keycloak 使用者資料庫時,此選項也適用。

當 Keycloak 建立 LDAP 提供者時,Keycloak 也會建立一組初始的LDAP 對應器。Keycloak 會根據 廠商編輯模式匯入使用者 開關的組合來設定這些對應器。例如,當編輯模式為 UNSYNCED 時,Keycloak 會將對應器設定為從資料庫而非 LDAP 伺服器讀取特定的使用者屬性。但是,如果您稍後變更編輯模式,對應器的設定不會變更,因為無法偵測到 UNSYNCED 模式中的設定變更。建立 LDAP 提供者時,請決定 編輯模式。此注意事項也適用於 匯入使用者 開關。

其他設定選項

主控台顯示名稱

要在管理主控台中顯示的提供者名稱。

優先順序

在查找使用者或新增使用者時,提供者的優先順序。

同步註冊

如果您希望將 Keycloak 建立的新使用者新增到 LDAP,請將此開關切換為 開啟

允許 Kerberos 驗證

在從 LDAP 布建使用者資料的領域中啟用 Kerberos/SPNEGO 驗證。如需更多資訊,請參閱Kerberos 章節

其他選項

將滑鼠指標懸停在管理主控台中的工具提示上方,以查看有關這些選項的更多詳細資訊。

透過 SSL 連線到 LDAP

當您設定與 LDAP 存放區的安全連線 URL (例如,ldaps://myhost.com:636) 時,Keycloak 會使用 SSL 與 LDAP 伺服器通訊。在 Keycloak 伺服器端設定信任存放區,以便 Keycloak 可以信任與 LDAP 的 SSL 連線 - 請參閱設定信任存放區指南。

使用信任存放區 SPI 設定屬性已過時。它通常應保留為 Always

將 LDAP 使用者同步到 Keycloak

如果您設定了 匯入使用者 選項,LDAP 提供者會處理將 LDAP 使用者匯入到 Keycloak 本機資料庫。當使用者第一次登入或作為使用者查詢的一部分傳回時 (例如,使用管理主控台中的搜尋欄位),LDAP 提供者會將 LDAP 使用者匯入到 Keycloak 資料庫。在驗證期間,會驗證 LDAP 密碼。

如果您想要將所有 LDAP 使用者同步到 Keycloak 資料庫,請在 LDAP 提供者設定頁面上設定並啟用 同步設定

存在兩種同步類型

定期完整同步

此類型會將所有 LDAP 使用者同步到 Keycloak 資料庫。Keycloak 中已有的 LDAP 使用者,但在 LDAP 中不同的使用者,會直接在 Keycloak 資料庫中更新。

定期變更的使用者同步

同步時,Keycloak 只會建立或更新上次同步後建立或更新的使用者。

最佳的同步方式是,當您第一次建立 LDAP 提供者時,按一下 同步所有使用者,然後設定定期同步變更的使用者。

LDAP 對應器

LDAP 對應器是 LDAP 提供者觸發的 接聽器。它們提供 LDAP 整合的其他擴充點。當下列情況時,會觸發 LDAP 對應器

  • 使用者使用 LDAP 登入。

  • 使用者首次註冊。

  • 管理主控台查詢使用者。

當您建立 LDAP 聯合提供者時,Keycloak 會自動為此提供者提供一組 對應器。使用者可以變更此組,他們也可以開發對應器或更新/刪除現有的對應器。

使用者屬性對應器

此對應器指定哪個 LDAP 屬性對應到 Keycloak 使用者的屬性。例如,您可以將 mail LDAP 屬性設定為 Keycloak 資料庫中的 email 屬性。對於此對應器實作,始終存在一對一對應。

全名對應器

此對應器指定使用者的全名。Keycloak 會將名稱儲存在 LDAP 屬性 (通常是 cn) 中,並將名稱對應到 Keycloak 資料庫中的 firstNamelastname 屬性。讓 cn 包含使用者的全名在 LDAP 部署中很常見。

當您在 Keycloak 中註冊新使用者,且 LDAP 提供者的 同步註冊 為開啟時,全名對應器允許回退到使用者名稱。當使用 Microsoft Active Directory (MSAD) 時,此回退很有用。MSAD 的常見設定是將 cn LDAP 屬性設定為 fullName,同時在 LDAP 提供者設定中使用 cn LDAP 屬性作為 RDN LDAP 屬性。透過此設定,Keycloak 會回退到使用者名稱。例如,如果您建立 Keycloak 使用者「john123」並將 firstName 和 lastName 留空,則全名對應器會將「john123」儲存為 LDAP 中 cn 的值。當您稍後為 firstName 和 lastName 輸入「John Doe」時,全名對應器會將 LDAP cn 更新為「John Doe」值,因為回退到使用者名稱是不必要的。

硬式編碼屬性對應器

此對應器會將硬式編碼屬性值新增到每個連結到 LDAP 的 Keycloak 使用者。此對應器也可以強制設定 enabledemailVerified 使用者屬性的值。

角色對應器

此對應器會設定從 LDAP 到 Keycloak 角色對應的角色對應。單個角色對應器可以將 LDAP 角色 (通常是 LDAP 樹狀結構特定分支中的群組) 對應到與指定用戶端的領域角色或用戶端角色對應的角色。您可以為同一個 LDAP 提供者設定更多角色對應器。例如,您可以指定 ou=main,dc=example,dc=org 下的群組的角色對應對應到領域角色對應,而 ou=finance,dc=example,dc=org 下的群組的角色對應對應到用戶端 finance 的用戶端角色對應。

硬式編碼角色對應器

此對應器會將指定的 Keycloak 角色授予 LDAP 提供者的每個 Keycloak 使用者。

群組對應器

此對應器會將 LDAP 樹狀結構分支中的 LDAP 群組對應到 Keycloak 中的群組。此對應器也會將使用者群組對應從 LDAP 傳播到 Keycloak 中的使用者群組對應。

MSAD 使用者帳戶對應器

此對應器專用於 Microsoft Active Directory (MSAD)。它可以將 MSAD 使用者帳戶狀態整合到 Keycloak 帳戶狀態,例如已啟用帳戶或已過期的密碼。此對應器使用 userAccountControlpwdLastSet LDAP 屬性,這些屬性特定於 MSAD 且不是 LDAP 標準。例如,如果 pwdLastSet 的值為 0,則 Keycloak 使用者必須更新其密碼。結果是將 UPDATE_PASSWORD 必要動作新增到使用者。如果 userAccountControl 的值為 514 (已停用帳戶),則會停用 Keycloak 使用者。

憑證對應器

此對應器會對應 X.509 憑證。Keycloak 會將其與 X.509 驗證和 PEM 格式的完整憑證 一起用作身分來源。此對應器的行為類似於 使用者屬性對應器,但 Keycloak 可以篩選儲存 PEM 或 DER 格式憑證的 LDAP 屬性。使用此對應器啟用 始終從 LDAP 讀取值

將基本 Keycloak 使用者屬性 (例如使用者名稱、名字、姓氏和電子郵件) 對應到對應 LDAP 屬性的使用者屬性對應器。您可以擴充這些對應器並提供您自己的其他屬性對應。管理主控台提供工具提示,以協助設定對應的對應器。

密碼雜湊

當 Keycloak 更新密碼時,Keycloak 會以純文字格式傳送密碼。此動作與更新內建 Keycloak 資料庫中的密碼不同,在 Keycloak 中,Keycloak 會在將密碼傳送到資料庫之前雜湊並加鹽處理密碼。對於 LDAP,Keycloak 依賴 LDAP 伺服器來雜湊和加鹽處理密碼。

預設情況下,LDAP 伺服器(如 MSAD、RHDS 或 FreeIPA)會雜湊並加鹽處理密碼。其他 LDAP 伺服器(如 OpenLDAP 或 ApacheDS)則會以純文字儲存密碼,除非您使用 RFC3062 中描述的 LDAPv3 密碼修改擴展操作。請在 LDAP 設定頁面啟用 LDAPv3 密碼修改擴展操作。如需更多詳細資訊,請參閱您的 LDAP 伺服器的文件。

務必驗證使用者密碼是否已正確雜湊,而非以純文字儲存,方法是使用 ldapsearch 檢查已變更的目錄條目,並將 userPassword 屬性值以 base64 解碼。

設定連線池

為了在管理 LDAP 連線時提高效率,並在處理多個連線時改善效能,您可以啟用連線池。如此一來,當連線關閉時,它會返回池中供未來使用,從而降低不斷建立新連線的成本。

LDAP 連線池設定是使用以下系統屬性來設定的

名稱 說明

com.sun.jndi.ldap.connect.pool.authentication

可以放入池中的連線的以空格分隔的驗證類型列表。有效類型為「none」、「simple」和「DIGEST-MD5」

com.sun.jndi.ldap.connect.pool.initsize

一個整數的字串表示,表示在初始為身分建立連線時,每個連線身分要建立的連線數

com.sun.jndi.ldap.connect.pool.maxsize

一個整數的字串表示,表示每個連線身分可以同時維護的最大連線數

com.sun.jndi.ldap.connect.pool.prefsize

一個整數的字串表示,表示應該同時維護的每個連線身分的偏好連線數

com.sun.jndi.ldap.connect.pool.timeout

一個整數的字串表示,表示閒置連線在關閉並從池中移除之前可以在池中保留的毫秒數

com.sun.jndi.ldap.connect.pool.protocol

可以放入池中的連線的以空格分隔的協定類型列表。有效類型為「plain」和「ssl」

com.sun.jndi.ldap.connect.pool.debug

一個字串,表示要產生的除錯輸出層級。有效值為「fine」(追蹤連線建立和移除)和「all」(所有除錯資訊)

如需更多詳細資訊,請參閱 Java LDAP 連線池設定 文件。

若要設定任何這些屬性,您可以設定 JAVA_OPTS_APPEND 環境變數

export JAVA_OPTS_APPEND=-Dcom.sun.jndi.ldap.connect.pool.initsize=10 -Dcom.sun.jndi.ldap.connect.pool.maxsize=50

疑難排解

將類別 org.keycloak.storage.ldap 的記錄層級提高到 TRACE 會很有幫助。使用此設定,許多記錄訊息會以 TRACE 層級傳送到伺服器記錄檔,包括所有傳送到 LDAP 伺服器的查詢記錄,以及用於傳送查詢的參數。當您在使用者論壇或 JIRA 上建立任何 LDAP 問題時,請考慮附加啟用 TRACE 記錄的伺服器記錄檔。如果記錄檔太大,比較好的替代方法是僅包含伺服器記錄檔中在造成您問題的操作期間新增到記錄檔的訊息片段。

  • 當您建立 LDAP 提供者時,伺服器記錄檔中會出現一則以 INFO 層級開頭的訊息

Creating new LDAP Store for the LDAP storage provider: ...

它會顯示您的 LDAP 提供者的設定。在您提出問題或回報錯誤之前,最好包含此訊息以顯示您的 LDAP 設定。您可以選擇性地將您不想包含的一些組態變更替換為一些佔位符值。一個範例是 bindDn=some-placeholder。對於 connectionUrl,您也可以隨意替換它,但通常至少包含所使用的協定(ldap vs ldaps)會很有幫助。同樣地,包含您的 LDAP 對應器的設定詳細資訊也會很有幫助,這些詳細資訊會以類似這樣的訊息在 DEBUG 層級顯示

Mapper for provider: XXX, Mapper name: YYY, Provider: ZZZ ...

請注意,這些訊息只會在啟用 DEBUG 記錄時顯示。

  • 為了追蹤效能或連線池問題,請考慮將屬性 com.sun.jndi.ldap.connect.pool.debug 的值設定為 all。此變更會將許多額外的訊息新增到伺服器記錄檔中,包括 LDAP 連線池的記錄。因此,您可以追蹤與連線池或效能相關的問題。如需更多詳細資訊,請參閱設定連線池

變更連線池的設定後,您可能需要重新啟動 Keycloak 伺服器,以強制重新初始化 LDAP 提供者連線。

如果即使在伺服器重新啟動後也沒有出現更多關於連線池的訊息,則可能表示連線池不適用於您的 LDAP 伺服器。

  • 在回報 LDAP 問題時,您可以考慮附加部分包含目標資料的 LDAP 樹狀結構,這會在您的環境中造成問題。例如,如果某些使用者的登入時間很長,您可以考慮附加他的 LDAP 條目,顯示各種「群組」條目的 member 屬性計數。在這種情況下,如果那些群組條目對應到 Keycloak 中的某些群組 LDAP 對應器(或角色 LDAP 對應器),則新增這些資訊可能會很有用。

SSSD 和 FreeIPA 身分管理整合

Keycloak 包含 System Security Services Daemon (SSSD) 外掛程式。SSSD 是 Fedora 和 Red Hat Enterprise Linux (RHEL) 的一部分,它提供對多個身分和驗證提供者的存取。SSSD 也提供諸如容錯移轉和離線支援等優點。如需更多資訊,請參閱Red Hat Enterprise Linux 身分管理文件

SSSD 與 FreeIPA 身分管理 (IdM) 伺服器整合,提供驗證和存取控制。透過此整合,Keycloak 可以針對權限存取管理 (PAM) 服務進行驗證,並從 SSSD 擷取使用者資料。如需更多關於在 Linux 環境中使用 Red Hat 身分管理的資訊,請參閱 Red Hat Enterprise Linux 身分管理文件

keycloak sssd freeipa integration overview

Keycloak 和 SSSD 透過唯讀 D-Bus 介面進行通訊。因此,佈建和更新使用者的方式是使用 FreeIPA/IdM 管理介面。預設情況下,此介面會匯入使用者名稱、電子郵件、名字和姓氏。

Keycloak 會自動註冊群組和角色,但不會同步它們。Keycloak 管理員在 Keycloak 中進行的任何變更都不會與 SSSD 同步。

FreeIPA/IdM 伺服器

FreeIPA 容器映像可在 Quay.io 上取得。若要設定 FreeIPA 伺服器,請參閱 FreeIPA 文件

程序
  1. 使用此命令執行您的 FreeIPA 伺服器

     docker run --name freeipa-server-container -it \
     -h server.freeipa.local -e PASSWORD=YOUR_PASSWORD \
     -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
     -v /var/lib/ipa-data:/data:Z freeipa/freeipa-server

    帶有 server.freeipa.local 的參數 -h 表示 FreeIPA/IdM 伺服器主機名稱。將 YOUR_PASSWORD 變更為您自己的密碼。

  2. 容器啟動後,變更 /etc/hosts 檔案以包含

    x.x.x.x     server.freeipa.local

    如果您不做此變更,則必須設定 DNS 伺服器。

  3. 使用以下命令將您的 Linux 伺服器註冊到 IPA 網域中,以便 SSSD 聯盟提供者在 Keycloak 上啟動並執行

     ipa-client-install --mkhomedir -p admin -w password
  4. 在用戶端上執行以下命令以驗證安裝是否正常運作

     kinit admin
  5. 輸入您的密碼。

  6. 使用以下命令將使用者新增到 IPA 伺服器

    $ ipa user-add <username> --first=<first name> --last=<surname> --email=<email address> --phone=<telephoneNumber> --street=<street> --city=<city> --state=<state> --postalcode=<postal code> --password
  7. 使用 kinit 強制設定使用者的密碼。

     kinit <username>
  8. 輸入以下內容以還原正常的 IPA 操作

    kdestroy -A
    kinit admin

SSSD 和 D-Bus

聯盟提供者使用 D-BUS 從 SSSD 取得資料。它使用 PAM 對資料進行驗證。

程序
  1. 安裝 sssd-dbus RPM。

    $ sudo yum install sssd-dbus
  2. 執行以下佈建腳本

    $ bin/federation-sssd-setup.sh

    此腳本也可以用作設定 Keycloak 的 SSSD 和 PAM 的指南。它對 /etc/sssd/sssd.conf 進行以下變更

      [domain/your-hostname.local]
      ...
      ldap_user_extra_attrs = mail:mail, sn:sn, givenname:givenname, telephoneNumber:telephoneNumber
      ...
      [sssd]
      services = nss, sudo, pam, ssh, ifp
      ...
      [ifp]
      allowed_uids = root, yourOSUsername
      user_attributes = +mail, +telephoneNumber, +givenname, +sn

    ifp 服務會新增到 SSSD,並設定為允許 OS 使用者透過此介面查詢 IPA 伺服器。

    此腳本也會建立新的 PAM 服務 /etc/pam.d/keycloak,以透過 SSSD 驗證使用者

    auth    required   pam_sss.so
    account required   pam_sss.so
  3. 執行 dbus-send 以確保設定成功。

    dbus-send --print-reply --system --dest=org.freedesktop.sssd.infopipe /org/freedesktop/sssd/infopipe org.freedesktop.sssd.infopipe.GetUserAttr string:<username> array:string:mail,givenname,sn,telephoneNumber
    
    dbus-send --print-reply --system --dest=org.freedesktop.sssd.infopipe /org/freedesktop/sssd/infopipe org.freedesktop.sssd.infopipe.GetUserGroups string:<username>

    如果設定成功,每個命令都會分別顯示使用者的屬性和群組。如果發生逾時或錯誤,則在 Keycloak 上執行的聯盟提供者將無法擷取任何資料。此錯誤通常會發生,因為伺服器未註冊到 FreeIPA IdM 伺服器,或沒有存取 SSSD 服務的權限。

    如果您沒有存取 SSSD 服務的權限,請確保執行 Keycloak 伺服器的使用者位於 /etc/sssd/sssd.conf 檔案的以下章節中

    [ifp]
    allowed_uids = root, yourOSUsername

    並且在主機內建立了 ipaapi 系統使用者。此使用者對於 ifp 服務是必要的。請檢查使用者是否在系統中建立。

    grep ipaapi /etc/passwd
    ipaapi:x:992:988:IPA Framework User:/:/sbin/nologin

啟用 SSSD 聯盟提供者

Keycloak 使用 DBus-Java 專案以在低層級與 D-Bus 進行通訊,並使用 JNA 以透過作業系統可插拔驗證模組 (PAM) 進行驗證。

雖然現在 Keycloak 包含執行 SSSD 提供者所需的所有程式庫,但需要 JDK 21 版。因此,只有在主機組態正確且使用 JDK 21 執行 Keycloak 時,才會顯示 SSSD 提供者。

設定聯合 SSSD 儲存區

安裝後,設定聯合 SSSD 儲存區。

程序
  1. 在選單中點擊 使用者聯合

  2. 如果所有設定都成功,則會在頁面中顯示新增 Sssd 提供者按鈕。按一下它。

  3. 為新的提供者指定一個名稱。

  4. 點擊 儲存

現在您可以使用 FreeIPA/IdM 使用者和認證針對 Keycloak 進行驗證。

自訂提供者

Keycloak 確實具有使用者儲存聯盟的服務提供者介面 (SPI) 來開發自訂提供者。您可以在 伺服器開發人員指南中找到關於開發客戶提供者的文件。

管理使用者

從管理控制台,您可以執行各種操作來管理使用者。

建立使用者

您應該在使用者需要的應用程式所在的 Realm 中建立使用者。避免在 master Realm 中建立使用者,master Realm 僅用於建立其他 Realm。

先決條件
  • 您必須在 master Realm 以外的 Realm 中。

程序
  1. 在選單中點擊 使用者

  2. 點擊 新增使用者

  3. 輸入新使用者的詳細資訊。

    使用者名稱 是唯一必填欄位。
  4. 點擊 儲存。儲存詳細資訊後,會顯示新使用者的 管理 頁面。

管理使用者屬性

在 Keycloak 中,使用者會與一組屬性相關聯。這些屬性用於更好地描述和識別 Keycloak 內的使用者,並將有關他們的額外資訊傳遞給應用程式。

使用者設定檔定義了一個完善的綱要,用於表示使用者屬性以及它們在 Realm 中的管理方式。透過提供使用者資訊的一致視圖,管理員可以控制屬性管理的不同方面,並使其更容易擴展 Keycloak 以支援其他屬性。

儘管使用者設定檔主要針對終端使用者可以管理的屬性(例如:名字和姓氏、電話等),它也用於管理您想與使用者關聯的任何其他元數據。

在其他功能中,使用者設定檔使管理員能夠

  • 定義使用者屬性的綱要

  • 根據上下文資訊定義屬性是否為必要項目(例如:是否僅對使用者、管理員或兩者都是必要項目,或取決於請求的範圍。)

  • 定義檢視和編輯使用者屬性的特定權限,使得可以遵守嚴格的隱私要求,其中某些屬性不能被第三方(包括管理員)看到或更改

  • 動態實施使用者設定檔合規性,以便使用者資訊始終更新並符合與屬性關聯的元數據和規則

  • 透過利用內建的驗證器或編寫自訂驗證器,在每個屬性的基礎上定義驗證規則

  • 根據屬性定義,動態呈現使用者互動的表單,例如註冊、更新設定檔、代理和帳戶控制台中的個人資訊,而無需手動更改主題。

  • 自訂管理控制台中的使用者管理介面,以便根據使用者設定檔綱要動態呈現屬性

使用者設定檔綱要或設定使用 JSON 格式來表示屬性及其元數據。從管理控制台,您可以透過點擊左側選單中的 Realm 設定,然後點擊該頁面上的 使用者設定檔 標籤來管理設定。

在接下來的章節中,我們將了解如何建立您自己的使用者設定檔綱要或設定,以及如何管理屬性。

了解預設設定

預設情況下,Keycloak 提供基本的使用者設定檔設定,涵蓋一些最常見的使用者屬性

名稱 說明

使用者名稱

使用者名稱

電子郵件

終端使用者的偏好電子郵件地址。

名字

終端使用者給定的名稱或名字

姓氏

終端使用者的姓氏

在 Keycloak 中,usernameemail 屬性都有特殊的處理方式,因為它們通常用於識別、驗證和連結使用者帳戶。對於這些屬性,您只能變更其設定,而不能移除它們。

usernameemail 屬性的行為會根據您 Realm 的 登入 設定而變更。例如,變更 以電子郵件作為使用者名稱編輯使用者名稱 設定將會覆寫您在使用者設定檔設定中設定的任何設定。

正如您將在以下章節中看到的那樣,您可以自由地透過引入您自己的屬性或變更任何可用屬性的設定來變更預設設定,以使其更適合您的需求。

了解使用者設定檔上下文

在 Keycloak 中,使用者是透過不同的上下文進行管理的

  • 註冊

  • 更新設定檔

  • 透過代理或社交提供者進行驗證時檢閱設定檔

  • 帳戶控制台

  • 管理(例如:管理控制台和管理 REST API)

除了 管理 上下文之外,所有其他上下文都被視為終端使用者上下文,因為它們與使用者自助服務流程相關。

了解這些上下文對於了解您的使用者設定檔設定在管理使用者時將在何處生效非常重要。無論使用者在何種上下文下被管理,都將使用相同的使用者設定檔設定來呈現 UI 和驗證屬性值。

正如您將在以下章節中看到的那樣,您可以限制某些屬性僅在管理上下文中可用,並完全停用它們以供終端使用者使用。如果您不希望管理員存取某些使用者屬性,而只希望終端使用者存取,反之亦然。

了解受管理和不受管理的屬性

預設情況下,Keycloak 只會識別在您的使用者設定檔設定中定義的屬性。伺服器會忽略未在此處明確定義的任何其他屬性。

透過嚴格限制可以為您的使用者設定哪些使用者屬性,以及如何驗證其值,Keycloak 可以為您的 Realm 新增另一個防禦屏障,並幫助您防止與使用者相關聯的意外屬性和值。

也就是說,使用者屬性可以分類如下

  • 受管理。這些是由您的使用者設定檔控制的屬性,您希望允許終端使用者和管理員從任何使用者設定檔上下文進行管理。對於這些屬性,您希望完全控制它們的管理方式和時間。

  • 不受管理。這些是您沒有在使用者設定檔中明確定義的屬性,因此預設情況下會被 Keycloak 完全忽略。

儘管預設情況下停用了不受管理的屬性,您可以使用不同的策略來設定您的 Realm,以定義伺服器如何處理它們。為此,點擊左側選單中的 Realm 設定,點擊 一般 標籤,然後從 不受管理的屬性 設定中選擇以下任何選項

  • 已停用。這是預設策略,以便從所有使用者設定檔上下文中停用不受管理的屬性。

  • 已啟用。此策略會針對所有使用者設定檔上下文啟用不受管理的屬性。

  • 管理員可以檢視。此策略僅允許從管理上下文中讀取不受管理的屬性。

  • 管理員可以編輯。此策略僅允許從管理上下文中讀取和寫入不受管理的屬性。

這些策略讓您可以精細控制伺服器如何處理不受管理的屬性。您可以選擇完全停用或僅在透過管理上下文管理使用者時支援不受管理的屬性。

啟用不受管理的屬性時(即使是部分啟用),您也可以從使用者詳細資訊 UI 的 屬性 標籤中的管理控制台管理它們。如果策略設定為 已停用,則此標籤不可用。

作為安全建議,請盡可能遵守最嚴格的策略(例如:已停用管理員可以編輯),以防止使用者在透過終端使用者上下文管理其設定檔時為其設定意外的屬性(和值)。避免設定 已啟用 策略,並優先在您的控制下,在您的使用者設定檔設定中定義所有終端使用者可以管理的屬性。

已啟用 策略針對的是從先前版本的 Keycloak 移轉的 Realm,以及避免在使用自訂主題和使用其自己的自訂使用者屬性擴展伺服器時中斷行為。

正如您將在以下章節中看到的那樣,您也可以透過選擇屬性是否應對使用者和/或管理員可見或可寫入來限制屬性的目標對象。

對於不受管理的屬性,最大長度為 2048 個字元。若要指定不同的最小或最大長度,請將不受管理的屬性變更為受管理的屬性,並新增 length 驗證器。

Keycloak 會在其內部快取中快取與使用者相關的物件。屬性越長,快取消耗的記憶體就越多。因此,建議限制長度屬性的大小。考慮將大型物件儲存在 Keycloak 之外,並透過 ID 或 URL 引用它們。

管理使用者設定檔

使用者設定檔設定是按每個 Realm 進行管理的。為此,請點擊左側選單中的 Realm 設定 連結,然後點擊 使用者設定檔 標籤。

使用者設定檔標籤

user profile tab

屬性 子標籤中,您會看到所有受管理屬性的清單。

屬性群組 子標籤中,您可以管理屬性群組。屬性群組允許您關聯屬性,以便在呈現面向使用者的表單時將它們一起顯示。

JSON 編輯器 子標籤中,您可以檢視和編輯 JSON 設定。您可以使用此標籤來獲取您目前的設定或手動管理它。您對此標籤所做的任何變更都會反映在其他標籤中,反之亦然。

在下一節中,您將學習如何管理屬性。

管理屬性

Attributes 子索引標籤中,您可以建立、編輯和刪除受管理的屬性。

若要定義新屬性並將其與使用者設定檔建立關聯,請按一下屬性清單頂端的「建立屬性」按鈕。

屬性設定

user profile create attribute

設定屬性時,您可以定義以下設定

名稱

屬性的名稱,用於唯一識別屬性。

顯示名稱

屬性的使用者友善名稱,主要用於呈現面向使用者的表單。它也支援使用國際化訊息

多值

如果啟用,該屬性支援多個值,並且會相應地呈現 UI,以允許設定多個值。啟用此設定時,請務必新增驗證器,以設定值的硬性限制。

屬性群組

屬性所屬的屬性群組(如果有的話)。

啟用條件

啟用或停用屬性。如果設定為 Always,則該屬性在任何使用者設定檔內容中都可用。如果設定為 Scopes are requested,則該屬性僅在代表使用者執行的用戶端要求一組或多個範圍時才可用。您可以使用此選項,根據所要求的用戶端範圍動態強制執行某些屬性。對於帳戶和管理控制台,不會評估範圍,並且該屬性始終啟用。這是因為按範圍篩選屬性僅在執行驗證流程時有效。

必填

設定將屬性標記為必填的條件。如果停用,則該屬性是選填的。如果啟用,您可以設定「必填對象」設定,以根據使用者設定檔內容將屬性標記為必填,以便最終使用者(透過最終使用者內容)或管理員(透過管理內容),或兩者皆是,都必須填寫此屬性。您也可以設定「必填條件」設定,以便僅當要求一組或多個用戶端範圍時,才將屬性標記為必填。如果設定為 Always,則該屬性在任何使用者設定檔內容中都必須填寫。如果設定為 Scopes are requested,則該屬性僅在代表使用者執行的用戶端要求一組或多個範圍時才必須填寫。對於帳戶和管理控制台,不會評估範圍,並且該屬性不是必填。這是因為按範圍篩選屬性僅在執行驗證流程時有效。

權限

在本節中,您可以定義在從最終使用者或管理內容管理屬性時的讀取和寫入權限。「誰可以編輯」設定將屬性標記為可分別由最終使用者和管理內容的「使用者」和/或「管理員」寫入。「誰可以檢視」設定將屬性標記為可分別由最終使用者和管理內容的「使用者」和/或「管理員」唯讀。

驗證

在本節中,您可以定義在管理屬性值時將執行的驗證。Keycloak 提供了一組您可以選擇的內建驗證器,並且可以新增您自己的驗證器。如需更多詳細資訊,請參閱驗證屬性章節。

註解

在本節中,您可以將註解與屬性建立關聯。註解主要用於將額外的中繼資料傳遞給前端以進行呈現。如需更多詳細資訊,請參閱定義 UI 註解章節。

當您建立屬性時,該屬性僅在管理內容中可用,以避免意外地將屬性暴露給最終使用者。實際上,當最終使用者透過最終使用者內容管理其設定檔時,他們無法存取該屬性。您可以隨時根據您的需求變更「權限」設定。

驗證屬性

您可以啟用對受管理屬性的驗證,以確保屬性值符合特定規則。為此,您可以在管理屬性時從「驗證」設定新增或移除驗證器。

屬性驗證

user profile validation

當寫入屬性時,會隨時進行驗證,並且它們可能會擲回錯誤,當值未通過驗證時,錯誤會顯示在 UI 中。

基於安全考量,每個可由使用者編輯的屬性都應具有驗證,以限制使用者輸入的值的大小。如果未指定 length 驗證器,則 Keycloak 預設最大長度為 2048 個字元。

內建驗證器

Keycloak 提供了一些您可以選擇的內建驗證器,您也可以透過擴充 Validator SPI 來提供您自己的驗證器。

以下清單提供所有內建驗證器的清單

名稱 說明 設定

length

根據最小和最大長度檢查字串值的長度。

min:定義允許最小長度的整數。

max:定義允許最大長度的整數。

trim-disabled:定義是否在驗證之前修剪值的布林值。

integer

檢查值是否為整數,並且是否在下限和/或上限範圍內。如果未定義範圍,則驗證器僅檢查值是否為有效數字。

min:定義下限範圍的整數。

max:定義上限範圍的整數。

double

檢查值是否為 double,並且是否在下限和/或上限範圍內。如果未定義範圍,則驗證器僅檢查值是否為有效數字。

min:定義下限範圍的整數。

max:定義上限範圍的整數。

uri

檢查值是否為有效的 URI。

pattern

檢查值是否符合特定的 RegEx 模式。

pattern:驗證值時要使用的 RegEx 模式。

error-message:i18n 組合中的錯誤訊息索引鍵。如果未設定,則會使用通用訊息。

電子郵件

檢查值是否具有有效的電子郵件格式。

max-local-length:定義電子郵件本機部分最大長度的整數。根據規格,預設為 64。

local-date

根據領域和/或使用者地區設定檢查值是否具有有效格式。

iso-date

根據 ISO 8601 檢查值是否具有有效格式。此驗證器可以用於使用 html5-date 輸入類型的輸入。

person-name-prohibited-characters

檢查該值是否為有效的人員名稱,作為腳本注入等攻擊的額外屏障。驗證基於預設的 RegEx 模式,該模式會封鎖人員名稱中不常見的字元。

error-message:i18n 組合中的錯誤訊息索引鍵。如果未設定,則會使用通用訊息。

username-prohibited-characters

檢查該值是否為有效的使用者名稱,作為腳本注入等攻擊的額外屏障。驗證基於預設的 RegEx 模式,該模式會封鎖使用者名稱中不常見的字元。當啟用領域設定「電子郵件作為使用者名稱」時,會跳過此驗證器以允許電子郵件值。

error-message:i18n 組合中的錯誤訊息索引鍵。如果未設定,則會使用通用訊息。

options

檢查該值是否來自已定義的允許值集。可用於驗證透過選取和多選欄位輸入的值。

options:包含允許值的字串陣列。

up-username-not-idn-homograph

該欄位只能包含拉丁字元和常見的 Unicode 字元。適用於可能遭受 IDN 同形文字攻擊的欄位(通常是使用者名稱)。

error-message:i18n 組合中的錯誤訊息索引鍵。如果未設定,則會使用通用訊息。

multivalued

驗證多值屬性的大小。

min:定義允許的屬性值最小計數的整數。

max:定義允許的屬性值最大計數的整數。

定義 UI 註解

為了將其他資訊傳遞給前端,可以使用註解裝飾屬性,以指示如何呈現屬性。當擴充 Keycloak 主題以根據與屬性相關聯的註解動態呈現頁面時,此功能主要有用。

註解用於,例如,變更屬性的 HTML type變更屬性的 DOM 表示,您將在以下章節中看到。

屬性註解

user profile annotation

註解是與 UI 共用的索引鍵/值配對,以便它們可以變更與屬性對應的 HTML 元素的呈現方式。只要您的領域使用的主題支援註解,您就可以為屬性設定任何您想要的註解。

您唯一的限制是避免在其索引鍵中使用 kc 前綴的註解,因為使用此前綴的這些註解是 Keycloak 保留的。

內建註解

Keycloak 內建主題支援以下註解

名稱 說明

inputType

表單輸入欄位的類型。下表描述了可用的類型。

inputHelperTextBefore

在輸入欄位之前(上方)呈現的輔助文字。此處可以使用直接文字或國際化模式(如 ${i18n.key})。當文字呈現到頁面中時,不會進行 HTML 逸出,因此您可以在此處使用 HTML 標籤來格式化文字,但您也必須正確逸出 HTML 控制字元。

inputHelperTextAfter

在輸入欄位之後(下方)呈現的輔助文字。此處可以使用直接文字或國際化模式(如 ${i18n.key})。當文字呈現到頁面中時,不會進行 HTML 逸出,因此您可以在此處使用 HTML 標籤來格式化文字,但您也必須正確逸出 HTML 控制字元。

inputOptionsFromValidation

選取和多選類型的註解。用於從中取得輸入選項的自訂屬性驗證的可選名稱。請參閱下方的詳細說明

inputOptionLabelsI18nPrefix

選取和多選類型的註解。用於在 UI 中呈現選項的國際化索引鍵前綴。請參閱下方的詳細說明

inputOptionLabels

選取和多選類型的註解。用於定義選項的 UI 標籤的可選映射(直接使用或使用國際化)。請參閱下方的詳細說明

inputTypePlaceholder

HTML 輸入欄位的 placeholder 屬性 - 指定一個簡短提示,描述輸入欄位的預期值(例如,範例值或預期格式的簡短描述)。在使用者輸入值之前,簡短提示會顯示在輸入欄位中。

inputTypeSize

HTML 輸入欄位的 size 屬性 - 指定單行輸入欄位的寬度(以字元為單位)。對於基於 HTML select 類型的欄位,它指定顯示選項的列數。可能無法運作,取決於使用主題中的 CSS!

inputTypeCols

HTML 輸入欄位的 cols 屬性 - 指定 textarea 類型的寬度(以字元為單位)。可能無法運作,取決於使用主題中的 CSS!

inputTypeRows

HTML 輸入欄位的 rows 屬性 - 指定 textarea 類型的高度(以字元為單位)。對於 select 欄位,它指定顯示選項的列數。可能無法運作,取決於使用主題中的 CSS!

inputTypePattern

HTML 輸入欄位的 pattern 屬性,用於提供客戶端驗證 - 指定一個正規表示式,用於檢查輸入欄位的值。適用於單行輸入。

inputTypeMaxLength

HTML 輸入欄位的 maxlength 屬性,用於提供客戶端驗證 - 可輸入到輸入欄位的文字最大長度。適用於文字欄位。

inputTypeMinLength

HTML 輸入欄位的 minlength 屬性,用於提供客戶端驗證 - 可輸入到輸入欄位的文字最小長度。適用於文字欄位。

inputTypeMax

HTML 輸入欄位的 max 屬性,用於提供客戶端驗證 - 可輸入到輸入欄位的最大值。適用於數值欄位。

inputTypeMin

HTML 輸入欄位的 min 屬性,用於提供客戶端驗證 - 可輸入到輸入欄位的最小值。適用於數值欄位。

inputTypeStep

HTML 輸入欄位的 step 屬性 - 指定輸入欄位中合法數字之間的間隔。適用於數值欄位。

數字格式

如果設定,則會將 data-kcNumberFormat 屬性新增至欄位,以根據給定的格式格式化值。此註解適用於數字,其中格式基於在特定位置中預期的位數。例如,格式 ({2}) {5}-{4} 會將欄位值格式化為 (00) 00000-0000

數字取消格式化

如果設定,則會在提交表單之前將 data-kcNumberUnFormat 屬性新增至欄位,以根據給定的格式格式化值。如果您不想為特定屬性儲存任何格式,而只想在客戶端格式化值,則此註解很有用。例如,如果目前的值為 (00) 00000-0000,如果您將值 {11} 設定為此註解,或透過指定一組或多組數字來設定您想要的任何其他格式,則該值將變更為 00000000000。請務必新增驗證器,以在儲存值之前執行伺服器端驗證。

欄位類型使用 HTML 表單欄位標籤和套用至這些標籤的屬性 - 它們的行為基於 HTML 規格和瀏覽器對它們的支援。

視覺呈現也取決於使用主題中套用的 CSS 樣式。

變更屬性的 HTML type

您可以透過設定 inputType 註解來變更 HTML5 輸入元素 的 type。可用的類型包括

名稱 說明 使用的 HTML 標籤

text

單行文字輸入。

input

textarea

多行文字輸入。

textarea

select

常見的單選輸入。請參閱下方說明如何設定選項

select

select-radiobuttons

透過一組單選按鈕的單選輸入。請參閱下方說明如何設定選項

輸入群組

multiselect

常見的多選輸入。請參閱下方說明如何設定選項

select

multiselect-checkboxes

透過一組核取方塊的多選輸入。請參閱下方說明如何設定選項

輸入群組

html5-email

基於 HTML 5 規格的電子郵件地址單行文字輸入。

input

html5-tel

基於 HTML 5 規格的電話號碼單行文字輸入。

input

html5-url

基於 HTML 5 規格的 URL 單行文字輸入。

input

html5-number

基於 HTML 5 規格的數字(整數或浮點數,取決於 step)單行輸入。

input

html5-range

基於 HTML 5 規格的數字輸入滑桿。

input

html5-datetime-local

基於 HTML 5 規格的日期時間輸入。

input

html5-date

基於 HTML 5 規格的日期輸入。

input

html5-month

基於 HTML 5 規格的月份輸入。

input

html5-week

基於 HTML 5 規格的週輸入。

input

html5-time

基於 HTML 5 規格的時間輸入。

input

定義 select 和 multiselect 欄位的選項

select 和 multiselect 欄位的選項取自套用至屬性的驗證,以確保在 UI 中呈現的驗證和欄位選項始終一致。預設情況下,選項取自內建的 options 驗證。

您可以使用各種方法為 select 和 multiselect 選項提供良好的人性化可讀標籤。最簡單的情況是當屬性值與 UI 標籤相同時。在這種情況下,不需要額外的設定。

選項值與 UI 標籤相同

user profile select options simple

當屬性值是不適用於 UI 的 ID 時,您可以使用 inputOptionLabelsI18nPrefix 註解提供的簡單國際化支援。它定義國際化索引鍵的前置詞,選項值會以點號附加至此前置詞。

使用 i18n 索引鍵前置詞的 UI 標籤簡單國際化

user profile select options simple i18n

然後,必須使用常見的本地化機制,透過 userprofile.jobtitle.swenguserprofile.jobtitle.swarch 索引鍵提供選項值的本地化 UI 標籤文字。

您也可以使用 inputOptionLabels 註解來為個別選項提供標籤。它包含選項標籤的地圖 - 地圖中的索引鍵是選項值(在驗證中定義),而地圖中的值是 UI 標籤文字本身,或是該選項的國際化模式(例如 ${i18n.key})。

您必須使用「使用者設定檔」JSON 編輯器,將地圖輸入為 inputOptionLabels 註解值。

未經國際化的個別選項直接輸入標籤的範例

"attributes": [
<...
{
  "name": "jobTitle",
  "validations": {
    "options": {
      "options":[
        "sweng",
        "swarch"
      ]
    }
  },
  "annotations": {
    "inputType": "select",
    "inputOptionLabels": {
      "sweng": "Software Engineer",
      "swarch": "Software Architect"
    }
  }
}
...
]

個別選項的國際化標籤範例

"attributes": [
...
{
  "name": "jobTitle",
  "validations": {
    "options": {
      "options":[
        "sweng",
        "swarch"
      ]
    }
  },
  "annotations": {
    "inputType": "select-radiobuttons",
    "inputOptionLabels": {
      "sweng": "${jobtitle.swengineer}",
      "swarch": "${jobtitle.swarchitect}"
    }
  }
}
...
]

然後,必須使用常見的本地化機制,透過 jobtitle.swengineerjobtitle.swarchitect 索引鍵提供本地化文字。

由於 inputOptionsFromValidation 屬性註解,可以使用自訂驗證器來提供選項。此驗證必須具有提供選項陣列的 options 設定。國際化的運作方式與內建 options 驗證提供的選項相同。

自訂驗證器提供的選項

user profile select options custom validator

變更屬性的 DOM 表示法

您可以透過設定具有 kc 前置詞的註解來啟用額外的客戶端行為。這些註解將轉換為屬性對應元素的 HTML 屬性,並加上 data- 前置詞,並且將會載入具有相同名稱的指令碼至動態頁面,以便您可以根據自訂的 data- 屬性從 DOM 選取元素,並透過修改其 DOM 表示法來對其進行裝飾。

例如,如果您將 kcMyCustomValidation 註解新增至屬性,則 HTML 屬性 data-kcMyCustomValidation 會新增至屬性的對應 HTML 元素,並且 JavaScript 模組會從您自訂主題的 <THEME TYPE>/resources/js/kcMyCustomValidation.js 載入。如需有關如何將自訂 JavaScript 模組部署至您的主題的詳細資訊,請參閱伺服器開發人員指南

JavaScript 模組可以執行任何程式碼來自訂 DOM 和為每個屬性呈現的元素。為此,您可以使用 userProfile.js 模組來為您的自訂註解註冊註解描述符,如下所示

import { registerElementAnnotatedBy } from "./userProfile.js";

registerElementAnnotatedBy({
  name: 'kcMyCustomValidation',
  onAdd(element) {
    var listener = function (event) {
        // do something on keyup
    };

    element.addEventListener("keyup", listener);

    // returns a cleanup function to remove the event listener
    return () => element.removeEventListener("keyup", listener);
  }
});

registerElementAnnotatedBy 是註冊註解描述符的方法。描述符是一個具有 name 的物件,參照註解名稱,以及一個 onAdd 函式。每當呈現頁面或將具有註解的屬性新增至 DOM 時,就會叫用 onAdd 函式,以便您可以自訂元素的行為。

onAdd 函式也可以傳回一個函式來執行清除。例如,如果您要將事件接聽程式新增至元素,您可能想要在元素從 DOM 中移除時將它們移除。

或者,如果 userProfile.js 不足以滿足您的需求,您也可以使用任何您想要的 JavaScript 程式碼

document.querySelectorAll(`[data-kcMyCustomValidation]`).forEach((element) => {
    var listener = function (evt) {
        // do something on keyup
    };

    element.addEventListener("keyup", listener);
  });

管理屬性群組

在 [屬性群組] 子索引標籤中,您可以建立、編輯和刪除屬性群組。屬性群組可讓您定義相關屬性的容器,以便在面向使用者的表單中一起呈現它們。

屬性群組清單

user profile attribute group list

您無法刪除繫結至屬性的屬性群組。為此,您應該先更新屬性以移除繫結。

若要建立新的群組,請按一下屬性群組清單頂端的 [建立屬性群組] 按鈕。

屬性群組設定

user profile create attribute group

設定群組時,您可以定義下列設定

名稱

屬性的名稱,用於唯一識別屬性。

顯示名稱

屬性的使用者友善名稱,主要用於呈現面向使用者的表單。它也支援使用國際化訊息

顯示描述

在呈現面向使用者的表單時,會顯示為工具提示的易於使用文字。它也支援使用國際化訊息

註解

在本節中,您可以將註解與屬性關聯。註解主要用於將額外的元數據傳遞到前端以進行渲染。

使用 JSON 配置

使用者設定檔配置使用定義完善的 JSON 綱要儲存。您可以選擇直接編輯使用者設定檔配置,方法是點擊 JSON 編輯器 子索引標籤。

JSON 配置

user profile json config

JSON 綱要定義如下

{
  "unmanagedAttributePolicy": "DISABLED",
  "attributes": [
    {
      "name": "myattribute",
      "multivalued": false,
      "displayName": "My Attribute",
      "group": "personalInfo",
      "required": {
        "roles": [ "user", "admin" ],
        "scopes": [ "foo", "bar" ]
      },
      "permissions": {
        "view": [ "admin", "user" ],
        "edit": [ "admin", "user" ]
      },
      "validations": {
        "email": {
          "max-local-length": 64
        },
        "length": {
          "max": 255
        }
      },
      "annotations": {
        "myannotation": "myannotation-value"
      }
    }
  ],
  "groups": [
    {
      "name": "personalInfo",
      "displayHeader": "Personal Information",
      "annotations": {
        "foo": ["foo-value"],
        "bar": ["bar-value"]
      }
    }
  ]
}

此綱要支援您需要的任意數量的屬性和群組。

unmanagedAttributePolicy 屬性通過設定以下值之一來定義非受管屬性策略。如需更多詳細資訊,請參閱了解受管和非受管屬性

  • 已停用

  • 已啟用

  • 管理員檢視

  • 管理員編輯

屬性綱要

對於每個屬性,您應該定義一個 name,並且可以選擇定義 requiredpermissionannotations 設定。

required 屬性定義屬性是否為必填。Keycloak 允許您根據不同的條件將屬性設定為必填。

required 屬性定義為空物件時,該屬性始終為必填。

{
  "attributes": [
    {
      "name": "myattribute",
      "required": {}
  ]
}

另一方面,您可以選擇僅針對使用者或管理員,或兩者都將屬性設為必填。以及在使用者於 Keycloak 中驗證身分時,僅在請求特定範圍的情況下將屬性標記為必填。

若要將屬性標記為使用者和/或管理員的必填屬性,請將 roles 屬性設定如下

{
  "attributes": [
    {
      "name": "myattribute",
      "required": {
        "roles": ["user"]
      }
  ]
}

roles 屬性預期是一個陣列,其值可以是 useradmin,具體取決於該屬性分別是使用者或管理員所要求的。

同樣地,您可以選擇在用戶驗證身份時,當客戶端請求一組或多個範圍時,才要求該屬性。為此,您可以使用 scopes 屬性,如下所示

{
  "attributes": [
    {
      "name": "myattribute",
      "required": {
        "scopes": ["foo"]
      }
  ]
}

scopes 屬性是一個陣列,其值可以是任何代表客戶端範圍的字串。

屬性級別的 permissions 屬性可用於定義屬性的讀取和寫入權限。權限的設定是基於使用者、管理員或兩者是否可以對屬性執行這些操作。

{
  "attributes": [
    {
      "name": "myattribute",
      "permissions": {
        "view": ["admin"],
        "edit": ["user"]
      }
  ]
}

viewedit 屬性都預期是一個陣列,其值可以是 useradmin,具體取決於該屬性是否分別可由使用者或管理員檢視或編輯。

當授予 edit 權限時,會隱式授予 view 權限。

屬性級別的 annotation 屬性可用於將額外的元數據與屬性關聯。註解主要用於將有關屬性的額外資訊傳遞給前端,以便根據使用者設定檔配置來呈現使用者屬性。每個註解都是一個鍵/值對。

{
  "attributes": [
    {
      "name": "myattribute",
      "annotations": {
        "foo": ["foo-value"],
        "bar": ["bar-value"]
      }
  ]
}
屬性群組綱要

對於每個屬性群組,您應該定義一個 name,並且可以選擇定義 annotations 設定。

屬性級別的 annotation 屬性可用於將額外的元數據與屬性關聯。註解主要用於將有關屬性的額外資訊傳遞給前端,以便根據使用者設定檔配置來呈現使用者屬性。每個註解都是一個鍵/值對。

自訂 UI 的呈現方式

所有使用者設定檔內容(包括管理控制台)中的 UI 都會根據您的使用者設定檔配置動態呈現。

預設的呈現機制提供以下功能

  • 根據屬性設定的權限顯示或隱藏欄位。

  • 根據屬性設定的約束,呈現必填欄位的標記。

  • 變更設定給屬性的欄位輸入類型(文字、日期、數字、選取、多重選取)。

  • 根據屬性設定的權限,將欄位標記為唯讀。

  • 根據屬性設定的順序排列欄位。

  • 將屬於同一屬性群組的欄位分組。

  • 動態將屬於同一屬性群組的欄位分組。

排序屬性

屬性順序是通過在屬性清單頁面上拖放屬性行來設定的。

排序屬性

user profile attribute list order

當欄位在動態表單中呈現時,您在此頁面中設定的順序將會被採用。

分組屬性

當呈現動態表單時,它們會嘗試將屬於同一屬性群組的屬性分組在一起。

動態更新設定檔表單

user profile update profile

當屬性連結到屬性群組時,屬性順序也很重要,以確保同一群組內的屬性緊鄰在一起,在同一個群組標頭內。否則,如果群組內的屬性沒有循序排列,您可能會在動態表單中多次呈現相同的群組標頭。

啟用漸進式設定檔

為了確保終端使用者設定檔符合配置,管理員可以使用 VerifyProfile 必要的動作,以便在使用者驗證 Keycloak 的身分時,最終強制他們更新設定檔。

VerifyProfile 動作與 UpdateProfile 動作類似。但是,它利用使用者設定檔提供的所有功能來自動強制遵守使用者設定檔配置。

啟用後,VerifyProfile 動作將在使用者驗證身分時執行以下步驟

  • 檢查使用者設定檔是否完全符合領域設定的使用者設定檔配置。這表示執行驗證並確保所有驗證都成功。

  • 如果沒有,則在驗證期間執行額外步驟,以便使用者可以更新任何遺失或無效的屬性。

  • 如果使用者設定檔符合配置,則不會執行額外步驟,並且使用者繼續驗證過程。

預設情況下會啟用 VerifyProfile 動作。若要停用此動作,請點擊左側選單中的 Authentication 連結,然後點擊 Required Actions 索引標籤。在此索引標籤上,使用 VerifyProfile 動作的 **Enabled** 開關來停用它。

註冊 VerifyProfile 必要的動作

user profile register verify profile action

使用國際化訊息

如果您希望在設定屬性、屬性群組和註解時使用國際化訊息,您可以使用將轉換為訊息套件中訊息的預留位置,來設定它們的顯示名稱、描述和值。

為此,您可以使用預留位置來解析訊息金鑰,例如 ${myAttributeName},其中 myAttributeName 是訊息套件中訊息的金鑰。如需更多詳細資訊,請參閱關於如何將訊息套件新增至自訂主題的伺服器開發人員指南

定義使用者憑證

您可以在 **Credentials** 索引標籤中管理使用者的憑證。

憑證管理

user credentials

您可以通過拖放行來更改憑證的優先順序。新順序決定該使用者憑證的優先順序。最上面的憑證具有最高的優先順序。優先順序決定使用者登入後首先顯示哪個憑證。

類型

此欄顯示憑證的類型,例如 **password** 或 **OTP**。

使用者標籤

這是一個可指派的標籤,用於在登入時作為選取選項呈現時識別憑證。可以將其設定為任何值以描述憑證。

資料

這是關於憑證的非機密技術資訊。預設情況下,它會被隱藏。您可以點擊 **Show data…​** 來顯示憑證的資料。

動作

點擊 **Reset password** 以變更使用者的密碼,點擊 **Delete** 以移除憑證。

您無法在管理控制台中為特定使用者設定其他類型的憑證;該任務是使用者的責任。

如果使用者遺失 OTP 裝置或憑證已遭洩漏,您可以刪除使用者的憑證。您只能在 **Credentials** 索引標籤中刪除使用者的憑證。

為使用者設定密碼

如果使用者沒有密碼,或密碼已被刪除,則會顯示 **Set Password** 區段。

如果使用者已經有密碼,可以在 **Reset Password** 區段中重設密碼。

程序
  1. 在選單中點擊 **Users**。將顯示 **Users** 頁面。

  2. 選取使用者。

  3. 點擊 **Credentials** 索引標籤。

  4. 在 **Set Password** 區段中輸入新密碼。

  5. 點擊 **Set Password**。

    如果 **Temporary** 為 **ON**,則使用者必須在第一次登入時變更密碼。若要允許使用者保留提供的密碼,請將 **Temporary** 設定為 **OFF**。使用者必須點擊 **Set Password** 才能變更密碼。

請求使用者重設密碼

您也可以請求使用者重設密碼。

程序
  1. 在選單中點擊 **Users**。將顯示 **Users** 頁面。

  2. 選取使用者。

  3. 點擊 **Credentials** 索引標籤。

  4. 點擊 **Credential Reset**。

  5. 從清單中選取 **Update Password**。

  6. 點擊 **Send Email**。傳送的電子郵件包含一個連結,該連結會將使用者導向 **Update Password** 視窗。

  7. 或者,您可以設定電子郵件連結的有效期限。這是在 **Realm Settings** 中的 **Tokens** 索引標籤中設定的預設預設值。

建立 OTP

如果您的領域中 OTP 是有條件的,使用者必須導覽至 Keycloak 帳戶主控台以重新配置新的 OTP 產生器。如果 OTP 是必要的,則使用者在登入時必須重新配置新的 OTP 產生器。

或者,您可以傳送電子郵件給使用者,要求使用者重設 OTP 產生器。如果使用者已經擁有 OTP 憑證,以下程序也適用。

先決條件
  • 您已登入到適當的領域。

程序
  1. 在主選單中點擊 使用者。即會顯示 使用者 頁面。

  2. 選取使用者。

  3. 點擊 **Credentials** 索引標籤。

  4. 點擊 **Credential Reset**。

  5. 重設動作 設定為 設定 OTP

  6. 點擊 傳送電子郵件。傳送的電子郵件包含一個連結,該連結會將使用者導向至 OTP 設定頁面

允許使用者自行註冊

您可以使用 Keycloak 作為第三方授權伺服器來管理應用程式使用者,包括自行註冊的使用者。如果您啟用自行註冊,登入頁面會顯示一個註冊連結,讓使用者可以建立帳戶。

註冊連結

registration link

使用者必須在註冊表單中新增個人資料資訊才能完成註冊。可以透過移除或新增使用者必須填寫的欄位來自訂註冊表單。

關於身分代理和管理 API 的說明

即使停用自行註冊,仍然可以透過以下方式將新使用者新增至 Keycloak:

  • 管理員可以使用管理主控台(或管理 REST API)新增新使用者

  • 當啟用身分代理時,由身分提供者驗證的新使用者可能會自動新增/註冊到 Keycloak 儲存中。請參閱身分代理章節中的首次登入流程以取得更多資訊。

此外,當啟用特定的使用者儲存時,來自第三方使用者儲存(例如 LDAP)的使用者也會自動在 Keycloak 中可用。

其他資源

啟用使用者註冊

允許使用者自行註冊。

程序
  1. 在主選單中點擊 領域設定

  2. 點擊登入索引標籤。

  3. 使用者註冊 切換為 開啟

啟用此設定後,管理主控台的登入頁面上會顯示 註冊 連結。

註冊為新使用者

作為新使用者,您必須填寫註冊表單才能首次登入。您會新增個人資料資訊和密碼以進行註冊。

註冊表單

registration form

先決條件
  • 已啟用使用者註冊。

程序
  1. 在登入頁面上點擊 註冊 連結。即會顯示註冊頁面。

  2. 輸入使用者個人資料資訊。

  3. 輸入新密碼。

  4. 點擊 註冊

在註冊期間要求使用者同意條款及細則

為了讓使用者註冊,您可以要求他們同意您的條款及細則。

註冊表單需要同意條款及細則

registration form with required tac

先決條件
  • 已啟用使用者註冊。

  • 已啟用條款及細則所需動作。

程序
  1. 在選單中點擊 驗證。點擊 流程 索引標籤。

  2. 點擊 註冊 流程。

  3. 條款及細則 列上選取 必要

    在註冊時使條款及細則協議成為必要項目

    require tac agreement at registration

定義登入時的必要動作

您可以設定使用者在首次登入時必須執行的動作。這些動作是在使用者提供憑證後才必須執行。首次登入後,這些動作不再是必要的。您可以在該使用者的 詳細資料 索引標籤上新增必要動作。

即使管理員未明確將某些必要動作新增至此使用者,這些動作也會在登入期間自動觸發。例如,如果密碼原則設定為每 X 天需要變更使用者密碼,則可以觸發 更新密碼 動作。或者,如果某些使用者屬性不符合使用者個人資料設定的要求,則 驗證個人資料 動作可能會要求使用者更新使用者個人資料

以下是一些必要動作類型的範例:

更新密碼

使用者必須變更其密碼。

設定 OTP

使用者必須使用 Free OTP 或 Google Authenticator 應用程式在其行動裝置上設定一次性密碼產生器。

驗證電子郵件

使用者必須驗證其電子郵件帳戶。系統會傳送一封電子郵件給使用者,其中包含他們必須點擊的驗證連結。此工作流程成功完成後,將允許使用者登入。

更新設定檔

使用者必須更新個人資料資訊,例如姓名、地址、電子郵件和電話號碼。

某些動作直接新增至使用者帳戶是沒有意義的。例如,更新使用者地區設定 是一個協助處理一些與本地化相關參數的動作。另一個例子是 刪除憑證 動作,它應該作為一個參數化的 AIA觸發。關於此動作,如果管理員想要刪除某些使用者的憑證,管理員可以直接在管理主控台中執行。刪除憑證 動作專用於例如Keycloak 帳戶主控台使用。

設定一個使用者的必要動作

您可以設定任何使用者都必須執行的動作。

程序
  1. 在選單中點擊 使用者

  2. 從清單中選取使用者。

  3. 導覽至 必要使用者動作 清單。

    user required action

  4. 選取您要新增至帳戶的所有動作。

  5. 點擊動作名稱旁的 X 以移除它。

  6. 選取要新增的動作後,點擊 儲存

設定所有使用者的必要動作

您可以指定所有新使用者首次登入前必須執行的動作。這些要求適用於在 使用者 頁面上使用 新增使用者 按鈕建立的使用者,或是登入頁面上的 註冊 連結。

程序
  1. 在選單中點擊驗證

  2. 點擊 必要動作 索引標籤。

  3. 針對一個或多個必要動作,點擊 設定為預設動作 欄中的核取方塊。當新使用者首次登入時,必須執行選取的動作。

啟用條款及細則作為必要動作

您可以啟用一項必要動作,讓新使用者在首次登入 Keycloak 之前必須接受條款及細則。

程序
  1. 在選單中點擊驗證

  2. 點擊 必要動作 索引標籤。

  3. 啟用 條款及細則 動作。

  4. 編輯基本登入主題中的 terms.ftl 檔案。

其他資源

應用程式啟動的動作

應用程式起始動作 (Application Initiated Actions, AIA) 允許客戶端應用程式請求使用者在 Keycloak 端執行動作。通常,當 OIDC 客戶端應用程式想要使用者登入時,它會將使用者重新導向至登入 URL,如 OIDC 章節中所述。登入後,使用者會被重新導向回客戶端應用程式。使用者會執行管理員要求的動作,如 前一章節所述,然後立即被重新導向回應用程式。然而,AIA 允許客戶端應用程式在登入期間請求使用者執行某些必要動作。即使使用者已在客戶端上通過驗證並擁有作用中的 SSO 工作階段,也可以執行此操作。它是透過在 OIDC 登入 URL 中加入 kc_action 參數來觸發的,該參數的值包含請求的動作。例如 kc_action=UPDATE_PASSWORD 參數。

使用者可以取消應用程式起始的動作。在這種情況下,使用者會被重新導向回客戶端應用程式。重新導向 URI 將包含查詢參數 kc_action_status=cancelledkc_action,其中包含已取消動作的名稱。

kc_actionkc_action_status 參數是 Keycloak 的專有機制,OIDC 規範不支援。
應用程式起始動作僅支援 OIDC 客戶端。

因此,如果使用 AIA,範例流程類似於以下:

  • 客戶端應用程式將使用者重新導向至 OIDC 登入 URL,並帶有額外參數,例如 kc_action=UPDATE_PASSWORD

  • 驗證流程章節中所述,總會觸發 browser 流程。如果使用者尚未通過驗證,則該使用者需要像正常登入一樣進行驗證。如果使用者已通過驗證,則該使用者可能會透過 SSO Cookie 自動重新驗證,而無需主動重新驗證並再次提供憑證。在這種情況下,該使用者將直接被重新導向至包含特定動作的畫面(在此範例中為更新密碼)。然而,在某些情況下,即使使用者擁有 SSO Cookie,也需要主動重新驗證(詳情請參閱下面的 內容)。

  • 向使用者顯示包含特定動作的畫面(在此範例中為 update password),因此使用者需要執行特定動作

  • 然後,使用者會被重新導向回客戶端應用程式

請注意,Keycloak 帳戶控制台使用 AIA 來請求更新密碼或重設其他憑證,例如 OTP 或 WebAuthn。

即使使用了參數 kc_action,也不足以假設使用者總是執行該動作。例如,使用者可能已手動從瀏覽器 URL 中刪除 kc_action 參數。因此,無法保證使用者在客戶端請求 kc_action=CONFIGURE_TOTP 後,該帳戶是否擁有 OTP。如果您想要驗證使用者是否已設定雙重驗證器,客戶端應用程式可能需要檢查是否已設定。例如,透過檢查權杖中的 acr 之類的宣告。

AIA 期間的重新驗證

如果使用者因作用中的 SSO 工作階段而已經過驗證,則該使用者通常不需要主動重新驗證。但是,如果該使用者主動驗證的時間超過五分鐘,則當請求某些 AIA 時,客戶端仍然可以請求重新驗證。此指引有以下例外情況:

  • delete_account 動作將始終要求使用者主動重新驗證

  • update_password 動作可能會根據配置的 最長驗證時間密碼原則要求使用者主動重新驗證。如果未配置該原則,也可以在配置特定必要動作時,於必要動作索引標籤中配置該原則。如果未在任何這些位置配置原則,則預設為五分鐘。

  • 如果您想要使用較短的重新驗證時間,您仍然可以使用查詢參數,例如帶有指定較短值的 max_age,或最終使用 prompt=login,這將始終要求使用者主動重新驗證,如 OIDC 規範中所述。請注意,不支援使用 max_age 指定比預設五分鐘(或密碼原則規定的時間)更長的值。max_age 目前只能用於指定比預設五分鐘更短的值。

  • 如果啟用逐步驗證,並且該動作是要新增或刪除憑證,則需要使用與給定憑證對應的層級進行驗證。如果使用者已經擁有特定層級的憑證,則存在此要求。例如,如果在驗證流程中將 otpwebauthn 配置為第二要素驗證器(兩者在驗證流程中均位於層級 2),並且使用者已經擁有第二要素憑證(在此範例中為 otpwebauthn),則需要使用者使用現有的第二要素憑證進行驗證才能新增另一個第二層級憑證。同樣地,刪除現有的第二要素憑證(在此範例中為 otpwebauthn),需要使用現有的第二要素層級憑證進行驗證。存在此要求是為了安全起見。

參數化的 AIA

某些 AIA 可能需要與動作名稱一起傳送參數。例如,只有透過 AIA 才能觸發 刪除憑證 動作,並且需要與動作名稱一起傳送參數,該參數指向已移除憑證的 ID。因此,此範例的 URL 將會是 kc_action=delete_credential:ce1008ac-f811-427f-825a-c0b878d1c24b。在這種情況下,冒號字元後面的部分 (ce1008ac-f811-427f-825a-c0b878d1c24b) 包含要刪除的特定使用者憑證的 ID。刪除憑證 動作會顯示確認畫面,使用者可以在其中確認同意刪除該憑證。

Keycloak 帳戶控制台通常在刪除第二要素憑證時使用 刪除憑證 動作。如果您想直接從自己的應用程式使用此動作,可以查看帳戶控制台的範例。但是,最好依賴帳戶控制台,而不是從您自己的應用程式管理憑證。

可用的動作

若要查看所有可用的動作,請登入管理主控台,然後前往右上角,按一下 [領域資訊] → [提供者資訊] 索引標籤 → 尋找提供者 required-action。但是請注意,這可能會根據您領域中啟用了哪些動作,在 必要動作索引標籤中進一步限制。

搜尋使用者

搜尋使用者以檢視關於使用者的詳細資訊,例如使用者的群組和角色。

先決條件
  • 您位於使用者存在的領域中。

程序
  1. 在主選單中按一下 [使用者]。即會顯示此 [使用者] 頁面。

  2. 在搜尋方塊中輸入您要搜尋的使用者的全名、姓氏、名字或電子郵件地址。搜尋會傳回符合您條件的所有使用者。

    用於比對使用者的條件取決於搜尋方塊上使用的語法

    1. "somevalue" → 執行字串 "somevalue" 的精確搜尋;

    2. *somevalue* → 執行中綴搜尋,類似於 LIKE '%somevalue%' DB 查詢;

    3. somevalue*somevalue → 執行字首搜尋,類似於 LIKE 'somevalue%' DB 查詢。

程序
  1. 在主選單中按一下 [使用者]。即會顯示此 [使用者] 頁面。

  2. 按一下 [預設搜尋] 按鈕,並將其切換為 [屬性搜尋]。

  3. 按一下 [選取屬性] 按鈕,並指定要搜尋的屬性。

  4. 勾選 [精確搜尋] 核取方塊以執行精確比對,或保持不勾選以使用屬性值的中綴搜尋。

  5. 按一下 [搜尋] 按鈕以執行搜尋。它會傳回符合條件的所有使用者。

在 [使用者] 頁面中執行的搜尋涵蓋 Keycloak 的資料庫和設定的使用者聯合後端(例如 LDAP)。如果聯合後端中找到的使用者尚未存在於 Keycloak 的資料庫中,則會將其匯入 Keycloak 的資料庫。

其他資源
  • 如需有關使用者聯合的更多資訊,請參閱 使用者聯合

刪除使用者

您可以刪除不再需要存取應用程式的使用者。如果刪除使用者,也會刪除使用者設定檔和資料。

程序
  1. 在選單中點擊 **Users**。將顯示 **Users** 頁面。

  2. 按一下 [檢視所有使用者] 以尋找要刪除的使用者。

    或者,您可以使用搜尋列來尋找使用者。
  3. 按一下您要移除的使用者旁邊的動作選單中的 [刪除],然後確認刪除。

允許使用者刪除帳戶

如果您在管理主控台中啟用此功能,則終端使用者和應用程式可以在帳戶控制台中刪除其帳戶。啟用此功能後,您可以將該功能授予特定使用者。

啟用刪除帳戶功能

您可以在 [必要動作] 索引標籤上啟用此功能。

程序
  1. 在選單中點擊驗證

  2. 點擊 必要動作 索引標籤。

  3. 在 [刪除帳戶] 列上選取 [已啟用]。

    在必要操作頁籤中刪除帳戶

    enable delete account action

賦予使用者 delete-account 角色

您可以賦予特定使用者可刪除帳戶的角色。

程序
  1. 在選單中點擊 使用者

  2. 選取使用者。

  3. 點擊 角色對應 頁籤。

  4. 點擊 指派角色 按鈕。

  5. 點擊 account delete-account

  6. 點擊 指派

    刪除帳戶角色

    delete-account role

刪除您的帳戶

一旦您擁有 delete-account 角色,您就可以刪除自己的帳戶。

  1. 登入帳戶主控台。

  2. 個人資訊 頁面底部,點擊 刪除帳戶

    刪除帳戶頁面

    Delete account page

  3. 輸入您的憑證並確認刪除。

    刪除確認

    delete account confirm

    此操作不可逆。您在 Keycloak 中的所有資料都將被移除。

模擬使用者

具有適當權限的管理員可以模擬使用者。例如,如果使用者在應用程式中遇到錯誤,管理員可以模擬使用者以調查或複製該問題。

在領域中擁有 impersonation 角色的任何使用者都可以模擬使用者。

程序
  1. 在選單中點擊 使用者

  2. 點擊要模擬的使用者。

  3. 操作 清單中,選取 模擬

    user impersonate action

    • 如果管理員和使用者位於同一個領域,則管理員將會登出,並自動以被模擬的使用者身分登入。

    • 如果管理員和使用者位於不同的領域,則管理員將保持登入狀態,並額外以該使用者在其領域中的身分登入。

在這兩種情況下,都會顯示被模擬使用者的 帳戶主控台

其他資源

啟用 reCAPTCHA

為了防止機器人註冊,Keycloak 與 Google reCAPTCHA(請參閱 設定 Google reCAPTCHA)和 reCAPTCHA Enterprise(請參閱 設定 Google reCAPTCHA Enterprise)整合。預設主題 (register.ftl) 支援 v2(可見、基於核取方塊)和 v3(基於分數、不可見)reCAPTCHA(請參閱 選擇適當的 reCAPTCHA 金鑰類型)。

設定 Google reCAPTCHA

  1. 在瀏覽器中輸入以下 URL

    https://www.google.com/recaptcha/admin/create
  2. 建立 reCAPTCHA 並在 Challenge v2 (可見核取方塊) 或基於分數的 v3 (不可見) 之間選擇,以取得您的 reCAPTCHA 網站金鑰和密鑰。記錄它們以供此程序日後使用。

    localhost 預設運作。您不必指定網域。
  3. 導覽至 Keycloak 管理主控台。

  4. 在選單中點擊驗證

  5. 點擊流程索引標籤。

  6. 從清單中選取 註冊

  7. reCAPTCHA 要求設定為 必要。這會啟用 reCAPTCHA。

  8. 點擊 reCAPTCHA 列上的 齒輪圖示 ⚙️。

    reCAPTCHA 設定

    recaptcha config

    1. 輸入從 Google reCAPTCHA 網站產生的 reCAPTCHA 網站金鑰

    2. 輸入從 Google reCAPTCHA 網站產生的 reCAPTCHA 密鑰

    3. 根據您的網站金鑰類型切換 reCAPTCHA v3:對於基於分數的 reCAPTCHA (v3) 開啟,對於挑戰 reCAPTCHA (v2) 關閉。

    4. (選用)切換 使用 recaptcha.net 以使用 www.recatcha.net 而非 www.google.com 網域來處理 Cookie。如需更多資訊,請參閱 reCAPTCHA 常見問題

  9. 授權 Google 使用註冊頁面作為 iframe。

    在 Keycloak 中,網站無法在 iframe 中包含登入頁面對話方塊。此限制旨在防止點擊劫持攻擊。您需要變更 Keycloak 中設定的預設 HTTP 回應標頭。
    1. 在選單中點擊領域設定

    2. 點擊 安全性防禦 頁籤。

    3. X-Frame-Options 標頭的欄位中輸入 https://www.google.com (如果您啟用了 使用 recaptcha.net,則輸入 https//www.recaptcha.net)。

    4. Content-Security-Policy 標頭的欄位中輸入 https://www.google.com (如果您啟用了 使用 recaptcha.net,則輸入 https//www.recaptcha.net)。

設定 Google reCAPTCHA Enterprise

  1. 在瀏覽器中輸入以下 URL

    https://developers.google.com/recaptcha/
  2. 為「網站」平台建立金鑰,並選擇所需的金鑰類型。保留 v3 reCAPTCHA (不可見) 的預設值,或針對 v2 reCAPTCHA (可見) 切換 使用核取方塊挑戰。記錄網站金鑰以供此程序日後使用。

    localhost 預設運作。您不必指定網域。
  3. 在您的 Google Cloud 專案中,前往 憑證 並建立 API 金鑰。

    為了提高安全性,點擊 編輯 API 金鑰 並新增 API 限制,以將金鑰限制為僅限 reCAPTCHA Enterprise API
  4. 導覽至 Keycloak 管理主控台。

  5. 在選單中點擊驗證

  6. 點擊流程索引標籤。

  7. 複製「註冊」流程。

  8. 將新流程繫結至 註冊流程

  9. 編輯新流程

    1. 刪除 reCAPTCHA 步驟。

    2. reCAPTCHA Enterprise 步驟新增為「註冊表單」(流程的第一個步驟)的子步驟。

  10. reCAPTCHA Enterprise 要求設定為 必要

  11. 點擊 reCAPTCHA Enterprise 列上的 齒輪圖示 ⚙️。

    reCAPTCHA Enterprise 設定

    recaptcha enterprise config

    1. 輸入您 Google Cloud 主控台專案的 Recaptcha 專案 ID

    2. 輸入在此程序開始時產生的 Recaptcha 網站金鑰

    3. 輸入在此程序開始時產生的 Recaptcha API 金鑰

    4. 根據您的網站金鑰類型切換 reCAPTCHA v3:對於基於分數的 reCAPTCHA (v3) 開啟,對於挑戰 reCAPTCHA (v2) 關閉。

    5. (選用)根據您的需求自訂 最低分數臨界值。將其設定為介於 0.0 和 1.0 之間的最低分數,使用者必須在 reCAPTCHA 上達到該分數才能允許註冊。請參閱 解讀分數

    6. (選用)切換 使用 recaptcha.net 以使用 www.recatcha.net 而非 www.google.com 網域來處理 Cookie。如需更多資訊,請參閱 reCAPTCHA 常見問題

  12. 授權 Google 使用註冊頁面作為 iframe。如需詳細程序,請參閱 設定 Google reCAPTCHA 的最後步驟。

其他資源

Keycloak 收集的個人資料

預設情況下,Keycloak 會收集以下資料

  • 基本使用者個人資料,例如使用者電子郵件、名字和姓氏。

  • 用於社群帳號的基本使用者個人資料,以及使用社群登入時對社群帳號的參考。

  • 為了稽核和安全性目的而收集的裝置資訊,例如 IP 位址、作業系統名稱和瀏覽器名稱。

Keycloak 中收集的資訊具有高度可自訂性。進行自訂時,請遵循以下準則

  • 註冊和帳戶表單可以包含自訂欄位,例如生日、性別和國籍。管理員可以設定 Keycloak 從社群供應商或使用者儲存供應商 (例如 LDAP) 擷取資料。

  • Keycloak 會收集使用者憑證,例如密碼、OTP 代碼和 WebAuthn 公鑰。此資訊已加密並儲存在資料庫中,因此 Keycloak 管理員無法看到。每種類型的憑證都可以包含非機密的中繼資料,管理員可以看見這些資料,例如用於雜湊密碼的演算法和用於雜湊密碼的雜湊迭代次數。

  • 啟用授權服務和 UMA 支援後,Keycloak 可以保存有關特定使用者是其擁有者的某些物件的資訊。

管理使用者工作階段

當使用者登入領域時,Keycloak 會為每個使用者維護一個使用者工作階段,並記住使用者在工作階段中造訪的每個用戶端。領域管理員可以對每個使用者工作階段執行多種操作

  • 檢視領域的登入統計資訊。

  • 檢視作用中的使用者及其登入位置。

  • 將使用者登出其工作階段。

  • 撤銷權杖。

  • 設定權杖逾時。

  • 設定工作階段逾時。

管理工作階段

若要查看 Keycloak 中作用中用戶端和工作階段的頂層檢視,請從功能表點擊 工作階段

工作階段

Sessions tab

登出所有作用中的工作階段

您可以登出 realm 中的所有使用者。從 Action 清單中,選取 Sign out all active sessions(登出所有活動中的工作階段)。所有 SSO cookie 都會失效。Keycloak 會使用 Keycloak OIDC 用戶端配接器通知用戶端登出事件。在作用中的瀏覽器工作階段中請求驗證的用戶端必須重新登入。SAML 等用戶端類型不會收到後端通道登出請求。

按一下 Sign out all active sessions(登出所有活動中的工作階段)不會撤銷未完成的存取權杖。未完成的權杖必須自然過期。對於使用 Keycloak OIDC 用戶端配接器的用戶端,您可以推送 撤銷原則 以撤銷權杖,但這不適用於其他配接器。

檢視用戶端工作階段

程序
  1. 在選單中點擊 用戶端

  2. 按一下用戶端以查看該用戶端的工作階段。

  3. 按一下 Sessions(工作階段)索引標籤。

    用戶端工作階段

    Client sessions

檢視使用者工作階段

程序
  1. 在選單中點擊 使用者

  2. 按一下使用者以查看該使用者的工作階段。

  3. 按一下 Sessions(工作階段)索引標籤。

    使用者工作階段

    User sessions

撤銷活動中的工作階段

如果您的系統遭到入侵,您可以撤銷所有活動中的工作階段和存取權杖。

程序
  1. 在功能表中按一下 Sessions(工作階段)。

  2. Actions(動作)清單中,選取 Revocation(撤銷)。

    撤銷

    Revocation

  3. 指定時間和日期,在此時間和日期之前發出的工作階段或權杖會使用此主控台失效。

    • 按一下 Set to now(設為現在)將原則設定為目前的時間和日期。

    • 按一下 Push(推送)以將此撤銷原則推送至任何已註冊並使用 Keycloak OIDC 用戶端配接器的 OIDC 用戶端。

工作階段和權杖逾時

Keycloak 包含透過 Realm settings(領域設定)功能表中的 Sessions(工作階段)和 Tokens(權杖)索引標籤來控制工作階段、cookie 和權杖逾時的功能。

Sessions(工作階段)索引標籤

Sessions Tab

設定 說明

SSO Session Idle(SSO 工作階段閒置)

此設定僅適用於 OIDC 用戶端。如果使用者閒置時間超過此逾時時間,則使用者工作階段會失效。當用戶端請求驗證或傳送重新整理權杖請求時,此逾時值會重設。Keycloak 會在閒置逾時時間中加入一段時間,才會使工作階段失效。請參閱本節稍後的注意事項

SSO Session Max(SSO 工作階段最大值)

使用者工作階段過期的最長時間。

SSO Session Idle Remember Me(SSO 工作階段閒置記住我)

此設定與標準的 SSO Session Idle(SSO 工作階段閒置)組態類似,但專門用於啟用 Remember Me(記住我)的登入。當使用者在登入時按一下 Remember Me(記住我)時,可以指定較長的工作階段閒置逾時時間。此設定為選用組態,如果其值不超過零,則會使用與 SSO Session Idle(SSO 工作階段閒置)組態相同的閒置逾時時間。

SSO Session Max Remember Me(SSO 工作階段最大值記住我)

此設定與標準的 SSO Session Max(SSO 工作階段最大值)類似,但專門用於 Remember Me(記住我)登入。當使用者在登入時按一下 Remember Me(記住我)時,可以指定較長的工作階段。此設定為選用組態,如果其值不超過零,則會使用與 SSO Session Max(SSO 工作階段最大值)組態相同的工作階段生命週期。

Client Session Idle(用戶端工作階段閒置)

用戶端工作階段的閒置逾時時間。如果使用者閒置時間超過此逾時時間,則用戶端工作階段會失效,且重新整理權杖請求會增加閒置逾時時間。此設定永遠不會影響一般 SSO 使用者工作階段,此工作階段是唯一的。請注意,SSO 使用者工作階段是零個或多個用戶端工作階段的父項,每當使用者登入不同的用戶端應用程式時,就會建立一個用戶端工作階段。此值應指定比 SSO Session Idle(SSO 工作階段閒置)更短的閒置逾時時間。使用者可以在 Advanced Settings(進階設定)用戶端索引標籤中覆寫個別用戶端的此設定。此設定為選用組態,當設定為零時,會使用與 SSO Session Idle(SSO 工作階段閒置)組態相同的閒置逾時時間。

Client Session Max(用戶端工作階段最大值)

用戶端工作階段的最大時間,以及重新整理權杖過期並失效之前的時間。如同先前的選項,此設定永遠不會影響 SSO 使用者工作階段,且應指定比 SSO Session Max(SSO 工作階段最大值)更短的值。使用者可以在 Advanced Settings(進階設定)用戶端索引標籤中覆寫個別用戶端的此設定。此設定為選用組態,當設定為零時,會使用與 SSO Session Max(SSO 工作階段最大值)組態相同的最大逾時時間。

Offline Session Idle(離線工作階段閒置)

此設定用於離線存取。工作階段保持閒置的時間量,之後 Keycloak 會撤銷其離線權杖。Keycloak 會在閒置逾時時間中加入一段時間,才會使工作階段失效。請參閱本節稍後的注意事項

Offline Session Max Limited(離線工作階段最大值限制)

此設定用於離線存取。如果此旗標為 Enabled(已啟用),Offline Session Max(離線工作階段最大值)可以控制離線權杖保持作用的最長時間,無論使用者活動如何。如果旗標為 Disabled(已停用),離線工作階段永遠不會因生命週期而過期,只會因閒置而過期。一旦啟用此選項,即可設定 Offline Session Max(離線工作階段最大值)(領域層級的全域選項)和 Client Offline Session Max(用戶端離線工作階段最大值)(Advanced Settings(進階設定)索引標籤中的特定用戶端層級選項)。

Offline Session Max(離線工作階段最大值)

此設定用於離線存取,這是 Keycloak 撤銷對應離線權杖之前的最長時間。此選項控制離線權杖保持作用的最長時間,無論使用者活動如何。

Login timeout(登入逾時)

登入必須花費的總時間。如果驗證所花費的時間超過此時間,使用者必須重新開始驗證程序。

Login action timeout(登入動作逾時)

在驗證程序期間,使用者在任何一個頁面可以停留的最長時間。

Tokens(權杖)索引標籤

Tokens Tab

設定 說明

Default Signature Algorithm(預設簽名演算法)

用於為領域指派權杖的預設演算法。

Revoke Refresh Token(撤銷重新整理權杖)

Enabled(已啟用)時,Keycloak 會撤銷重新整理權杖,並發出用戶端必須使用的另一個權杖。此動作適用於執行重新整理權杖流程的 OIDC 用戶端。

Access Token Lifespan(存取權杖生命週期)

當 Keycloak 建立 OIDC 存取權杖時,此值會控制權杖的生命週期。

Access Token Lifespan For Implicit Flow(隱含流程的存取權杖生命週期)

使用隱含流程時,Keycloak 不會提供重新整理權杖。針對隱含流程建立的存取權杖存在個別的逾時時間。

Client login timeout(用戶端登入逾時)

用戶端必須在 OIDC 中完成授權碼流程的最長時間。

User-Initiated Action Lifespan(使用者起始的動作生命週期)

使用者動作權限過期的最長時間。請將此值設為較短時間,因為使用者通常會快速回應自行建立的動作。

Default Admin-Initiated Action Lifespan(預設管理員起始的動作生命週期)

管理員傳送給使用者的動作權限過期的最長時間。請將此值設為較長時間,以便管理員可以向離線使用者傳送電子郵件。管理員可以在發出權杖之前覆寫預設的逾時時間。

Email Verification(電子郵件驗證)

指定電子郵件驗證的獨立逾時時間。

IdP account email verification(IdP 帳戶電子郵件驗證)

指定 IdP 帳戶電子郵件驗證的獨立逾時時間。

Forgot password(忘記密碼)

指定忘記密碼的獨立逾時時間。

Execute actions(執行動作)

指定執行動作的獨立逾時時間。

只有在持續使用者工作階段未啟用的情況下,才會套用以下邏輯

針對閒置逾時時間,工作階段存在兩分鐘的活動時間視窗。例如,當您將逾時時間設定為 30 分鐘時,工作階段會在 32 分鐘後過期。

在叢集和跨資料中心環境中的某些情況下,此動作是必要的,在這些情況下,權杖會在即將過期之前在一個叢集節點上重新整理,而其他叢集節點會錯誤地將工作階段視為已過期,因為它們尚未收到來自重新整理節點關於成功重新整理的訊息。

離線存取

離線存取登入期間,用戶端應用程式會請求離線權杖,而不是重新整理權杖。如果使用者登出,用戶端應用程式會儲存此離線權杖,並可以在未來登入時使用。如果您的應用程式需要在使用者未連線時代表使用者執行離線動作,此動作會很有用。例如,定期資料備份。

用戶端應用程式負責將離線權杖持續儲存在儲存空間中,然後使用它從 Keycloak 伺服器擷取新的存取權杖。

重新整理權杖和離線權杖之間的差異在於,離線權杖永遠不會過期,且不受 SSO Session Idle(SSO 工作階段閒置)逾時和 SSO Session Max(SSO 工作階段最大值)生命週期的約束。離線權杖在使用者登出後仍然有效。您必須至少每 30 天或針對 Offline Session Idle(離線工作階段閒置)的值使用離線權杖執行一次重新整理權杖動作。

如果您啟用Offline Session Max Limited(離線工作階段最大值限制),即使您使用離線權杖執行重新整理權杖動作,離線權杖也會在 60 天後過期。您可以在管理主控台中變更此值Offline Session Max(離線工作階段最大值)。

使用離線存取時,可以在用戶端層級覆寫用戶端閒置和最大逾時時間。用戶端 Advanced Settings(進階設定)索引標籤中的 Client Offline Session Idle(用戶端離線工作階段閒置)和 Client Offline Session Max(用戶端離線工作階段最大值)選項,可讓您針對特定應用程式設定較短的離線逾時時間。請注意,用戶端工作階段值也會控制重新整理權杖過期,但它們永遠不會影響全域離線使用者 SSO 工作階段。只有當領域層級的 Offline Session Max Limited(離線工作階段最大值限制)為 Enabled(已啟用)時,才會在用戶端中評估 Client Offline Session Max(用戶端離線工作階段最大值)選項。

如果您啟用 Revoke Refresh Token(撤銷重新整理權杖)選項,則您只能使用每個離線權杖一次。重新整理後,您必須儲存來自重新整理回應的新離線權杖,而不是先前的權杖。

使用者可以在 User Account Console(使用者帳戶主控台)中檢視和撤銷 Keycloak 授予他們的離線權杖。管理員可以在管理主控台的 Consents(同意)索引標籤中撤銷個別使用者的離線權杖。管理員可以在每個用戶端的 Offline Access(離線存取)索引標籤中檢視所有發出的離線權杖。管理員可以設定撤銷原則來撤銷離線權杖。

若要發出離線權杖,使用者必須具有領域層級 offline_access 角色的角色對應。用戶端的範圍中也必須具有該角色。用戶端必須將 offline_access 用戶端範圍以 Optional client scope(選用用戶端範圍)新增至角色,預設會執行此動作。

客戶端可以透過在發送授權請求給 Keycloak 時,加入參數 scope=offline_access 來請求離線令牌。當您使用 Keycloak OIDC 客戶端適配器來訪問應用程式的安全 URL(例如 https://127.0.0.1:8080/customer-portal/secured?scope=offline_access)時,它會自動加入此參數。如果將 scope=offline_access 加入身份驗證請求主體中,直接存取授權和服務帳戶也支援離線令牌。

Keycloak 預設會將其內部離線使用者和離線客戶端會話的快取限制為 10000 個條目,這將減少離線會話的整體記憶體使用量。從記憶體中逐出的項目會在需要時從資料庫按需載入。若要為快取設定不同的大小,請編輯 Keycloak 的快取設定檔,為這些快取設定 <memory max-count="..."/>

如果您停用了 persistent-user-sessions 功能,可以使用縮短匯入離線會話生命週期的設定選項來降低記憶體需求。這些會話將在指定的生命週期後從 Infinispan 快取中逐出,但仍然可在資料庫中取得。這將降低記憶體消耗,特別是對於具有大量離線會話的部署。

若要指定離線使用者會話的生命週期覆寫,請使用以下參數啟動 Keycloak 伺服器

--spi-user-sessions-infinispan-offline-session-cache-entry-lifespan-override=<lifespan-in-seconds>

同樣地,對於離線客戶端會話

--spi-user-sessions-infinispan-offline-client-session-cache-entry-lifespan-override=<lifespan-in-seconds>

暫時性會話

您可以在 Keycloak 中執行暫時性會話。當使用暫時性會話時,Keycloak 不會在成功身份驗證後建立使用者會話。Keycloak 會為當前成功驗證使用者的請求範圍建立一個臨時的暫時性會話。Keycloak 可以在身份驗證後使用暫時性會話執行協定對應器

當令牌使用暫時性會話發出時,令牌的 sidsession_state 通常是空的。因此,在暫時性會話期間,客戶端應用程式無法重新整理令牌或驗證特定會話。有時這些動作是不必要的,因此您可以避免持久化使用者會話的額外資源使用。此會話可節省效能、記憶體和網路通訊(在叢集和跨資料中心環境中)資源。

目前,僅在禁用令牌重新整理的服務帳戶身份驗證期間自動使用暫時性會話。請注意,除非客戶端開關 `Use refresh tokens for client credentials grant` 明確啟用,否則在服務帳戶身份驗證期間會自動禁用令牌重新整理。

使用角色和群組指派權限

角色和群組具有類似的目的,即授予使用者使用應用程式的權限。群組是您在其中應用角色和屬性的使用者集合。角色定義特定的應用程式權限和存取控制。

角色通常適用於一種使用者類型。例如,一個組織可能包含 adminusermanageremployee 角色。應用程式可以將存取權限指派給角色,然後將多個使用者指派給該角色,以便使用者擁有相同的存取權限。例如,管理控制台具有授予使用者存取管理控制台不同部分的權限的角色。

角色有一個全域命名空間,每個客戶端也有其自己的專用命名空間,可以在其中定義角色。

建立領域角色

領域級別角色是用於定義角色的命名空間。若要查看角色清單,請在選單中按一下 Realm Roles

roles

程序
  1. 按一下 Create Role

  2. 輸入 Role Name

  3. 輸入 Description

  4. 點擊 儲存

新增角色

Add role

可以使用 ${var-name} 字串指定替換變數來本地化 description 欄位。本地化值會在主題的屬性檔案中設定為您的主題。如需更多詳細資訊,請參閱 伺服器開發人員指南

客戶端角色

客戶端角色是專用於客戶端的命名空間。每個客戶端都有自己的命名空間。客戶端角色在每個客戶端的 Roles 索引標籤下管理。您與此 UI 的互動方式與領域級別角色相同。

將角色轉換為複合角色

任何領域或客戶端級別的角色都可以成為複合角色複合角色是一個與一個或多個其他角色相關聯的角色。當複合角色對應到使用者時,使用者會獲得與複合角色相關聯的角色。這種繼承是遞迴的,因此使用者也會繼承複合的任何複合。但是,我們建議不要過度使用複合角色。

程序
  1. 在選單中按一下 Realm Roles

  2. 按一下您要轉換的角色。

  3. Action 清單中,選取 Add associated roles

複合角色

Composite role

角色選擇 UI 會顯示在頁面上,您可以將領域級別和客戶端級別的角色與您正在建立的複合角色相關聯。

在此範例中,employee 領域級別角色與 developer 複合角色相關聯。任何具有 developer 角色的使用者也會繼承 employee 角色。

在建立令牌和 SAML 斷言時,任何複合也會將其相關聯的角色新增到傳回給客戶端的身份驗證回應的宣告和斷言中。

指派角色對應

您可以透過該使用者的 Role Mappings 索引標籤,將角色對應指派給使用者。

程序
  1. 在選單中點擊 使用者

  2. 按一下您想要在其上執行角色對應的使用者。

  3. 按一下 Role mappings 索引標籤。

  4. 按一下 Assign role

  5. 從對話方塊中選取您要指派給使用者的角色。

  6. 點擊 指派

角色對應

Role mappings

在前面的範例中,我們將複合角色 developer 指派給使用者。該角色是在複合角色主題中建立的。

有效角色對應

Effective role mappings

當指派 developer 角色時,與 developer 複合相關聯的 employee 角色會顯示為 Inherited「True」。Inherited 角色是明確指派給使用者的角色,以及從複合繼承的角色。

使用預設角色

當使用者透過身分識別中介建立或匯入時,使用預設角色自動指派使用者角色對應。

程序
  1. 點擊功能表中的 領域設定

  2. 按一下 User registration 索引標籤。

    預設角色

    Default roles

此螢幕擷取畫面顯示一些 *預設角色* 已經存在。

角色範圍對應

在建立 OIDC 存取令牌或 SAML 斷言時,使用者角色對應會成為令牌或斷言中的宣告。應用程式使用這些宣告來對應用程式控制的資源做出存取決策。Keycloak 會對存取令牌進行數位簽章,應用程式會重複使用這些令牌來叫用遠端受保護的 REST 服務。但是,這些令牌具有相關的風險。攻擊者可以取得這些令牌並使用其權限來危害您的網路。若要防止這種情況,請使用角色範圍對應

角色範圍對應會限制存取令牌內宣告的角色。當客戶端請求使用者身份驗證時,他們收到的存取令牌僅包含明確指定給客戶端範圍的角色對應。結果是,您限制了每個個別存取令牌的權限,而不是授予客戶端存取所有使用者權限的權限。

預設情況下,每個客戶端都會獲得使用者的所有角色對應。您可以檢視客戶端的角色對應。

程序
  1. 在選單中點擊 用戶端

  2. 按一下客戶端以進入詳細資料。

  3. 按一下 Client scopes 索引標籤。

  4. 按一下包含 *Dedicated scope and mappers for this client* 的列中的連結

  5. 按一下 Scope 索引標籤。

完整範圍

Full scope

預設情況下,範圍的有效角色是領域中宣告的每個角色。若要變更此預設行為,請將 Full Scope Allowed 切換為 OFF,並在每個客戶端中宣告您想要的特定角色。您也可以使用客戶端範圍來為一組客戶端定義相同的角色範圍對應。

部分範圍

Partial scope

群組

Keycloak 中的群組管理每個使用者的一組通用屬性和角色對應。使用者可以成為任意數量的群組成員,並繼承分配給每個群組的屬性和角色對應。

若要管理群組,請在選單中點擊 群組

群組

groups

群組是階層式的。一個群組可以有多個子群組,但一個群組只能有一個父群組。子群組會繼承其父群組的屬性和角色對應。使用者也會繼承其父群組的屬性和角色對應。

如果您有一個父群組和一個子群組,而使用者僅屬於該子群組,則該子群組中的使用者會繼承父群組和子群組的屬性和角色對應。

群組的階層有時會使用群組路徑來表示。路徑是表示特定群組階層的完整名稱清單,從上到下並以斜線 / 分隔(類似於檔案系統中的檔案)。例如,路徑可以是 /top/level1/level2,這表示 top 是頂層群組,並且是 level1 的父群組,而 level1 又是 level2 的父群組。此路徑明確地表示群組 level2 的階層。

由於歷史原因,Keycloak 不會逸出群組名稱本身的斜線。因此,在 top 下名為 level1/group 的群組會使用路徑 /top/level1/group,這具有誤導性。可以使用選項 --spi-group-jpa-escape-slashes-in-group-path 將 Keycloak 啟動為 true,然後名稱中的斜線會使用字元 ~ 逸出。逸出字元表示斜線是名稱的一部分,沒有階層意義。當逸出時,先前的路徑範例會是 /top/level1~/group

bin/kc.[sh|bat] start --spi-group-jpa-escape-slashes-in-group-path=true

以下範例包含一個頂層的 銷售 群組和一個子群組 北美

若要新增群組

  1. 點擊群組。

  2. 點擊 建立群組

  3. 輸入群組名稱。

  4. 點擊 建立

  5. 點擊群組名稱。

    即會顯示群組管理頁面。

    群組

    group

您定義的屬性和角色對應將由屬於該群組的群組和使用者繼承。

若要將使用者新增至群組

  1. 在選單中點擊 使用者

  2. 點擊您要執行角色對應的使用者。如果未顯示該使用者,請點擊 檢視所有使用者

  3. 點擊 群組

    使用者群組

    user groups

  4. 點擊 加入群組

  5. 從對話方塊中選取群組。

  6. 可用的群組 樹狀結構中選取群組。

  7. 點擊 加入

若要從使用者移除群組

  1. 在選單中點擊 使用者

  2. 點擊要從群組中移除的使用者。

  3. 點擊群組表格列上的 離開

在此範例中,使用者 jimlincoln 位於 北美 群組中。您可以在該群組的 成員 索引標籤下看到顯示的 jimlincoln

群組成員

group membership

群組與角色的比較

群組和角色有一些相似之處和差異。在 Keycloak 中,群組是您套用角色和屬性的使用者集合。角色定義使用者類型,而應用程式會將權限和存取控制指派給角色。

複合角色與群組相似,因為它們提供相同的功能。它們之間的區別在於概念上的差異。複合角色將權限模型套用至一組服務和應用程式。使用複合角色來管理應用程式和服務。

群組著重於使用者集合及其在組織中的角色。使用群組來管理使用者。

使用預設群組

若要自動將群組成員資格指派給任何已建立或透過 身分代理 匯入的使用者,您可以使用預設群組。

  1. 點擊功能表中的 領域設定

  2. 按一下 User registration 索引標籤。

  3. 點擊 預設群組 索引標籤。

    預設群組

    Default groups

此螢幕截圖顯示已存在一些預設群組

設定驗證

本章涵蓋數個驗證主題。這些主題包括

  • 強制執行嚴格的密碼和一次性密碼 (OTP) 原則。

  • 管理不同的認證類型。

  • 使用 Kerberos 登入。

  • 停用和啟用內建的認證類型。

密碼原則

當 Keycloak 建立網域時,它不會將密碼原則與該網域建立關聯。您可以設定一個簡單的密碼,且對其長度、安全性或複雜性沒有限制。簡單密碼在生產環境中是不可接受的。Keycloak 有一組可透過管理主控台使用的密碼原則。

程序
  1. 在選單中點擊驗證

  2. 點擊 原則 索引標籤。

  3. 新增原則 下拉式方塊中選取要新增的原則。

  4. 輸入適用於所選原則的值。

  5. 點擊 儲存

    密碼原則 密碼原則

儲存原則後,Keycloak 會對新使用者強制執行該原則。

新原則對現有使用者無效。因此,請確保從網域建立開始就設定密碼原則,或將「更新密碼」新增至現有使用者,或使用「密碼過期」以確保使用者在接下來的「N」天內更新其密碼,這實際上會調整為新的密碼原則。

密碼原則類型

雜湊演算法

密碼不會以純文字儲存。在儲存或驗證之前,Keycloak 會使用標準雜湊演算法雜湊密碼。

支援的密碼雜湊演算法包括

  • argon2:: Argon2(非 FIPS 部署的預設值)

  • pbkdf2-sha512:: 使用 SHA512 的 PBKDF2(FIPS 部署的預設值)

  • pbkdf2-sha256:: 使用 SHA256 的 PBKDF2

  • pbkdf2:: 使用 SHA1 的 PBKDF2(已淘汰)

強烈建議盡可能使用 Argon2,因為與 PBKDF2 相比,它對 CPU 的要求明顯較低,同時也更安全。

伺服器的預設密碼雜湊演算法可以使用 --spi-password-hashing-provider-default=<algorithm> 進行設定。

為防止過度使用記憶體和 CPU,Argon2 的雜湊平行運算預設會限制為 JVM 可用的核心數量。若要設定 Argon2 雜湊提供者,請使用其提供者選項。

請參閱伺服器開發人員指南,了解如何新增您自己的雜湊演算法。

如果您變更雜湊演算法,則儲存空間中的密碼雜湊將不會變更,直到使用者登入為止。

雜湊反覆運算

指定 Keycloak 在儲存或驗證之前雜湊密碼的次數。預設值為 -1,這會使用所選雜湊演算法的預設雜湊間隔。

  • argon2:: 5

  • pbkdf2-sha512:: 210,000

  • pbkdf2-sha256:: 600,000

  • pbkdf2:: 1,300,000

在大多數情況下,雜湊反覆運算不應變更為建議的預設值。較低的反覆運算值會提供不足的安全性,而較高的值則會導致更高的 CPU 功率需求。

數字

密碼字串中所需的數字位數。

小寫字元

密碼字串中所需的小寫字母數量。

大寫字元

密碼字串中所需的大寫字母數量。

特殊字元

密碼字串中所需的特殊字元數量。

非使用者名稱

密碼不能與使用者名稱相同。

非電子郵件

密碼不能與使用者的電子郵件地址相同。

正規表示式

密碼必須符合一個或多個已定義的 Java 正規表示式模式。請參閱 Java 的正規表示式文件,以了解這些表示式的語法。

密碼過期

密碼有效的天數。當天數過期時,使用者必須變更其密碼。

非最近使用

使用者不能使用已使用的密碼。Keycloak 會儲存已使用密碼的歷史記錄。儲存的舊密碼數量可在 Keycloak 中設定。

非最近使用 (天數)

密碼在設定的時間範圍內(以天為單位)無法重複使用。如果新密碼是在此期間內設定的,使用者將被迫提供不同的密碼。

密碼黑名單

密碼不得在黑名單檔案中。

  • 黑名單檔案是使用 Unix 行尾符號的 UTF-8 純文字檔案。每一行代表一個列入黑名單的密碼。

  • Keycloak 會以不區分大小寫的方式比較密碼。

  • 黑名單檔案的值必須是黑名單檔案的名稱,例如 100k_passwords.txt

  • 黑名單檔案預設會解析為 ${kc.home.dir}/data/password-blacklists/。您可以使用以下方式自訂此路徑:

    • keycloak.password.blacklists.path 系統屬性。

    • passwordBlacklist 原則 SPI 設定的 blacklistsPath 屬性。若要使用 CLI 設定黑名單資料夾,請使用 --spi-password-policy-password-blacklist-blacklists-path=/path/to/blacklistsFolder

關於誤判的注意事項

目前的實作使用 BloomFilter 來進行快速且記憶體有效率的包含檢查,例如判斷給定的密碼是否包含在黑名單中,但有可能發生誤判。

  • 預設會使用 0.01% 的誤判機率。

  • 若要透過 CLI 設定變更誤判機率,請使用 --spi-password-policy-password-blacklist-false-positive-probability=0.00001

最大驗證時效

指定使用者在無需重新驗證的情況下更新密碼的最大驗證時效(以秒為單位)。值為 0 表示使用者必須先使用其目前的密碼重新驗證,才能更新密碼。請參閱 AIA 區段,以了解有關此原則的一些其他詳細資訊。

當在管理控制台的「必要動作」索引標籤中設定必要動作「更新密碼」時,也可以設定「最大驗證時效」。較好的選擇是使用必要動作進行設定,因為「最大驗證時效」密碼原則未來可能會被棄用/移除。

一次性密碼 (OTP) 原則

Keycloak 有數個原則可設定 FreeOTP 或 Google Authenticator 一次性密碼產生器。

程序
  1. 在選單中點擊驗證

  2. 按一下「原則」索引標籤。

  3. 按一下「OTP 原則」索引標籤。

OTP 原則

OTP Policy

Keycloak 會在 OTP 設定頁面上產生 QR 碼,此 QR 碼基於「OTP 原則」索引標籤中設定的資訊。FreeOTP 和 Google Authenticator 會在設定 OTP 時掃描 QR 碼。

基於時間或計數器的一次性密碼

Keycloak 中可供您的 OTP 產生器使用的演算法有基於時間和基於計數器兩種。

使用基於時間的一次性密碼 (TOTP),權杖產生器會雜湊目前的時間和共用機密。伺服器會藉由比較一段時間範圍內的雜湊值與提交的值來驗證 OTP。TOTP 在短時間範圍內有效。

使用基於計數器的一次性密碼 (HOTP),Keycloak 會使用共用計數器而非目前的時間。Keycloak 伺服器會在每次成功 OTP 登入時遞增計數器。有效的 OTP 會在成功登入後變更。

TOTP 比 HOTP 更安全,因為可匹配的 OTP 在短時間範圍內有效,而 HOTP 的 OTP 在不確定的時間內有效。HOTP 比 TOTP 更方便使用者,因為輸入 OTP 沒有時間限制。

HOTP 每次伺服器遞增計數器時都需要更新資料庫。此更新會在負載繁重時消耗驗證伺服器的效能。為了提高效率,TOTP 不會記住已使用的密碼,因此不需要執行資料庫更新。缺點是可以在有效時間間隔內重複使用 TOTP。

TOTP 設定選項

OTP 雜湊演算法

預設演算法為 SHA1。其他更安全的選項為 SHA256 和 SHA512。

位數

OTP 的長度。較短的 OTP 方便使用者使用,更容易輸入和記住。較長的 OTP 比短的 OTP 更安全。

環顧視窗

伺服器嘗試比對雜湊值的間隔數。如果 TOTP 產生器或驗證伺服器的時鐘不同步,則 Keycloak 中會顯示此選項。預設值 1 即可。例如,如果權杖的時間間隔為 30 秒,則預設值 1 表示它會在 90 秒的視窗內接受有效的權杖(時間間隔 30 秒 + 向前看 30 秒 + 向後看 30 秒)。此值的每次遞增都會將有效視窗增加 60 秒(向前看 30 秒 + 向後看 30 秒)。

OTP 權杖週期

伺服器比對雜湊值的時間間隔(以秒為單位)。每次間隔經過時,權杖產生器都會產生 TOTP。

可重複使用的代碼

決定是否可以在驗證過程中重複使用 OTP 權杖,或使用者是否需要等待下一個權杖。預設情況下,使用者無法重複使用這些權杖,且管理員需要明確指定這些權杖可以重複使用。

HOTP 設定選項

OTP 雜湊演算法

預設演算法為 SHA1。其他更安全的選項為 SHA256 和 SHA512。

位數

OTP 的長度。較短的 OTP 方便使用者使用,更容易輸入和記住。較長的 OTP 比短的 OTP 更安全。

環顧視窗

伺服器嘗試比對雜湊值的前後間隔數。如果 TOTP 產生器或驗證伺服器的時鐘不同步,則 Keycloak 中會顯示此選項。預設值 1 即可。Keycloak 中會顯示此選項,以涵蓋使用者計數器超前伺服器的情況。

初始計數器

初始計數器的值。

驗證流程

驗證流程是登入、註冊和其他 Keycloak 工作流程期間的驗證、畫面和動作的容器。

內建流程

Keycloak 有數個內建流程。您無法修改這些流程,但您可以變更流程的需求以符合您的需求。

程序
  1. 在選單中點擊驗證

  2. 按一下清單中的「瀏覽器」項目以查看詳細資訊。

瀏覽器流程

Browser Flow

驗證類型

要執行的驗證或動作的名稱。如果驗證已縮排,則表示它在子流程中。它可能會執行,也可能不會執行,具體取決於其父項的行為。

  1. Cookie

    使用者首次成功登入時,Keycloak 會設定工作階段 Cookie。如果已設定 Cookie,則此驗證類型會成功。由於 Cookie 提供者傳回成功,且此流程層級的每次執行都是「替代」的,因此 Keycloak 不會執行任何其他執行。這會導致登入成功。

  2. Kerberos

    此驗證器預設為停用,且會在瀏覽器流程期間略過。

  3. 身分提供者重新導向器

    此動作會透過「動作」>「設定」連結設定。它會重新導向至另一個 IdP 以進行身分中介

  4. 表單

    由於此子流程標記為「替代」,因此如果「Cookie」驗證類型通過,則不會執行。此子流程包含需要執行的其他驗證類型。Keycloak 會載入此子流程的執行並處理它們。

第一個執行是「使用者名稱密碼表單」,這是一種會呈現使用者名稱和密碼頁面的驗證類型。它標記為「必要」,因此使用者必須輸入有效的使用者名稱和密碼。

第二個執行是「瀏覽器 - 條件式 OTP」子流程。此子流程為「條件式」,並會根據「條件 - 使用者已設定」執行的結果執行。如果結果為 true,則 Keycloak 會載入此子流程的執行並處理它們。

下一個執行是「條件 - 使用者已設定」驗證。此驗證會檢查 Keycloak 是否已在流程中為使用者設定其他執行。「瀏覽器 - 條件式 OTP」子流程僅在使用者已設定 OTP 憑證時執行。

最後的執行是「OTP 表單」。Keycloak 會將此執行標記為「必要」,但只有在使用者因為「條件式」子流程中的設定而設定 OTP 憑證時才會執行。如果沒有,使用者就不會看到 OTP 表單。

需求

一組控制動作執行的單選按鈕。

必要

流程中的所有「必要」元素都必須依序成功執行。如果必要元素失敗,則流程會終止。

替代

只需要成功執行單一元素,流程就會評估為成功。由於「必要」流程元素足以將流程標記為成功,因此包含「必要」流程元素的流程中的任何「替代」流程元素都不會執行。

已停用

元素不會計入以將流程標記為成功。

條件式

此需求類型僅設定於子流程中。

  • 條件式」子流程包含執行。這些執行必須評估為邏輯陳述式。

  • 如果所有執行都評估為「true」,則「條件式」子流程會作為「必要」來運作。

  • 如果任何執行評估為「false」,則「條件式」子流程會作為「已停用」來運作。

  • 如果未設定執行,則「條件式」子流程會作為「已停用」來運作。

  • 如果流程包含執行,且該流程未設定為「條件式」,則 Keycloak 不會評估執行,並且執行在功能上會被視為「已停用」。

建立流程

在設計流程時,會應用重要的功能和安全性考量。

若要建立流程,請執行以下步驟:

程序
  1. 在選單中點擊驗證

  2. 點擊 建立流程

您可以複製現有的流程,然後修改它。點擊「動作清單」(列尾的三個點),點擊 複製,然後輸入新流程的名稱。

建立新流程時,您必須先建立一個頂層流程,並具有以下選項:

名稱

流程的名稱。

說明

您可以為流程設定的描述。

頂層流程類型

流程的類型。client 類型僅用於用戶端(應用程式)的身份驗證。對於所有其他情況,請選擇 basic

建立頂層流程

Top Level Flow

當 Keycloak 建立流程後,Keycloak 會顯示 新增步驟新增子流程 按鈕。

一個空白的新流程

New Flow

有三個因素決定流程和子流程的行為:

  • 流程和子流程的結構。

  • 流程內的執行。

  • 子流程和執行中設定的需求。

執行有多種動作,從發送重設電子郵件到驗證 OTP。使用 新增步驟 按鈕新增執行。

新增身份驗證執行

Adding an Authentication Execution

身份驗證執行可以選擇性地設定參考值。身份驗證方法參考 (AMR) 協定對應器可以使用此值來填入 OIDC 存取和 ID 權杖中的 amr 宣告(有關 AMR 宣告的更多資訊,請參閱 RFC-8176)。當為用戶端設定 身份驗證方法參考 (AMR) 協定對應器時,它會使用使用者在身份驗證流程中成功完成的任何驗證器執行的參考值,來填入 amr 宣告。

新增驗證器參考值

Configuring an Authenticator Reference Value

有兩種執行類型,自動執行互動式執行自動執行 類似於 Cookie 執行,並且會在流程中自動執行其動作。互動式執行 會暫停流程以獲取輸入。成功執行的執行會將其狀態設定為 success。若要完成流程,它至少需要一個狀態為 success 的執行。

您可以使用 新增子流程 按鈕,將子流程新增至頂層流程。新增子流程 按鈕會顯示 建立執行流程 頁面。此頁面類似於 建立頂層表單 頁面。不同之處在於 流程類型 可以是 basic(預設)或 formform 類型會建構一個子流程,為使用者產生一個表單,類似於內建的 註冊 流程。子流程是否成功取決於其執行如何評估,包括其包含的子流程。有關子流程如何運作的深入說明,請參閱 執行需求章節

新增執行後,請檢查需求是否具有正確的值。

流程中的所有元素在其旁邊都有 刪除 選項。某些執行具有 ⚙️ 選單項目(齒輪圖示)來設定執行。也可以使用 新增步驟新增子流程 連結,將執行和子流程新增至子流程。

由於執行的順序很重要,您可以透過拖曳其名稱來上下移動執行和子流程。

當您設定身份驗證流程時,請務必正確測試您的設定,以確認您的設定中不存在任何安全性漏洞。我們建議您測試各種邊角案例。例如,請考慮在身份驗證之前,從使用者的帳戶中移除各種憑證時,測試使用者的身份驗證行為。

例如,當流程中設定了第二因素驗證器(例如 OTP 表單或 WebAuthn 驗證器)為「必要」時,且使用者沒有特定類型的憑證,則使用者將能夠在身份驗證期間設定該特定憑證。這種情況表示使用者在身份驗證期間設定憑證時,並不會使用此憑證進行身份驗證。因此,對於瀏覽器身份驗證,請確保使用一些第一因素憑證(例如密碼或 WebAuthn 無密碼驗證器)來設定您的身份驗證流程。

建立無密碼瀏覽器登入流程

為了說明流程的建立,本節將描述如何建立進階瀏覽器登入流程。此流程的目的是讓使用者可以選擇使用 WebAuthn 以無密碼方式登入,或是使用密碼和 OTP 進行雙因素驗證。

程序
  1. 在選單中點擊驗證

  2. 點擊流程索引標籤。

  3. 點擊 建立流程

  4. 輸入 無密碼瀏覽器 作為名稱。

  5. 點擊 建立

  6. 點擊 新增執行

  7. 從清單中選取 Cookie

  8. 點擊 新增

  9. Cookie 驗證類型選取 替代,以將其需求設定為替代。

  10. 點擊 新增步驟

  11. 從清單中選取 Kerberos

  12. 點擊 新增

  13. 點擊 新增步驟

  14. 從清單中選取 身份提供者重新導向器

  15. 點擊 新增

  16. 身份提供者重新導向器 驗證類型選取 替代,以將其需求設定為替代。

  17. 點擊 新增子流程

  18. 輸入 表單 作為名稱。

  19. 點擊 新增

  20. 表單 驗證類型選取 替代,以將其需求設定為替代。

    與瀏覽器流程的共同部分

    Passwordless browser login

  21. 點擊 表單 執行的 + 選單。

  22. 選取 新增步驟

  23. 從清單中選取 使用者名稱表單

  24. 點擊 新增

在此階段,表單需要使用者名稱,但不需要密碼。我們必須啟用密碼驗證,以避免安全性風險。

  1. 點擊 表單 子流程的 + 選單。

  2. 點擊 新增子流程

  3. 輸入 身份驗證 作為名稱。

  4. 點擊 新增

  5. 身份驗證 驗證類型選取 必要,以將其需求設定為必要。

  6. 點擊 身份驗證 子流程的 + 選單。

  7. 點擊 新增步驟

  8. 從清單中選取 WebAuthn 無密碼驗證器

  9. 點擊 新增

  10. WebAuthn 無密碼驗證器 驗證類型選取 替代,以將其需求設定為替代。

  11. 點擊 身份驗證 子流程的 + 選單。

  12. 點擊 新增子流程

  13. 輸入 帶有 OTP 的密碼 作為名稱。

  14. 點擊 新增

  15. 帶有 OTP 的密碼 驗證類型選取 替代,以將其需求設定為替代。

  16. 點擊 帶有 OTP 的密碼 子流程的 + 選單。

  17. 點擊 新增步驟

  18. 從清單中選取 密碼表單

  19. 點擊 新增

  20. 密碼表單 驗證類型選取 必要,以將其需求設定為必要。

  21. 點擊 帶有 OTP 的密碼 子流程的 + 選單。

  22. 點擊 新增步驟

  23. 從清單中選取 OTP 表單

  24. 點擊 新增

  25. OTP 表單 驗證類型點擊 必要,以將其需求設定為必要。

最後,變更繫結。

  1. 點擊螢幕頂端的 動作 選單。

  2. 從選單中選取 繫結流程

  3. 點擊 瀏覽器流程 下拉式清單。

  4. 點擊 儲存

無密碼瀏覽器登入

Passwordless browser login

輸入使用者名稱後,流程的運作方式如下:

如果使用者已記錄 WebAuthn 無密碼憑證,他們可以使用這些憑證直接登入。這是無密碼登入。使用者也可以選取 帶有 OTP 的密碼,因為 WebAuthn 無密碼 執行和 帶有 OTP 的密碼 流程設定為 替代。如果它們設定為 必要,使用者必須輸入 WebAuthn、密碼和 OTP。

如果使用者選取帶有 WebAuthn 無密碼 身份驗證的 嘗試其他方式 連結,使用者可以在 密碼密鑰(WebAuthn 無密碼)之間選擇。當選取密碼時,使用者需要繼續並使用指派的 OTP 登入。如果使用者沒有 WebAuthn 憑證,則必須輸入密碼,然後輸入 OTP。如果使用者沒有 OTP 憑證,系統會要求他們記錄一個。

由於 WebAuthn 無密碼執行設定為 替代 而不是 必要,因此此流程永遠不會要求使用者註冊 WebAuthn 憑證。若要讓使用者擁有 WebAuthn 憑證,管理員必須為使用者新增必要動作。請透過以下方式執行此操作:

  1. 在領域中啟用 WebAuthn 註冊無密碼 必要動作(請參閱 WebAuthn 文件)。

  2. 使用使用者 憑證 管理選單的 憑證重設 部分來設定必要動作。

建立像這樣的進階流程可能會產生副作用。例如,如果您啟用使用者重設密碼的功能,則可以從密碼表單存取此功能。在預設的 重設憑證 流程中,使用者必須輸入其使用者名稱。由於使用者已在 無密碼瀏覽器 流程中較早輸入使用者名稱,因此此動作對於 Keycloak 而言是不必要的,並且對使用者體驗來說並非最佳。若要更正此問題,您可以:

  • 複製 重設憑證 流程。將其名稱設定為 無密碼重設憑證,例如。

  • 點擊 選擇使用者 步驟的 刪除(垃圾桶圖示)。

  • 動作 選單中,選取 繫結流程,然後從下拉式選單中選取 重設憑證流程,並點擊 儲存

建立具有逐步升級機制的瀏覽器登入流程

本節描述如何使用逐步升級機制建立進階瀏覽器登入流程。逐步升級身份驗證的目的是根據使用者的特定身份驗證等級,允許存取用戶端或資源。

程序
  1. 在選單中點擊驗證

  2. 點擊流程索引標籤。

  3. 點擊 建立流程

  4. 輸入 瀏覽器包含逐步升級機制 作為名稱。

  5. 點擊 儲存

  6. 點擊 新增執行

  7. 從清單中選取 Cookie

  8. 點擊 新增

  9. Cookie 驗證類型選取 替代,以將其需求設定為替代。

  10. 點擊 新增子流程

  11. 輸入 身份驗證流程 作為名稱。

  12. 點擊 新增

  13. 身份驗證流程 驗證類型點擊 替代,以將其需求設定為替代。

現在,您為第一個身份驗證等級設定流程。

  1. 點擊 身份驗證流程+ 選單。

  2. 點擊 新增子流程

  3. 輸入 第一個條件流程 作為名稱。

  4. 點擊 新增

  5. 第一個條件流程 驗證類型點擊 條件式,以將其需求設定為條件式。

  6. 點擊 第一個條件流程+ 選單。

  7. 點擊 新增條件

  8. 從清單中選取 條件式 - 身份驗證等級

  9. 點擊 新增

  10. 條件式 - 身份驗證等級 驗證類型點擊 必要,以將其需求設定為必要。

  11. 點擊 ⚙️(齒輪圖示)。

  12. 輸入 等級 1 作為別名。

  13. 為身份驗證等級 (LoA) 輸入 1

  14. 將「最長存留時間」設定為 36000。此值以秒為單位,相當於 10 小時,也就是網域中設定的預設 SSO 工作階段最長逾時時間。因此,當使用者以此層級進行驗證時,後續的 SSO 登入可以重複使用此層級,使用者不需要使用此層級進行驗證,直到使用者工作階段結束,預設為 10 小時。

  15. 點擊「儲存

    設定第一個驗證層級的條件

    Authentication step up condition 1

  16. 點擊 第一個條件流程+ 選單。

  17. 點擊 新增步驟

  18. 從清單中選取「使用者名稱密碼表單」。

  19. 點擊 新增

現在,您要設定第二個驗證層級的流程。

  1. 點擊 身份驗證流程+ 選單。

  2. 點擊 新增子流程

  3. 輸入 2nd Condition Flow 作為別名。

  4. 點擊 新增

  5. 針對「2nd Condition Flow」驗證類型點擊「條件式」,將其需求設定為條件式。

  6. 點擊「2nd Condition Flow」的「+」選單。

  7. 點擊 新增條件

  8. 從項目清單中選取「條件式 - 驗證層級」。

  9. 點擊 新增

  10. 條件式 - 身份驗證等級 驗證類型點擊 必要,以將其需求設定為必要。

  11. 點擊 ⚙️(齒輪圖示)。

  12. 輸入 Level 2 作為別名。

  13. 針對「驗證層級 (LoA)」輸入 2

  14. 將「最長存留時間」設定為 0。因此,當使用者進行驗證時,此層級僅對目前的驗證有效,而對任何後續的 SSO 驗證無效。因此,當要求此層級時,使用者將始終需要再次使用此層級進行驗證。

  15. 點擊「儲存

    設定第二個驗證層級的條件

    Autehtnication step up condition 2

  16. 點擊「2nd Condition Flow」的「+」選單。

  17. 點擊 新增步驟

  18. 從清單中選取 OTP 表單

  19. 點擊 新增

  20. OTP 表單 驗證類型點擊 必要,以將其需求設定為必要。

最後,變更繫結。

  1. 點擊螢幕頂端的 動作 選單。

  2. 從清單中選取「繫結流程」。

  3. 在下拉式選單中選取「瀏覽器流程」。

  4. 點擊 儲存

使用逐步機制進行瀏覽器登入

Authentication step up flow

請求特定的驗證層級

若要使用逐步機制,您需要在驗證請求中指定要求的驗證層級 (LoA)。claims 參數用於此目的

https://{DOMAIN}/realms/{REALMNAME}/protocol/openid-connect/auth?client_id={CLIENT-ID}&redirect_uri={REDIRECT-URI}&scope=openid&response_type=code&response_mode=query&nonce=exg16fxdjcu&claims=%7B%22id_token%22%3A%7B%22acr%22%3A%7B%22essential%22%3Atrue%2C%22values%22%3A%5B%22gold%22%5D%7D%7D%7D

claims 參數以 JSON 表示法指定

claims= {
            "id_token": {
                "acr": {
                    "essential": true,
                    "values": ["gold"]
                }
            }
        }

Keycloak JavaScript 介面卡支援輕鬆建構此 JSON 並在登入請求中傳送。如需更多詳細資訊,請參閱「保護應用程式」章節中的「Keycloak JavaScript 介面卡」。

您也可以使用較簡單的參數 acr_values,而不是 claims 參數來請求特定的層級,但這些層級並非必要。這在 OIDC 規格中有提到。

您也可以為特定的用戶端設定預設層級,當參數 acr_values 或帶有 acr 宣告的參數 claims 不存在時,會使用此層級。如需更多詳細資訊,請參閱 用戶端 ACR 設定)。

若要請求文字 (例如 gold) 形式的 acr_values,而不是數值,您可以設定 ACR 和 LoA 之間的對應。可以在網域層級 (建議) 或用戶端層級設定。如需設定,請參閱 ACR 到 LoA 對應

如需更多詳細資訊,請參閱 官方 OIDC 規格

流程邏輯

先前設定的驗證流程的邏輯如下
如果用戶端請求較高的驗證層級,也就是驗證層級 2 (LoA 2),使用者必須執行完整的雙因素驗證:使用者名稱/密碼 + OTP。但是,如果使用者在 Keycloak 中已經有工作階段,該工作階段是使用使用者名稱和密碼 (LoA 1) 登入的,則只會要求使用者提供第二個驗證因素 (OTP)。

條件中的「最長存留時間」選項會決定後續驗證層級的有效時間 (秒數)。此設定有助於判斷使用者是否會在後續驗證期間再次被要求提供驗證因素。如果 claimsacr_values 參數要求特定層級 X,且使用者已經使用層級 X 進行驗證,但已過期 (例如,最長存留時間設定為 300,且使用者在 310 秒之前進行驗證),則會要求使用者再次使用該特定層級重新驗證。但是,如果該層級尚未過期,則會自動將使用者視為已使用該層級驗證。

將「最長存留時間」設定為值 0 表示,該特定層級僅對此單次驗證有效。因此,每次重新驗證要求該層級時,都需要再次使用該層級進行驗證。這對於應用程式中需要較高安全性的操作 (例如,發送付款) 非常有用,並且始終需要使用特定層級進行驗證。

請注意,當從用戶端透過使用者的瀏覽器將登入請求傳送至 Keycloak 時,使用者可能會在 URL 中變更參數 (例如 claimsacr_values)。如果用戶端使用 PAR (推送授權請求)、請求物件或其他可防止使用者改寫 URL 中參數的機制,則可以避免這種情況。因此,在驗證之後,建議用戶端檢查 ID 權杖,以再次確認權杖中的 acr 是否與預期的層級對應。

如果沒有透過參數明確要求層級,則 Keycloak 將要求使用驗證流程中找到的第一個 LoA 條件進行驗證,例如先前範例中的使用者名稱/密碼。當使用者已經使用該層級進行驗證且該層級已過期時,不會要求使用者重新驗證,但權杖中的 acr 值將為 0。此結果被視為完全基於 OIDC Core 1.0 規格第 2 節中提到的 長期存在的瀏覽器 Cookie 的驗證。

在使用者首次驗證期間,始終會執行第一個設定的子流程,其中包含「條件式 - 驗證層級」(無論要求的層級為何),因為使用者尚未擁有任何層級。因此,我們建議第一個層級子流程包含使用者驗證所需的最低驗證器。此外,請確保具有不同「條件式 - 驗證層級」值的子流程,以最低層級開始排序,如以上範例所示。例如,如果您設定層級為 2 的子流程,然後新增另一個層級為 1 的子流程,則會在首次驗證期間始終要求層級為 2 的子流程,這可能不是預期的行為。
當管理員指定多個流程、為每個流程設定不同的 LoA 層級,並將流程指派給不同的用戶端時,可能會發生衝突情況。但是,規則始終相同:如果使用者具有特定層級,則僅需要該層級即可連線至用戶端。管理員有責任確保 LoA 是一致的。

範例情境

  1. 層級 1 條件的最長存留時間設定為 300 秒。

  2. 傳送登入請求,但不要求任何 acr。將使用層級 1,並且使用者需要使用使用者名稱和密碼進行驗證。權杖將具有 acr=1

  3. 在 100 秒後傳送另一個登入請求。使用者會由於 SSO 而自動驗證,且權杖將傳回 acr=1

  4. 在經過另一個 201 秒後 (自第 2 點驗證起經過 301 秒) 傳送另一個登入請求。使用者會由於 SSO 而自動驗證,但由於層級 1 已被視為過期,權杖將傳回 acr=0

  5. 傳送另一個登入請求,但現在會在 claims 參數中明確要求層級 1 的 ACR。會要求使用者重新使用使用者名稱/密碼進行驗證,然後在權杖中傳回 acr=1

權杖中的 ACR 宣告

ACR 宣告會由 acr 用戶端範圍中定義的 acr loa level 通訊協定對應程式新增至權杖。此用戶端範圍是網域預設用戶端範圍,因此將新增至網域中所有新建立的用戶端。

如果您不希望權杖內有 acr 宣告,或您需要新增它的某些自訂邏輯,您可以從用戶端中移除用戶端範圍。

請注意,當登入請求起始帶有 claims 參數的請求,要求 acr 作為 essential 宣告時,Keycloak 始終會傳回指定的層級之一。如果無法傳回指定的層級之一 (例如,如果要求的層級未知,或大於驗證流程中設定的條件),則 Keycloak 會擲回錯誤。

用戶端要求的註冊或重設認證

通常,當使用者從用戶端應用程式重新導向至 Keycloak 時,會觸發 browser 流程。如果啟用網域註冊,且使用者在登入畫面上點擊「註冊」,此流程可能會允許使用者註冊。此外,如果為網域啟用忘記密碼,使用者可以在登入畫面上點擊「忘記密碼」,這會觸發「重設認證」流程,讓使用者在電子郵件地址確認後重設認證。

有時,讓用戶端應用程式將使用者直接重新導向至「註冊」畫面或「重設認證」流程會很有用。產生的動作將與使用者在正常登入畫面上點擊「註冊」或「忘記密碼」時的動作相符。可以透過以下方式執行自動重新導向至註冊或重設認證畫面

  • 當用戶端希望將使用者直接重新導向至註冊時,OIDC 用戶端應將 OIDC 登入 URL 路徑中的最後一個程式碼片段 (/auth) 取代為 /registrations。因此,完整的 URL 可能類似於以下:https://keycloak.example.com/realms/your_realm/protocol/openid-connect/registrations

  • 當用戶端希望將使用者直接重新導向至「重設認證」流程時,OIDC 用戶端應將 OIDC 登入 URL 路徑中的最後一個程式碼片段 (/auth) 取代為 /forgot-credentials

先前的步驟是用戶端直接要求註冊或重設認證流程的唯一支援方法。為了安全起見,不支援且不建議用戶端應用程式略過 OIDC/SAML 流程,直接重新導向至其他 Keycloak 端點 (例如 /realms/realm_name/login-actions/realms/realm_name/broker 下的端點)。

使用者工作階段限制

可以設定使用者可以擁有的工作階段數目限制。可以針對每個網域或每個用戶端限制工作階段。

若要將工作階段限制新增至流程,請執行以下步驟。

  1. 針對流程點擊「新增步驟」。

  2. 從項目清單中選取「使用者工作階段計數限制器」。

  3. 點擊 新增

  4. 針對「使用者工作階段計數限制器」驗證類型點擊「必要」,將其需求設定為必要。

  5. 針對「使用者工作階段計數限制器」點擊「⚙️」(齒輪圖示)。

  6. 輸入此設定的別名。

  7. 輸入使用者可以在此網域中擁有的最大工作階段數目。例如,如果值為 2,則每個使用者在此網域中可以擁有的最大 SSO 工作階段數目為 2。如果值為 0,則會停用此檢查。

  8. 輸入用戶端允許使用者擁有的最大連線數。例如,如果值為 2,則每個用戶端在此領域中最多允許 2 個 SSO 連線。因此,當使用者嘗試驗證到用戶端 foo 時,如果該使用者已經驗證到用戶端 foo 的 2 個 SSO 連線,則會根據設定的行為拒絕驗證或終止現有連線。如果值為 0,則會停用此檢查。如果同時啟用連線限制和用戶端連線限制,則將用戶端連線限制設定為始終低於連線限制是合理的。每個用戶端的限制永遠不能超過此使用者的所有 SSO 連線的限制。

  9. 選擇在使用者嘗試在達到限制後建立連線時所需的行為。可用的行為如下:

    • 拒絕新的連線 - 當請求新的連線且已達到連線限制時,無法建立新的連線。

    • 終止最舊的連線 - 當請求新的連線且已達到連線限制時,將移除最舊的連線並建立新的連線。

  10. 可選地,新增在達到限制時要顯示的自訂錯誤訊息。

請注意,使用者連線限制應新增到您綁定的瀏覽器流程直接授權流程重設憑證以及任何中介者登入後流程。驗證器應在驗證期間已知使用者時新增(通常在驗證流程的結尾),且通常應為「必要」。請注意,不可能在同一層級同時執行「替代」和「必要」。

對於大多數驗證器,例如 直接授權流程重設憑證中介者登入後流程,建議在驗證流程的結尾將驗證器新增為「必要」。以下是 重設憑證 流程的範例

Authentication User Session Limits Reset Credentials Flow

對於 瀏覽器 流程,請考慮不要在頂層流程中新增「連線限制」驗證器。此建議是因為 Cookie 驗證器會根據 SSO Cookie 自動重新驗證使用者。它位於頂層,最好不要在 SSO 重新驗證期間檢查連線限制,因為使用者連線已存在。因此,請考慮新增一個單獨的「替代」子流程,例如與 Cookie 位於同一層級的以下 authenticate-user-with-session-limit 範例。然後,您可以新增一個「必要」子流程,在以下 real-authentication-subflow 範例中,作為 authenticate-user-with-session-limit 的巢狀子流程,並在同一層級新增 使用者連線限制。在 real-authentication-subflow 內部,您可以按照與預設瀏覽器流程類似的方式新增實際驗證器。以下範例流程允許使用者使用身分提供者或使用密碼和 OTP 進行驗證

Authentication User Session Limits Browser Flow

關於 中介者登入後流程,只要您在與身分提供者驗證後沒有觸發其他驗證器,您可以在驗證流程中將 使用者連線限制 新增為唯一的驗證器。但是,請確保此流程在您的身分提供者中設定為 中介者後流程。需要此要求,以便與身分提供者的驗證也參與連線限制。

目前,管理員負責維護不同設定之間的一致性。因此,請確保您的所有流程都使用相同的 使用者連線限制 設定。
使用者連線限制功能不適用於 CIBA。

指令碼驗證器

透過管理主控台和 REST 端點上傳指令碼的功能已遭棄用。

如需更多詳細資訊,請參閱 JavaScript 提供者

Kerberos

Keycloak 支援透過簡單且受保護的 GSSAPI 交涉機制 (SPNEGO) 通訊協定使用 Kerberos 票證登入。在使用者驗證連線後,SPNEGO 會透過網頁瀏覽器透明地驗證。對於非網頁案例,或在登入期間無法使用票證時,Keycloak 支援使用 Kerberos 使用者名稱和密碼登入。

網頁驗證的典型使用案例如下:

  1. 使用者登入桌面。

  2. 使用者使用瀏覽器存取由 Keycloak 保護的 Web 應用程式。

  3. 應用程式重新導向至 Keycloak 登入。

  4. Keycloak 會以狀態 401 和 HTTP 標頭 WWW-Authenticate: Negotiate 呈現 HTML 登入畫面

  5. 如果瀏覽器有來自桌面登入的 Kerberos 票證,則瀏覽器會在標頭 Authorization: Negotiate 'spnego-token' 中將桌面登入資訊傳輸至 Keycloak。否則,會顯示標準登入畫面,且使用者輸入登入憑證。

  6. Keycloak 會驗證來自瀏覽器的權杖並驗證使用者。

  7. 如果使用支援 Kerberos 驗證的 LDAPFederationProvider,則 Keycloak 會從 LDAP 佈建使用者資料。如果使用 KerberosFederationProvider,則 Keycloak 會讓使用者更新設定檔並預先填入登入資料。

  8. Keycloak 會返回應用程式。Keycloak 和應用程式會透過 OpenID Connect 或 SAML 訊息進行通訊。Keycloak 充當 Kerberos/SPNEGO 登入的中介。因此,透過 Kerberos 進行驗證的 Keycloak 會隱藏在應用程式中。

交涉 www-authenticate 配置允許 NTLM 作為 Kerberos 的後援,並且在某些 Windows 網頁瀏覽器中,預設支援 NTLM。如果來自瀏覽器許可清單之外的伺服器傳來 www-authenticate 質詢,使用者可能會遇到 NTLM 對話方塊提示。使用者需要按一下對話方塊上的「取消」按鈕才能繼續,因為 Keycloak 不支援此機制。如果內部網路網頁瀏覽器未嚴格設定,或 Keycloak 為內部網路和網際網路中的使用者提供服務,則可能會發生這種情況。自訂驗證器可用於將「交涉」質詢限制為主機的許可清單。

執行以下步驟來設定 Kerberos 驗證

  1. Kerberos 伺服器 (KDC) 的設定和組態。

  2. Keycloak 伺服器的設定和組態。

  3. 用戶端電腦的設定和組態。

Kerberos 伺服器的設定

設定 Kerberos 伺服器的步驟取決於作業系統 (OS) 和 Kerberos 廠商。請參閱 Windows Active Directory、MIT Kerberos 和您的作業系統文件,以取得有關設定和組態 Kerberos 伺服器的說明。

在設定期間,請執行以下步驟

  1. 將一些使用者主體新增至您的 Kerberos 資料庫。您也可以將 Kerberos 與 LDAP 整合,以便從 LDAP 伺服器佈建使用者帳戶。

  2. 新增「HTTP」服務的服務主體。例如,如果 Keycloak 伺服器在 www.mydomain.org 上執行,請新增服務主體 HTTP/www.mydomain.org@<kerberos realm>

    在 MIT Kerberos 上,您會執行「kadmin」工作階段。在具有 MIT Kerberos 的電腦上,您可以使用以下命令

sudo kadmin.local

然後,新增 HTTP 主體並使用以下命令將其金鑰匯出到金鑰表檔案

addprinc -randkey HTTP/www.mydomain.org@MYDOMAIN.ORG
ktadd -k /tmp/http.keytab HTTP/www.mydomain.org@MYDOMAIN.ORG

確保執行 Keycloak 的主機可以存取金鑰表檔案 /tmp/http.keytab

Keycloak 伺服器的設定和組態

在您的電腦上安裝 Kerberos 用戶端。

程序
  1. 安裝 Kerberos 用戶端。如果您的電腦執行 Fedora、Ubuntu 或 RHEL,請安裝 freeipa-client 套件,其中包含 Kerberos 用戶端和其他公用程式。

  2. 組態 Kerberos 用戶端(在 Linux 上,組態設定位於 /etc/krb5.conf 檔案中)。

    將您的 Kerberos 領域新增至組態,並組態您的伺服器執行的 HTTP 網域。

    例如,對於 MYDOMAIN.ORG 領域,您可以將 domain_realm 區段組態如下:

    [domain_realm]
      .mydomain.org = MYDOMAIN.ORG
      mydomain.org = MYDOMAIN.ORG
  3. 匯出具有 HTTP 主體的金鑰表檔案,並確保執行 Keycloak 伺服器的程序可以存取該檔案。對於生產環境,請確保只有此程序可以讀取該檔案。

    對於上述 MIT Kerberos 範例,我們將金鑰表匯出到 /tmp/http.keytab 檔案。如果您的金鑰發佈中心 (KDC) 和 Keycloak 在同一主機上執行,則該檔案已可用。

啟用 SPNEGO 處理

預設情況下,Keycloak 會停用 SPNEGO 通訊協定支援。若要啟用它,請前往瀏覽器流程並啟用Kerberos

瀏覽器流程

Browser Flow

Kerberos 要求從已停用設定為替代(Kerberos 為選用)或必要(瀏覽器必須啟用 Kerberos)。如果您未組態瀏覽器以使用 SPNEGO 或 Kerberos,則 Keycloak 會回復為一般登入畫面。

組態 Kerberos 使用者儲存聯邦提供者

您現在必須使用使用者儲存聯邦來組態 Keycloak 如何解譯 Kerberos 票證。存在兩個具有 Kerberos 驗證支援的不同聯邦提供者。

若要使用 LDAP 伺服器支援的 Kerberos 進行驗證,請組態LDAP 聯邦提供者

程序
  1. 前往您的 LDAP 提供者的組態頁面。

    Ldap Kerberos 整合

    LDAP Kerberos Integration

  2. 允許 Kerberos 驗證切換為開啟

允許 Kerberos 驗證會使 Keycloak 使用 Kerberos 主體存取使用者資訊,以便資訊可以匯入 Keycloak 環境。

如果 LDAP 伺服器沒有備份您的 Kerberos 解決方案,請使用Kerberos使用者儲存聯邦提供者。

程序
  1. 在選單中點擊 使用者聯合

  2. 新增提供者選取方塊中選取Kerberos

    Kerberos 使用者儲存提供者

    Kerberos User Storage Provider

Kerberos 提供者會解析 Kerberos 票證以取得簡單的主體資訊,並將資訊匯入到本地 Keycloak 資料庫。不會佈建使用者設定檔資訊,例如名字、姓氏和電子郵件。

用戶端機器的設定與組態

用戶端機器必須安裝 Kerberos 用戶端,並按照上述說明設定 krb5.conf。用戶端機器也必須在其瀏覽器中啟用 SPNEGO 登入支援。如果您使用 Firefox 瀏覽器,請參閱為 Kerberos 設定 Firefox

.mydomain.org URI 必須在 network.negotiate-auth.trusted-uris 組態選項中。

在 Windows 網域中,用戶端不需要調整其組態。Internet Explorer 和 Edge 已經可以參與 SPNEGO 驗證。

範例設定

Keycloak 和 FreeIPA Docker 映像

當您安裝 docker 時,請執行已安裝 FreeIPA 伺服器的 docker 映像。FreeIPA 提供了一個整合的安全性解決方案,包含 MIT Kerberos 和 389 LDAP 伺服器。該映像還包含一個 Keycloak 伺服器,該伺服器配置了 LDAP 聯盟提供者,並針對 FreeIPA 伺服器啟用了 SPNEGO/Kerberos 驗證。詳細資訊請參閱此處

ApacheDS 測試 Kerberos 伺服器

對於快速測試和單元測試,請使用簡單的 ApacheDS Kerberos 伺服器。您必須從原始碼建置 Keycloak,然後使用來自我們測試套件的 maven-exec-plugin 執行 Kerberos 伺服器。詳細資訊請參閱此處

憑證委派

Kerberos 支援憑證委派。應用程式可能需要存取 Kerberos 票證,以便它們可以重複使用該票證與受 Kerberos 保護的其他服務互動。由於 Keycloak 伺服器處理了 SPNEGO 協定,您必須將 GSS 憑證傳播到 OpenID Connect 權杖宣告或 SAML 斷言屬性中的應用程式。Keycloak 從 Keycloak 伺服器將此傳輸到您的應用程式。若要將此宣告插入權杖或斷言中,每個應用程式都必須啟用內建的協定對應器 gss delegation credential。此對應器在應用程式用戶端頁面的對應器索引標籤中提供。如需更多詳細資訊,請參閱協定對應器章節。

應用程式必須在將其用於對其他服務進行 GSS 呼叫之前,反序列化從 Keycloak 收到的宣告。當您從存取權杖將憑證反序列化為 GSSCredential 物件時,請使用傳遞給 GSSManager.createContext 方法的這個憑證建立 GSSContext。例如

// Obtain accessToken in your application.
KeycloakPrincipal keycloakPrincipal = (KeycloakPrincipal) servletReq.getUserPrincipal();
AccessToken accessToken = keycloakPrincipal.getKeycloakSecurityContext().getToken();

// Retrieve Kerberos credential from accessToken and deserialize it
String serializedGssCredential = (String) accessToken.getOtherClaims().
    get(org.keycloak.common.constants.KerberosConstants.GSS_DELEGATION_CREDENTIAL);

GSSCredential deserializedGssCredential = org.keycloak.common.util.KerberosSerializationUtils.
    deserializeCredential(serializedGssCredential);

// Create GSSContext to call other Kerberos-secured services
GSSContext context = gssManager.createContext(serviceName, krb5Oid,
    deserializedGssCredential, GSSContext.DEFAULT_LIFETIME);

krb5.conf 檔案中設定 forwardable Kerberos 票證,並為您的瀏覽器新增委派憑證的支援。

憑證委派具有安全性意涵,因此僅在必要時並僅使用 HTTPS 時使用。如需更多詳細資訊和範例,請參閱這篇文章

跨領域信任

在 Kerberos 協定中,realm 是一組 Kerberos 主體。這些主體的定義存在於 Kerberos 資料庫中,該資料庫通常是 LDAP 伺服器。

Kerberos 協定允許跨領域信任。例如,如果存在 2 個 Kerberos 領域 A 和 B,則跨領域信任將允許領域 A 的使用者存取領域 B 的資源。領域 B 信任領域 A。

Kerberos 跨領域信任

kerberos trust basic

Keycloak 伺服器支援跨領域信任。若要實作此功能,請執行下列動作

  • 為跨領域信任設定 Kerberos 伺服器。實作此步驟取決於 Kerberos 伺服器實作。此步驟對於將 Kerberos 主體 krbtgt/B@A 新增到領域 A 和 B 的 Kerberos 資料庫是必要的。此主體在兩個 Kerberos 領域上必須具有相同的金鑰。主體在兩個領域中必須具有相同的密碼、金鑰版本號碼和密碼編譯。請參閱 Kerberos 伺服器文件以取得更多詳細資訊。

依預設,跨領域信任是單向的。您必須將主體 krbtgt/A@B 新增到兩個 Kerberos 資料庫,以在領域 A 和領域 B 之間進行雙向信任。但是,依預設信任是可傳遞的。如果領域 B 信任領域 A,而領域 C 信任領域 B,則領域 C 會信任領域 A,而沒有主體 krbtgt/C@A 可用。在 Kerberos 用戶端,可能需要額外的組態(例如 capaths),以便用戶端可以找到信任路徑。請參閱 Kerberos 文件以取得更多詳細資訊。

  • 設定 Keycloak 伺服器

    • 當使用具有 Kerberos 支援的 LDAP 儲存提供者時,請為領域 B 設定伺服器主體,如此範例所示:HTTP/mydomain.com@B。如果領域 A 的使用者要成功驗證到 Keycloak,則 LDAP 伺服器必須找到領域 A 的使用者,因為 Keycloak 必須執行 SPNEGO 流程,然後找到使用者。

尋找使用者是根據 LDAP 儲存提供者選項 Kerberos 主體屬性。當使用類似 userPrincipalName 的值設定此選項時,則在使用者 john@A 的 SPNEGO 驗證之後,Keycloak 將嘗試尋找屬性 userPrincipalName 等於 john@A 的 LDAP 使用者。如果 Kerberos 主體屬性 為空,則 Keycloak 將根據其 Kerberos 主體的前置詞(省略領域)來尋找 LDAP 使用者。例如,Kerberos 主體使用者 john@A 必須在 LDAP 中以使用者名稱 john 提供,因此通常在 LDAP DN 下,例如 uid=john,ou=People,dc=example,dc=com。如果您希望領域 A 和 B 的使用者進行驗證,請確保 LDAP 可以找到來自領域 A 和 B 的使用者。

  • 當使用 Kerberos 使用者儲存提供者(通常是沒有 LDAP 整合的 Kerberos)時,請將伺服器主體設定為 HTTP/mydomain.com@B,並且來自 Kerberos 領域 A 和 B 的使用者必須能夠進行驗證。

允許多個 Kerberos 領域的使用者進行驗證,因為每個使用者都會具有 KERBEROS_PRINCIPAL 屬性,該屬性會參考用於驗證的 Kerberos 主體,並且該屬性會用於進一步尋找此使用者。為了避免當 Kerberos 領域 AB 中都有使用者 john 時發生衝突,Keycloak 使用者的使用者名稱可能包含小寫的 Kerberos 領域。例如,使用者名稱將是 john@a。萬一領域與設定的 Kerberos 領域 匹配時,產生的使用者名稱中可能會省略領域後綴。例如,只要在 Kerberos 提供者上設定的 Kerberos 領域A,則 Kerberos 主體 john@A 的使用者名稱將為 john

疑難排解

如果您有問題,請啟用其他記錄以偵錯問題

  • 在管理主控台中為 Kerberos 或 LDAP 聯盟提供者啟用 Debug 旗標

  • 為類別 org.keycloak 啟用 TRACE 記錄,以在伺服器記錄中接收更多資訊

  • 新增系統屬性 -Dsun.security.krb5.debug=true-Dsun.security.spnego.debug=true

X.509 用戶端憑證使用者驗證

如果您已將伺服器設定為使用相互 SSL 驗證,則 Keycloak 支援使用 X.509 用戶端憑證登入。

一般工作流程

  • 用戶端透過 SSL/TLS 通道傳送驗證請求。

  • 在 SSL/TLS 交握期間,伺服器和用戶端會交換其 x.509/v3 憑證。

  • 容器 (WildFly) 會驗證憑證 PKIX 路徑和憑證到期日。

  • x.509 用戶端憑證驗證器會使用下列方法驗證用戶端憑證

    • 使用 CRL 或 CRL 分發點檢查憑證撤銷狀態。

    • 使用 OCSP(線上憑證狀態協定)檢查憑證撤銷狀態。

    • 驗證憑證中的金鑰是否與預期的金鑰匹配。

    • 驗證憑證中的擴充金鑰是否與預期的擴充金鑰匹配。

  • 如果任何這些檢查失敗,則 x.509 驗證會失敗。否則,驗證器會擷取憑證身分,並將其對應到現有的使用者。

當憑證對應到現有的使用者時,行為會根據驗證流程而有所不同

  • 在瀏覽器流程中,伺服器會提示使用者確認其身分或使用使用者名稱和密碼登入。

  • 在直接授與流程中,伺服器會登入使用者。

請注意,驗證憑證 PKIX 路徑是網頁容器的責任。Keycloak 端的 X.509 驗證器僅提供檢查憑證到期日、憑證撤銷狀態和金鑰使用情況的額外支援。如果您使用部署在反向 Proxy 後面的 Keycloak,請確保您的反向 Proxy 設定為驗證 PKIX 路徑。如果您不使用反向 Proxy,並且使用者直接存取 WildFly,只要按照以下說明進行設定,您應該沒有問題,因為 WildFly 會確保驗證 PKIX 路徑。

功能

支援的憑證身分來源

  • 使用規則運算式匹配 SubjectDN

  • X500 主體電子郵件屬性

  • 來自主體替代名稱擴充 (RFC822Name 一般名稱) 的 X500 主體電子郵件

  • 來自主體替代名稱擴充的 X500 主體其他名稱。此其他名稱通常是使用者主體名稱 (UPN)。

  • X500 主體一般名稱屬性

  • 使用規則運算式匹配 IssuerDN

  • 憑證序號

  • 憑證序號和 IssuerDN

  • SHA-256 憑證指紋

  • PEM 格式的完整憑證

規則運算式

Keycloak 會使用規則運算式作為篩選器,從主體 DN 或簽發者 DN 擷取憑證身分。例如,此規則運算式會匹配電子郵件屬性

emailAddress=(.*?)(?:,|$)

如果 身分來源 設定為 使用規則運算式匹配 SubjectDN使用規則運算式匹配 IssuerDN,則會套用規則運算式篩選。

將憑證身分對應到現有的使用者

憑證身分對應可以將提取的使用者身分對應到現有使用者的使用者名稱、電子郵件或自訂屬性,其值與憑證身分相符。例如,將 身分來源 設定為主旨的電子郵件或將 使用者對應方法 設定為使用者名稱或電子郵件,會讓 X.509 用戶端憑證驗證器在使用使用者名稱或電子郵件搜尋現有使用者時,使用憑證主旨 DN 中的電子郵件屬性作為搜尋條件。

  • 如果您在 realm 設定中停用使用電子郵件登入,則相同的規則適用於憑證驗證。使用者將無法使用電子郵件屬性登入。

  • 使用 憑證序號和簽發者 DN 作為身分來源需要序號和簽發者 DN 的兩個自訂屬性。

  • SHA-256 憑證指紋 是 SHA-256 憑證指紋的小寫十六進位表示法。

  • 使用 PEM 格式的完整憑證 作為身分來源僅限於對應到外部聯盟來源(例如 LDAP)的自訂屬性。Keycloak 無法將憑證儲存在其資料庫中,因為長度限制,因此在 LDAP 的情況下,您必須啟用 始終從 LDAP 讀取值

延伸憑證驗證
  • 使用 CRL 的撤銷狀態檢查。

  • 使用 CRL/分發點的撤銷狀態檢查。

  • 使用 OCSP/回應程式 URI 的撤銷狀態檢查。

  • 憑證金鑰用法驗證。

  • 憑證延伸金鑰用法驗證。

將 X.509 用戶端憑證驗證新增至瀏覽器流程

  1. 在選單中點擊驗證

  2. 點擊瀏覽器流程。

  3. 動作清單中,選取複製

  4. 輸入副本的名稱。

  5. 點擊複製

  6. 點擊 新增步驟

  7. 點擊「X509/驗證使用者名稱表單」。

  8. 點擊 新增

    X509 執行

    X509 Execution

  9. 將「X509/驗證使用者名稱表單」拖曳到「瀏覽器表單」執行之上。

  10. 將需求設定為「替代」。

    X509 瀏覽器流程

    X509 Browser Flow

  11. 點擊動作選單。

  12. 點擊繫結流程

  13. 從下拉式清單中點擊瀏覽器流程

  14. 點擊 儲存

    X509 瀏覽器流程繫結

    X509 Browser Flow Bindings

設定 X.509 用戶端憑證驗證

X509 設定

X509 Configuration

使用者身分來源

定義從用戶端憑證提取使用者身分的方法。

已啟用標準 DN 表示法

定義是否使用標準格式來判斷識別名稱。官方 Java API 文件描述了格式。此選項僅影響兩個使用者身分來源使用正規表示式比對 SubjectDN使用正規表示式比對 IssuerDN。當您設定新的 Keycloak 執行個體時,請啟用此選項。停用此選項以保留與現有 Keycloak 執行個體的向後相容性。

啟用序號十六進位表示法

序號 表示為十六進位。將符號位設定為 1 的序號必須在左側填補 00 位元組。例如,根據 RFC5280,十進位值為 161 或十六進位表示法為 a1 的序號會編碼為 00a1。如需更多詳細資訊,請參閱 RFC5280,附錄 B

正規表示式

用作篩選器以提取憑證身分的正規表示式。表示式必須包含單一群組。

使用者對應方法

定義將憑證身分與現有使用者比對的方法。使用者名稱或電子郵件會依使用者名稱或電子郵件搜尋現有使用者。自訂屬性對應器會使用符合憑證身分的自訂屬性搜尋現有使用者。自訂屬性的名稱是可設定的。

使用者屬性的名稱

其值與憑證身分比對的自訂屬性。當屬性對應與多個值相關時,請使用多個自訂屬性。例如,「憑證序號和簽發者 DN」。

已啟用 CRL 檢查

使用憑證撤銷清單檢查憑證的撤銷狀態。清單的位置在CRL 檔案路徑屬性中定義。

啟用 CRL 分發點以檢查憑證撤銷狀態

使用 CDP 檢查憑證撤銷狀態。大多數 PKI 授權單位會在憑證中包含 CDP。

CRL 檔案路徑

包含 CRL 清單的檔案路徑。如果啟用已啟用 CRL 檢查選項,則值必須是有效檔案的路徑。

已啟用 OCSP 檢查

使用線上憑證狀態協定檢查憑證撤銷狀態。

OCSP 失敗開啟行為

根據預設,OCSP 檢查必須傳回肯定的回應,才能繼續進行成功的驗證。但是,有時此檢查可能沒有結果:例如,OCSP 伺服器可能無法連線、過載,或者用戶端憑證可能不包含 OCSP 回應程式 URI。當此設定開啟時,只有在 OCSP 回應程式收到明確的負面回應且憑證確定被撤銷時,才會拒絕驗證。如果沒有可用的有效 OCSP 回應,則會接受驗證嘗試。

OCSP 回應程式 URI

覆寫憑證中 OCSP 回應程式 URI 的值。

驗證金鑰用法

驗證是否已設定憑證的 KeyUsage 擴充位元。例如,「digitalSignature,KeyEncipherment」會驗證是否已設定 KeyUsage 擴充中的位元 0 和 2。將此參數保留空白以停用金鑰用法驗證。如需更多資訊,請參閱 RFC5280,第 4.2.1.3 節。當金鑰用法不符時,Keycloak 會引發錯誤。

驗證延伸金鑰用法

驗證在延伸金鑰用法擴充中定義的一或多個目的。如需更多資訊,請參閱 RFC5280,第 4.2.1.12 節。將此參數保留空白以停用延伸金鑰用法驗證。當核發 CA 標示為關鍵,並且發生金鑰用法擴充不符時,Keycloak 會引發錯誤。

驗證憑證原則

驗證憑證原則擴充中定義的一或多個原則 OID。請參閱 RFC5280,第 4.2.1.4 節。將參數保留空白以停用憑證原則驗證。多個原則應使用逗號分隔。

憑證原則驗證模式

當在 驗證憑證原則 設定中指定多個原則時,它會決定比對是否應檢查所有要求的原則是否存在,或者一個比對是否足以進行成功的驗證。預設值為 全部,表示用戶端憑證中應存在所有要求的原則。

略過身分確認

如果啟用,X.509 用戶端憑證驗證不會提示使用者確認憑證身分。Keycloak 會在成功驗證後讓使用者登入。

重新驗證用戶端憑證

如果設定,則會在應用程式層級使用設定的信任儲存區中存在的憑證,始終驗證用戶端憑證信任鏈。如果基礎 Web 伺服器不強制執行用戶端憑證鏈驗證,這會很有用,例如因為它位於無驗證的負載平衡器或反向 Proxy 後面,或者當允許的 CA 數量對於相互 SSL 交涉來說太大時(大多數瀏覽器將最大 SSL 交涉封包大小限制為 32767 個位元組,這相當於大約 200 個宣告的 CA)。根據預設,此選項為關閉。

將 X.509 用戶端憑證驗證新增至直接授與流程

  1. 在選單中點擊驗證

  2. 從「動作清單」中選取複製,以建立內建「直接授與」流程的副本。

  3. 輸入副本的名稱。

  4. 點擊複製

  5. 點擊建立的流程。

  6. 點擊「使用者名稱驗證」的垃圾桶圖示 🗑️,然後點擊刪除

  7. 點擊「密碼」的垃圾桶圖示 🗑️,然後點擊刪除

  8. 點擊 新增步驟

  9. 點擊「X509/驗證使用者名稱」。

  10. 點擊 新增

    X509 直接授與執行

    X509 Direct Grant Execution

  11. 按照 X509 瀏覽器流程章節中描述的步驟設定 x509 驗證設定。

  12. 點擊繫結索引標籤。

  13. 點擊直接授與流程下拉式清單。

  14. 點擊新建立的「x509 直接授與」流程。

  15. 點擊 儲存

    X509 直接授與流程繫結

    X509 Direct Grant Flow Bindings

使用 CURL 的範例

下列範例顯示如何使用直接授與流程取得領域 test 中使用者的存取權杖。此範例在 保護應用程式章節中使用OAuth2 資源擁有者密碼憑證授與,以及機密用戶端 resource-owner

curl \
  -d "client_id=resource-owner" \
  -d "client_secret=40cc097b-2a57-4c17-b36a-8fdf3fc2d578" \
  -d "grant_type=password" \
  --cacert /tmp/truststore.pem \
  --cert /tmp/keystore.pem:kssecret \
  "https://127.0.0.1:8543/realms/test/protocol/openid-connect/token"

檔案 /tmp/truststore.pem 指向包含 Keycloak 伺服器憑證的信任儲存區的檔案。檔案 /tmp/keystore.pem 包含與 Keycloak 使用者對應的私密金鑰和憑證,此要求會成功驗證該使用者。它取決於驗證器上的設定,以了解如何將憑證的內容精確對應到 Keycloak 使用者,如 設定章節中所述。kssecret 可能是此金鑰儲存區檔案的密碼。

根據您的環境,可能需要使用更多 CURL 命令選項,例如

  • 如果您使用自我簽署憑證,則為選項 --insecure

  • 選項 --capath,以包含包含憑證授權單位路徑的整個目錄

  • 選項 --cert-type--key-type,如果您想要使用與 PEM 不同的檔案

如果需要,請參閱 curl 工具的文件,了解詳細資訊。如果您使用 curl 以外的其他工具,請參閱工具的文件。但是,設定會很類似。需要包含金鑰儲存區和信任儲存區,以及客戶端憑證,以防您使用機密客戶端。

如果可能,最好將 服務帳戶與 MTLS 用戶端驗證(用戶端驗證器 X509 憑證)一起使用,而不是使用具有 X.509 驗證的直接授與,因為直接授與可能需要與客戶端應用程式共用使用者憑證。當使用服務帳戶時,會代表用戶端本身取得權杖,這通常是更好且更安全的做法。

W3C Web 驗證 (WebAuthn)

Keycloak 提供 W3C Web 驗證 (WebAuthn) 的支援。Keycloak 作為 WebAuthn 的 信賴方 (RP)

WebAuthn 的作業成功與否取決於使用者的 WebAuthn 支援驗證器、瀏覽器和平台。請確定您的驗證器、瀏覽器和平台支援 WebAuthn 規格。

設定

WebAuthn 支援 2FA 的設定程序如下

啟用 WebAuthn 驗證器註冊
  1. 在選單中點擊驗證

  2. 點擊 必要動作 索引標籤。

  3. Webauthn 註冊開關切換為開啟

如果您想要所有新使用者都需要註冊其 WebAuthn 憑證,請將預設動作開關切換為開啟

將 WebAuthn 驗證新增至瀏覽器流程

  1. 在選單中點擊驗證

  2. 點擊瀏覽器流程。

  3. 從「動作清單」中選取複製,以建立內建瀏覽器流程的副本。

  4. 輸入「WebAuthn 瀏覽器」作為副本的名稱。

  5. 點擊複製

  6. 點擊名稱以進入詳細資料

  7. 點擊「WebAuthn 瀏覽器 - 條件式 OTP」的垃圾桶圖示 🗑️,然後點擊刪除

如果您需要所有使用者的 WebAuthn

  1. 點擊WebAuthn 瀏覽器表單+ 選單。

  2. 點擊 新增步驟

  3. 點擊 WebAuthn 驗證器

  4. 點擊 新增

  5. WebAuthn 驗證器驗證類型選取必要,以將其需求設定為必要。

    Webauthn browser flow required

  6. 點擊螢幕頂端的 動作 選單。

  7. 從下拉式清單中選取繫結流程

  8. 從下拉式選單中選取 Browser (瀏覽器)。

  9. 點擊 儲存

如果使用者沒有 WebAuthn 憑證,則使用者必須註冊 WebAuthn 憑證。

使用者必須已註冊 WebAuthn 憑證才能使用 WebAuthn 登入。因此,您不需要新增 WebAuthn Authenticator (WebAuthn 驗證器) 執行,而是可以

程序
  1. 按一下 WebAuthn Browser Forms (WebAuthn 瀏覽器表單) 列的 + (加號) 選單。

  2. 點擊 新增子流程

  3. name (名稱) 欄位中輸入「Conditional 2FA」(條件式雙因素驗證)。

  4. 針對 Conditional 2FA (條件式雙因素驗證) 選取 Conditional (條件式) 以將其需求設定為條件式。

  5. Conditional 2FA (條件式雙因素驗證) 列中,按一下加號 + 並選取 Add condition (新增條件)。

  6. 點擊 新增條件

  7. 選取 Condition - User Configured (條件 - 使用者設定)。

  8. 點擊 新增

  9. 針對 Condition - User Configured (條件 - 使用者設定) 選取 Required (必要) 以將其需求設定為必要。

  10. WebAuthn Authenticator (WebAuthn 驗證器) 拖放到 Conditional 2FA (條件式雙因素驗證) 流程中。

  11. 針對 WebAuthn Authenticator (WebAuthn 驗證器) 選取 Alternative (替代) 以將其需求設定為替代。

    Webauthn browser flow conditional

使用者可以在使用 WebAuthn 和 OTP 之間選擇第二因素。

程序
  1. Conditional 2FA (條件式雙因素驗證) 列中,按一下加號 + 並選取 Add step (新增步驟)。

  2. 從清單中選取 OTP 表單

  3. 點擊 新增

  4. 針對 OTP Form (OTP 表單) 選取 Alternative (替代) 以將其需求設定為替代。

    WebAuthn browser flow conditional with OTP

使用 WebAuthn 驗證器驗證

註冊 WebAuthn 驗證器後,使用者會執行下列操作

  • 開啟登入表單。使用者必須使用使用者名稱和密碼進行驗證。

  • 使用者的瀏覽器會要求使用者使用其 WebAuthn 驗證器進行驗證。

以管理員身分管理 WebAuthn

管理憑證

Keycloak 管理 WebAuthn 憑證的方式與管理來自 使用者憑證管理 的其他憑證類似

  • Keycloak 會指派使用者一個必要動作,以從 Reset Actions (重設動作) 清單中建立 WebAuthn 憑證,並選取 Webauthn Register (Webauthn 註冊)。

  • 管理員可以按一下 Delete (刪除) 來刪除 WebAuthn 憑證。

  • 管理員可以選取 Show data…​ (顯示資料…) 來檢視憑證的資料,例如 AAGUID。

  • 管理員可以在 User Label (使用者標籤) 欄位中設定值並儲存資料,藉此為憑證設定標籤。

管理原則

管理員可以針對每個領域將 WebAuthn 相關的操作設定為 WebAuthn Policy (WebAuthn 原則)。

程序
  1. 在選單中點擊驗證

  2. 按一下「原則」索引標籤。

  3. 按一下 WebAuthn Policy (WebAuthn 原則) 索引標籤。

  4. 設定原則內的項目 (請參閱下方的說明)。

  5. 點擊 儲存

可設定的項目及其說明如下

設定 說明

Relying Party Entity Name (信賴方實體名稱)

作為 WebAuthn 信賴方的可讀伺服器名稱。此項目為必要項目,且適用於 WebAuthn 驗證器的註冊。預設設定為「keycloak」。如需更多詳細資訊,請參閱 WebAuthn 規格

Signature Algorithms (簽章演算法)

告知 WebAuthn 驗證器應針對 公開金鑰憑證 使用哪些簽章演算法的演算法。Keycloak 使用公開金鑰憑證來簽署並驗證 驗證判斷。如果沒有任何演算法存在,則會採用預設的 ES256RS256。ES256 和 RS256 是適用於 WebAuthn 驗證器註冊的可選組態項目。如需更多詳細資訊,請參閱 WebAuthn 規格

Relying Party ID (信賴方 ID)

WebAuthn 信賴方的 ID,決定 公開金鑰憑證 的範圍。ID 必須是來源的有效網域。此 ID 是適用於 WebAuthn 驗證器註冊的可選組態項目。如果此項目空白,Keycloak 會採用 Keycloak 基準 URL 的主機部分。如需更多詳細資訊,請參閱 WebAuthn 規格

Attestation Conveyance Preference (證明傳遞偏好)

瀏覽器上的 WebAuthn API 實作 (WebAuthn 用戶端) 是產生證明陳述的偏好方法。此偏好是適用於 WebAuthn 驗證器註冊的可選組態項目。如果沒有選項存在,其行為與選取「none」(無) 相同。如需更多詳細資訊,請參閱 WebAuthn 規格

Authenticator Attachment (驗證器附件)

WebAuthn 用戶端可接受的 WebAuthn 驗證器附件模式。此模式是適用於 WebAuthn 驗證器註冊的可選組態項目。如需更多詳細資訊,請參閱 WebAuthn 規格

Require Discoverable Credential (需要可探索的憑證)

要求 WebAuthn 驗證器將公開金鑰憑證產生為 用戶端可探索憑證 的選項。此選項適用於 WebAuthn 驗證器的註冊。如果留白,其行為與選取「否」相同。如需更多詳細資訊,請參閱 WebAuthn 規格

User Verification Requirement (使用者驗證需求)

要求 WebAuthn 驗證器確認使用者驗證的選項。這是適用於 WebAuthn 驗證器註冊和 WebAuthn 驗證器驗證使用者的可選組態項目。如果沒有選項存在,其行為與選取「preferred」(偏好) 相同。如需更多詳細資訊,請參閱 WebAuthn 規格,以註冊 WebAuthn 驗證器WebAuthn 規格,以使用 WebAuthn 驗證器驗證使用者

Timeout (逾時)

註冊 WebAuthn 驗證器和使用 WebAuthn 驗證器驗證使用者的逾時值 (以秒為單位)。如果設定為零,其行為取決於 WebAuthn 驗證器的實作。預設值為 0。如需更多詳細資訊,請參閱 WebAuthn 規格,以註冊 WebAuthn 驗證器WebAuthn 規格,以使用 WebAuthn 驗證器驗證使用者

Avoid Same Authenticator Registration (避免相同的驗證器註冊)

如果啟用,Keycloak 無法重新註冊已註冊的 WebAuthn 驗證器。

Acceptable AAGUIDs (可接受的 AAGUID)

WebAuthn 驗證器必須註冊的 AAGUID 白名單。

證明陳述驗證

註冊 WebAuthn 驗證器時,Keycloak 會驗證由 WebAuthn 驗證器產生的證明陳述之可信度。Keycloak 要求將信任錨點的憑證匯入 信任儲存區

若要省略此驗證,請停用此信任儲存區或將 WebAuthn 原則的組態項目「Attestation Conveyance Preference」(證明傳遞偏好) 設定為「none」(無)。

以使用者身分管理 WebAuthn 憑證

註冊 WebAuthn 驗證器

註冊 WebAuthn 驗證器的適當方法取決於使用者是否已在 Keycloak 上註冊帳戶。

新使用者

如果 WebAuthn Register (WebAuthn 註冊) 必要動作在領域中為 Default Action (預設動作),則新使用者必須在第一次登入後設定通行金鑰。

程序
  1. 開啟登入表單。

  2. 點擊 註冊

  3. 填寫表單上的項目。

  4. 點擊 註冊

成功註冊後,瀏覽器會要求使用者輸入其 WebAuthn 驗證器標籤的文字。

現有使用者

如果在第一個範例中所示,WebAuthn Authenticator (WebAuthn 驗證器) 設定為必要,則當現有使用者嘗試登入時,系統會自動要求他們註冊 WebAuthn 驗證器

程序
  1. 開啟登入表單。

  2. 在表單上輸入項目。

  3. 點擊 儲存

  4. 按一下 Login (登入)。

成功註冊後,使用者的瀏覽器會要求使用者輸入其 WebAuthn 驗證器標籤的文字。

無密碼 WebAuthn 與雙因素驗證

Keycloak 使用 WebAuthn 進行雙因素驗證,但您可以將 WebAuthn 用作第一因素驗證。在此情況下,具有 passwordless (無密碼) WebAuthn 憑證的使用者可以無需密碼即可驗證至 Keycloak。Keycloak 可以在領域和單一驗證流程中,將 WebAuthn 用作無密碼驗證和雙因素驗證機制。

管理員通常會要求使用者註冊用於 WebAuthn 無密碼驗證的通行金鑰符合不同的需求。例如,通行金鑰可能需要使用者使用 PIN 來驗證通行金鑰,或者通行金鑰使用較強的憑證授權單位來證明。

因此,Keycloak 允許管理員設定個別的 WebAuthn Passwordless Policy (WebAuthn 無密碼原則)。有一個必要動作類型為 Webauthn Register Passwordless (Webauthn 註冊無密碼) 和個別驗證器類型為 WebAuthn Passwordless Authenticator (WebAuthn 無密碼驗證器)。

設定

如下設定 WebAuthn 無密碼支援

  1. (如果尚未存在) 註冊用於 WebAuthn 無密碼支援的新必要動作。使用 啟用 WebAuthn 驗證器註冊 中所述的步驟。註冊 Webauthn Register Passwordless (Webauthn 註冊無密碼) 動作。

  2. 設定原則。您可以使用 管理原則 中所述的步驟和組態選項。在管理主控台中,在 WebAuthn Passwordless Policy (WebAuthn 無密碼原則) 索引標籤中執行組態。通常通行金鑰的需求會比雙因素原則的需求更強。例如,當您設定無密碼原則時,您可以將 User Verification Requirement (使用者驗證需求) 設定為 Required (必要)。

  3. 設定驗證流程。使用 在瀏覽器流程中新增 WebAuthn 驗證 中所述的 WebAuthn Browser (WebAuthn 瀏覽器) 流程。如下設定流程

    • WebAuthn Browser Forms (WebAuthn 瀏覽器表單) 子流程將 Username Form (使用者名稱表單) 作為第一個驗證器。刪除預設的 Username Password Form (使用者名稱密碼表單) 驗證器並新增 Username Form (使用者名稱表單) 驗證器。此動作要求使用者提供使用者名稱作為第一個步驟。

    • 會有一個必要的子流程,例如,可以命名為 Passwordless Or Two-factor (無密碼或雙因素)。此子流程表示使用者可以使用無密碼 WebAuthn 憑證或使用雙因素驗證進行驗證。

    • 流程包含 WebAuthn Passwordless Authenticator (WebAuthn 無密碼驗證器) 作為第一個替代方案。

    • 第二個替代方案將是一個子流程,例如,命名為 Password And Two-factor Webauthn (密碼和雙因素 Webauthn)。此子流程包含 Password Form (密碼表單) 和 WebAuthn Authenticator (WebAuthn 驗證器)。

流程的最終組態看起來類似這樣

無密碼流程

PasswordLess flow

您現在可以將 WebAuthn Register Passwordless (WebAuthn 註冊無密碼) 作為必要動作新增至 Keycloak 已知的使用者,以進行測試。在第一次驗證期間,使用者必須使用密碼和雙因素 WebAuthn 憑證。如果使用者使用 WebAuthn 無密碼憑證,則不需要提供密碼和雙因素 WebAuthn 憑證。

無登入 WebAuthn

Keycloak 使用 WebAuthn 進行雙因素驗證,但您可以將 WebAuthn 用作第一因素驗證。在此情況下,具有 passwordless (無密碼) WebAuthn 憑證的使用者可以無需提交登入或密碼即可驗證至 Keycloak。Keycloak 可以在領域中,將 WebAuthn 用作無登入/無密碼驗證和雙因素驗證機制。

管理員通常會要求使用者註冊的 Passkey(通行金鑰)符合不同的 WebAuthn 無密碼登入驗證需求。無密碼驗證需要使用者驗證 Passkey(例如使用 PIN 碼或指紋),並且與無密碼憑證相關聯的加密金鑰必須實際儲存在 Passkey 上。並非所有 Passkey 都符合這類要求。請洽詢您的 Passkey 供應商,以確認您的裝置是否支援「使用者驗證」和「可探索憑證」。請參閱 支援的 Passkey

Keycloak 允許管理員設定 WebAuthn 無密碼原則,以允許無密碼驗證。請注意,無密碼驗證只能透過 WebAuthn 無密碼原則WebAuthn 無密碼憑證進行設定。WebAuthn 無密碼驗證和 WebAuthn 無密碼驗證可以在同一個領域中設定,但會共用相同的原則 WebAuthn 無密碼原則

設定
程序

依照以下步驟設定 WebAuthn 無密碼支援:

  1. (如果尚未存在) 註冊用於 WebAuthn 無密碼支援的新必要動作。使用 啟用 WebAuthn 驗證器註冊 中所述的步驟。註冊 Webauthn Register Passwordless (Webauthn 註冊無密碼) 動作。

  2. 設定 WebAuthn 無密碼原則。在管理主控台中,「驗證」區段的「原則」→「WebAuthn 無密碼原則」索引標籤中進行設定。當您為無密碼情境設定原則時,必須將使用者驗證需求設定為必要,並將需要可探索憑證設定為。請注意,由於沒有專用的無密碼原則,因此無法將使用者驗證 = 否/可探索憑證 = 否的驗證情境與無密碼情境(使用者驗證 = 是/可探索憑證 = 是)混合。Passkey 的儲存容量通常非常有限,這表示您無法在 Passkey 上儲存許多可探索憑證。

  3. 設定驗證流程。建立新的驗證流程,新增「WebAuthn 無密碼」執行,並將該執行的「需求」設定設為必要

流程的最終組態看起來類似這樣

無密碼流程

LoginLess flow

您現在可以將必要的動作 WebAuthn 註冊無密碼 新增至 Keycloak 已知的使用者,以測試此功能。已設定必要動作的使用者必須進行驗證(例如使用使用者名稱/密碼),然後會提示註冊一個 Passkey 以用於無密碼驗證。

廠商特定注意事項
相容性檢查清單

Keycloak 的無密碼驗證要求 Passkey 必須符合以下功能:

  • 符合 FIDO2 標準:不要與 FIDO/U2F 混淆

  • 使用者驗證:Passkey 驗證使用者的能力(防止他人找到您的 Passkey 就能進行無密碼和無密碼登入驗證)

  • 可探索憑證:Passkey 儲存登入和與用戶端應用程式相關聯的加密金鑰的能力

Windows Hello

若要使用基於 Windows Hello 的憑證針對 Keycloak 進行驗證,請將 WebAuthn 無密碼原則簽章演算法設定為包含 RS256 值。請注意,某些瀏覽器不允許在私人視窗內存取平台 Passkey(例如 Windows Hello)。

支援的 Passkey

下列 Passkey 已成功測試,可使用 Keycloak 進行無密碼驗證:

  • Windows Hello (Windows 10 21H1/21H2)

  • Yubico Yubikey 5 NFC

  • Feitian ePass FIDO-NFC

Passkey

Keycloak 提供 Passkey 的預覽支援。Keycloak 作為 Passkey 依賴方 (RP) 運作。

Passkey 註冊和驗證透過 WebAuthn 的功能實現。因此,Keycloak 的使用者可以透過現有的 WebAuthn 註冊和驗證來進行 Passkey 註冊和驗證。

同步 Passkey 和裝置綁定 Passkey 都可以用於相同裝置和跨裝置驗證 (CDA)。但是,Passkey 操作的成功與否取決於使用者的環境。請確認哪些操作可以在環境中成功。

使用條件式 UI 的 Passkey 驗證

使用條件式 UI 的 Passkey 驗證可以使用者的 Passkey 進行驗證,方式與 無密碼 WebAuthn 相同。此驗證會向使用者顯示使用者執行瀏覽器之裝置上儲存的 Passkey 清單。因此,使用者可以從清單中選擇一個 Passkey 來驗證身分。與 無密碼 WebAuthn 相比,此驗證改善了使用者的驗證體驗。

此驗證使用 WebAuthn 條件式 UI。因此,此驗證的成功與否取決於使用者的環境。如果環境不支援 WebAuthn 條件式 UI,則此驗證會回退到 無密碼 WebAuthn

Passkey 驗證為預覽版,並非完全支援。此功能預設為停用。

若要啟用,請使用 --features=preview--features=passkeys 啟動伺服器。

設定
程序

依照以下步驟設定使用條件式 UI 的 Passkey 驗證:

  1. (如果尚未存在) 註冊用於 WebAuthn 無密碼支援的新必要動作。使用 啟用 WebAuthn 驗證器註冊 中所述的步驟。註冊 Webauthn Register Passwordless (Webauthn 註冊無密碼) 動作。

  2. 設定 WebAuthn 無密碼原則。在管理主控台中,「驗證」區段的「原則」→「WebAuthn 無密碼原則」索引標籤中進行設定。當您為無密碼情境設定原則時,請將使用者驗證需求設定為必要,並將需要可探索憑證設定為。請注意,由於沒有專用的無密碼原則,因此無法混合使用者驗證 = 否/可探索憑證 = 否的驗證情境與無密碼情境(使用者驗證 = 是/可探索憑證 = 是)。

    硬體 Passkey 的儲存容量通常非常有限,這表示您無法在 Passkey 上儲存許多可探索憑證。但是,如果您使用 Google 帳戶支援的 Android 手機作為 Passkey 裝置,或使用 Bitwarden 支援的 iPhone,則可能會減輕此限制。
  3. 設定驗證流程。建立新的驗證流程,新增 Passkeys 條件式 UI 驗證器執行,並將該執行的「需求」設定設為 必要

    流程的最終設定如下所示:使用條件式 UI 流程的 Passkey 驗證

  4. 上方 WebAuthn 區段所述,將上述流程繫結為領域中的瀏覽器驗證流程。

上述驗證流程要求使用者必須在其帳戶中已具有 Passkey 憑證才能登入。此要求表示領域中的所有使用者都必須已設定 Passkey。這可以透過啟用使用者註冊來實現,如下所述。

設定 Passkey 條件式 UI 的註冊
  1. 為您的領域啟用註冊

  2. 在領域的驗證流程中,選取流程註冊,並將驗證器密碼驗證切換為已停用。這表示在此範例設定中,新註冊的使用者將不需要建立密碼。使用者必須一律使用 Passkey 而非密碼。

  3. 返回驗證索引標籤的必要動作子索引標籤,找到 Webauthn 註冊無密碼 動作,並標示為設定為預設動作。這表示它會在所有新使用者註冊後新增至其中。

註冊流程設定的替代方案是將必要的動作 WebAuthn 註冊無密碼 新增至 Keycloak 已知的使用者。已設定必要動作的使用者必須進行驗證(例如使用使用者名稱/密碼),然後會提示註冊一個 Passkey 以用於無密碼驗證。

我們計畫改善可用性,並允許將條件式 Passkey 與現有的驗證器和表單(例如預設使用者名稱/密碼表單)整合。

Web Authn Level 3 開始,常駐金鑰已取代為可探索憑證

如果使用者的瀏覽器支援 WebAuthn 條件式 UI,則會顯示以下畫面。

具有條件式 UI 的通行金鑰驗證

Passkey Authentication with Conditional UI

當使用者按一下選取您的 Passkey 文字方塊時,將會顯示使用者執行瀏覽器之裝置上儲存的 Passkey 清單,如下所示。

使用條件式 UI 自動填寫的 Passkey 驗證

Passkey Authentication with Conditional UI Autofill

如果使用者的瀏覽器不支援 WebAuthn 條件式 UI,則驗證會回退至 無密碼 WebAuthn,如下所示。

使用條件式 UI 回退至無密碼 WebAuthn 的 Passkey 驗證

Passkey Authentication with Conditional UI falling back to LoginLess WebAuthn

復原代碼 (RecoveryCodes)

您可以將「復原驗證碼表單」新增為雙因素驗證器至您的驗證流程,藉此設定雙因素驗證的復原代碼。如需設定此驗證器的範例,請參閱 WebAuthn

RecoveryCodes 為預覽版,並非完全支援。此功能預設為停用。

若要啟用,請使用 --features=preview--features=recovery-codes 啟動伺服器。

條件式流程中的條件

執行需求 中所述,條件執行只能包含在條件式子流程中。如果所有條件執行都評估為 true,則條件式子流程會作為必要。您可以在條件式子流程中處理下一個執行。如果包含在條件式子流程中的某些執行評估為 false,則整個子流程會視為已停用

可用的條件

條件 - 使用者角色

此執行項目能夠判斷使用者是否具有「使用者角色」欄位中定義的角色。如果使用者具有所需角色,則此執行項目將被視為 true,並評估其他執行項目。管理員必須定義以下欄位

別名

描述執行項目的名稱,將會顯示在驗證流程中。

使用者角色

使用者執行此流程應具有的角色。若要指定應用程式角色,語法為 appname.approle (例如 myapp.myrole)。

條件 - 使用者已設定

此項目會檢查流程中的其他執行項目是否已為使用者設定。執行項目需求章節包含 OTP 表單的範例。

條件 - 使用者屬性

此項目會檢查使用者是否已設定所需的屬性:選擇性地,檢查也可以評估群組屬性。可以反轉輸出,這表示使用者不應具有該屬性。使用者屬性章節說明如何新增自訂屬性。您可以提供以下欄位

別名

描述執行項目的名稱,將會顯示在驗證流程中。

屬性名稱

要檢查的屬性名稱。

預期的屬性值

屬性中預期的值。

包含群組屬性

如果開啟,條件會檢查任何加入的群組是否具有符合已設定名稱和值的屬性:此選項可能會影響效能

反轉輸出

您可以反轉輸出。換句話說,該屬性不應存在。

在條件流程中明確拒絕/允許存取

您可以在條件流程中允許或拒絕存取資源。兩個驗證器 拒絕存取允許存取 依條件控制對資源的存取。

允許存取

驗證器將始終成功驗證。此驗證器不可配置。

拒絕存取

存取將始終被拒絕。您可以定義錯誤訊息,該訊息將顯示給使用者。您可以提供以下欄位

別名

描述執行項目的名稱,將會顯示在驗證流程中。

錯誤訊息

將顯示給使用者的錯誤訊息。錯誤訊息可以提供為特定訊息,或作為屬性以便與本地化一起使用。(例如, "您沒有 'admin' 角色。", 在訊息屬性中的 my-property-deny )。若要使用定義為屬性 access-denied 的預設訊息,請留空。

以下範例說明如何拒絕所有沒有 role1 角色的使用者存取,並顯示由屬性 deny-role1 定義的錯誤訊息。此範例包含 條件 - 使用者角色拒絕存取 執行項目。

瀏覽器流程

Deny access flow

條件 - 使用者角色配置

Deny access role settings

拒絕存取 的配置非常簡單。您可以指定任意別名和所需的訊息,如下所示

Deny access execution settings

最後一件事是在登入主題 messages_en.properties (適用於英文) 中定義具有錯誤訊息的屬性

deny-role1 = You do not have required role!

驗證工作階段

當首次在網頁瀏覽器中開啟登入頁面時,Keycloak 會建立一個名為驗證工作階段的物件,其中儲存有關請求的一些實用資訊。每當從同一瀏覽器中的不同分頁開啟新的登入頁面時,Keycloak 會建立一個新的記錄,稱為驗證子工作階段,該記錄儲存在驗證工作階段中。驗證請求可以來自任何類型的用戶端,例如 Admin CLI。在這種情況下,也會建立一個新的驗證工作階段,其中包含一個驗證子工作階段。請注意,驗證工作階段也可以透過其他方式建立,而不僅僅是使用瀏覽器流程。

驗證工作階段通常會在預設情況下 30 分鐘後過期。確切時間由管理主控台「工作階段」索引標籤中的「登入逾時」開關指定,當設定領域時。

在多個瀏覽器分頁中驗證

如上一節所述,一種情況可能涉及使用者嘗試從單一瀏覽器的多個分頁驗證到 Keycloak 伺服器。但是,當該使用者在一個瀏覽器分頁中驗證時,其他瀏覽器分頁將自動重新啟動驗證。此驗證的發生是因為 Keycloak 登入頁面上提供的小型 JavaScript。重新啟動通常會在其他瀏覽器分頁中驗證使用者,並重新導向至用戶端,因為現在有一個 SSO 工作階段,原因是使用者剛在第一個瀏覽器分頁中成功驗證。當使用者未在其他瀏覽器分頁中自動驗證時,存在一些罕見的例外情況,例如在使用 OIDC 參數 prompt=login逐步驗證時,要求比目前驗證的因素更強的驗證因素。

在某些罕見的情況下,可能會發生在第一個瀏覽器分頁中驗證後,其他瀏覽器分頁無法重新啟動驗證,因為驗證工作階段已過期。在這種情況下,特定的瀏覽器分頁會以特定於協定的方式將有關過期驗證工作階段的錯誤重新導向回用戶端。如需更多詳細資訊,請參閱保護應用程式章節中的 OIDC 文件的相關章節。當用戶端應用程式收到此類錯誤時,它可以立即將 OIDC/SAML 驗證請求重新提交給 Keycloak,因為這通常會由於先前描述的現有 SSO 工作階段而自動驗證使用者。因此,終端使用者會在所有瀏覽器分頁中自動驗證。 保護應用程式 章節中的 Keycloak JavaScript 轉接器Keycloak 身份提供者 支援自動處理此錯誤,並在此類情況下重試與 Keycloak 伺服器的驗證。

整合身份提供者

身份代理是一個中介服務,將服務提供者與身份提供者連接起來。身份代理與外部身份提供者建立關係,以使用提供者的身份來存取服務提供者公開的內部服務。

從使用者的角度來看,身份代理提供以使用者為中心的集中式方式來管理安全網域和領域的身份。您可以連結一個帳戶與一個或多個來自身份提供者的身份,或根據來自它們的身份資訊建立帳戶。

身份提供者源自用於驗證並將驗證和授權資訊傳送給使用者的特定協定。它可以是

  • 社群提供者,例如 Facebook、Google 或 Twitter。

  • 需要存取您服務的商業夥伴。

  • 您想要整合的雲端式身份服務。

通常,Keycloak 基於以下協定建立身份提供者

  • SAML v2.0

  • OpenID Connect v1.0

  • OAuth v2.0

代理概述

當使用 Keycloak 作為身份代理時,Keycloak 不會強制使用者提供其憑證來在特定領域中驗證。Keycloak 會顯示身份提供者清單,使用者可以從這些提供者進行驗證。

如果您設定預設身份提供者,Keycloak 會將使用者重新導向至預設提供者。

不同的協定可能需要不同的驗證流程。Keycloak 支援的所有身份提供者都使用以下流程。

身份代理流程

Identity broker flow

  1. 未經身份驗證的使用者在用戶端應用程式中請求受保護的資源。

  2. 用戶端應用程式將使用者重新導向至 Keycloak 進行驗證。

  3. Keycloak 顯示登入頁面,其中列出領域中設定的身份提供者清單。

  4. 使用者按一下其按鈕或連結來選擇其中一個身份提供者。

  5. Keycloak 向目標身份提供者發出驗證請求,要求驗證並將使用者重新導向至身份提供者的登入頁面。管理員已經為管理主控台的身份提供者設定連線屬性和其他設定選項。

  6. 使用者提供憑證或同意使用身份提供者進行驗證。

  7. 身份提供者成功驗證後,使用者會連同驗證回應重新導向回 Keycloak。通常,回應包含一個安全性權杖,Keycloak 會使用此權杖來信任身份提供者的驗證並擷取使用者資訊。

  8. Keycloak 會檢查身分提供者傳回的回應是否有效。如果有效,且使用者尚不存在,Keycloak 會匯入並建立使用者。如果令牌不包含該資訊,Keycloak 可能會向身分提供者要求更多使用者資訊。此行為稱為身分聯合。如果使用者已存在,Keycloak 可能會要求使用者將身分提供者傳回的身分與現有帳戶連結。此行為稱為帳戶連結。透過 Keycloak,您可以設定帳戶連結,並在首次登入流程中指定。在此步驟中,Keycloak 會驗證使用者身分,並發出令牌,以存取服務提供者中要求的資源。

  9. 當使用者驗證身分時,Keycloak 會將使用者重新導向至服務提供者,並傳送先前在本機驗證期間發出的令牌。

  10. 服務提供者會收到來自 Keycloak 的令牌,並允許存取受保護的資源。

此流程可能會有多種變化。例如,用戶端應用程式可以要求特定的身分提供者,而不是顯示身分提供者列表,或者您可以設定 Keycloak 強制使用者在聯合其身分之前提供其他資訊。

在驗證流程結束時,Keycloak 會向用戶端應用程式發出令牌。用戶端應用程式與外部身分提供者是分開的,因此它們看不到用戶端應用程式的協定,或它們如何驗證使用者身分。提供者只需要知道 Keycloak 即可。

預設身分提供者

Keycloak 可以重新導向至身分提供者,而不是顯示登入表單。要啟用此重新導向

程序
  1. 在選單中點擊驗證

  2. 點擊瀏覽器流程。

  3. 按一下 身分提供者重新導向器 列上的齒輪圖示 ⚙️

  4. 預設身分提供者 設定為您要將使用者重新導向至的身分提供者。

如果 Keycloak 找不到設定的預設身分提供者,則會顯示登入表單。

此驗證器負責處理 kc_idp_hint 查詢參數。有關更多資訊,請參閱用戶端建議的身分提供者章節。

一般設定

身分中介組態的基礎是身分提供者 (IDP)。Keycloak 會為每個領域建立身分提供者,並預設為每個應用程式啟用它們。來自領域的使用者在登入應用程式時,可以使用任何已註冊的身分提供者。

程序
  1. 按一下選單中的 身分提供者

    身分提供者

    Identity Providers

  2. 選取身分提供者。Keycloak 會顯示您選取的身分提供者的組態頁面。

    新增 Facebook 身分提供者

    Add Facebook Identity Provider

    當您設定身分提供者時,身分提供者會以選項的形式出現在 Keycloak 登入頁面上。您可以為每個身分提供者在登入畫面放置自訂圖示。有關更多資訊,請參閱自訂圖示

    IDP 登入頁面

    identity provider login page

    社群

    社群提供者可在您的領域中啟用社群驗證。透過 Keycloak,使用者可以使用社群網路帳戶登入您的應用程式。支援的提供者包括 Twitter、Facebook、Google、LinkedIn、Instagram、Microsoft、PayPal、Openshift v3、GitHub、GitLab、Bitbucket 和 Stack Overflow。

    基於協定的

    基於協定的提供者依賴特定的協定來驗證和授權使用者。使用這些提供者,您可以連線到任何符合特定協定的身分提供者。Keycloak 提供對 SAML v2.0 和 OpenID Connect v1.0 協定的支援。您可以設定和中介任何基於這些開放標準的身分提供者。

儘管每種身分提供者都有其組態選項,但它們都共用一個通用組態。以下是可用的組態選項

表 1. 通用組態
設定 說明

別名

別名是身分提供者的唯一識別碼,並參考內部身分提供者。Keycloak 使用別名為需要重新導向 URI 或回呼 URL 才能與身分提供者通訊的 OpenID Connect 協定建置重新導向 URI。所有身分提供者都必須有別名。別名範例包括 facebookgoogleidp.acme.com

已啟用

切換提供者為開啟或關閉。

在登入頁面隱藏

開啟 時,Keycloak 不會在登入頁面上將此提供者顯示為登入選項。用戶端可以使用 URL 中的 'kc_idp_hint' 參數來要求此提供者。

僅限帳戶連結

開啟 時,Keycloak 會將現有帳戶與此提供者連結。此提供者無法讓使用者登入,並且 Keycloak 不會在登入頁面上將此提供者顯示為選項。

儲存令牌

開啟 時,Keycloak 會儲存來自身分提供者的令牌。

已儲存令牌可讀取

開啟 時,使用者可以檢索儲存的身分提供者令牌。此動作也適用於中介用戶端層級角色讀取令牌

信任電子郵件

開啟 時,Keycloak 信任來自身分提供者的電子郵件地址。如果領域需要電子郵件驗證,則從此身分提供者登入的使用者不需要執行電子郵件驗證流程。

GUI 順序

登入頁面上可用身分提供者的排序順序。

驗證必要宣告

開啟 時,身分提供者發出的 ID 令牌必須具有特定宣告,否則使用者無法透過此中介驗證身分

必要宣告

驗證必要宣告開啟 時,要篩選的 JWT 令牌宣告名稱 (比對區分大小寫)

必要宣告值

驗證必要宣告開啟 時,要比對的 JWT 令牌宣告值 (支援規則運算式格式)

首次登入流程

當使用者首次使用此身分提供者登入 Keycloak 時,Keycloak 會觸發的驗證流程。

登入後流程

當使用者完成使用外部身分提供者登入時,Keycloak 會觸發的驗證流程。

同步模式

透過對應器更新來自身分提供者的使用者資訊的策略。當選擇 舊版 時,Keycloak 會使用目前的行為。匯入 不會更新使用者資料,而 強制 則會在可能時更新使用者資料。有關更多資訊,請參閱身分提供者對應器

區分大小寫的使用者名稱

如果啟用,當聯合使用者時,會保留來自身分提供者的原始使用者名稱。否則,來自身分提供者的使用者名稱會轉換為小寫,如果區分大小寫,則可能與原始值不符。此設定只會影響與聯合身分關聯的使用者名稱,因為伺服器中的使用者名稱一律為小寫。

社群身分提供者

社群身分提供者可以將驗證委派給受信任、受尊敬的社群媒體帳戶。Keycloak 包括對 Google、Facebook、Twitter、GitHub、LinkedIn、Microsoft 和 Stack Overflow 等社群網路的支援。

Bitbucket

若要使用 Bitbucket 登入,請執行以下程序。

程序
  1. 按一下選單中的 身分提供者

  2. 新增提供者 列表中,選取 Bitbucket

    新增身分提供者

    Add Identity Provider

  3. 重新導向 URI 的值複製到您的剪貼簿。

  4. 在另一個瀏覽器索引標籤中,執行在 Bitbucket Cloud 上使用 OAuth 流程。當您按一下 新增取用者

    1. 重新導向 URI 的值貼到 回呼 URL 欄位中。

    2. 請確保您在 帳戶 區段中選取 電子郵件讀取,以允許您的應用程式讀取電子郵件。

  5. 請注意當您建立取用者時 Bitbucket 顯示的 金鑰密碼 值。

  6. 在 Keycloak 中,將 金鑰 的值貼到 用戶端 ID 欄位中。

  7. 在 Keycloak 中,將 密碼 的值貼到 用戶端密碼 欄位中。

  8. 點擊 新增

Facebook

程序
  1. 按一下選單中的 身分提供者

  2. 新增供應商 清單中,選取 Facebook

    新增身分提供者

    Add Identity Provider

  3. 重新導向 URI 的值複製到您的剪貼簿。

  4. 在另一個瀏覽器分頁中,開啟 Meta for Developers

    1. 點擊 我的應用程式

    2. 選取 建立應用程式

      新增使用案例

      Add a use case

    3. 選取 其他

      選取應用程式類型

      Select an app type

    4. 選取 消費者

      建立應用程式

      Create an app

    5. 填寫所有必填欄位。

    6. 點擊 建立應用程式。Meta 接著會將您帶到儀表板。

      新增產品

      Add Product

    7. Facebook 登入 方塊中,點擊 設定

    8. 選取 網站

    9. 重新導向 URI 的值輸入到 網站 URL 欄位,然後點擊 儲存

    10. 在導覽面板中,選取 應用程式設定 - 基本

    11. 點擊 應用程式密鑰 欄位中的 顯示

    12. 記下 應用程式編號應用程式密鑰

  5. 將 Facebook 應用程式的 應用程式編號應用程式密鑰 值輸入到 Keycloak 的 客戶端 ID客戶端密鑰 欄位中。

  6. 點擊 新增

  7. 將所需的範圍輸入到 預設範圍 欄位中。預設情況下,Keycloak 使用 email 範圍。如需關於 Facebook 範圍的詳細資訊,請參閱 Graph API

Keycloak 預設會將設定檔請求傳送至 graph.facebook.com/me?fields=id,name,email,first_name,last_name。回應僅包含 id、name、email、first_name 和 last_name 欄位。若要從 Facebook 設定檔中擷取其他欄位,請新增對應的範圍,並在 其他使用者設定檔欄位 設定選項欄位中新增欄位名稱。

GitHub

若要使用 GitHub 登入,請執行下列程序。

程序
  1. 按一下選單中的 身分提供者

  2. 新增供應商 清單中,選取 Github

    新增身分提供者

    Add Identity Provider

  3. 重新導向 URI 的值複製到您的剪貼簿。

  4. 在另一個瀏覽器分頁中,建立 OAUTH 應用程式

    1. 建立應用程式時,將 重新導向 URI 的值輸入到 授權回呼 URL 欄位中。

    2. 記下 OAUTH 應用程式管理頁面上的 客戶端 ID客戶端密鑰

  5. 在 Keycloak 中,將 客戶端 ID 的值貼到 客戶端 ID 欄位中。

  6. 在 Keycloak 中,將 客戶端密鑰 的值貼到 客戶端密鑰 欄位中。

  7. 點擊 新增

GitLab

程序
  1. 按一下選單中的 身分提供者

  2. 新增供應商 清單中,選取 GitLab

    新增身分提供者

    Add Identity Provider

  3. 重新導向 URI 的值複製到您的剪貼簿。

  4. 在另一個瀏覽器分頁中,新增 GitLab 應用程式

    1. 使用剪貼簿中的 重新導向 URI 作為 重新導向 URI

    2. 儲存應用程式時,記下 應用程式編號密鑰

  5. 在 Keycloak 中,將 應用程式編號 的值貼到 客戶端 ID 欄位中。

  6. 在 Keycloak 中,將 密碼 的值貼到 用戶端密碼 欄位中。

  7. 點擊 新增

Google

程序
  1. 按一下選單中的 身分提供者

  2. 新增供應商 清單中,選取 Google

    新增身分提供者

    Add Identity Provider

  3. 重新導向 URI 的值複製到您的剪貼簿。

  4. 在另一個瀏覽器分頁中,開啟 Google Cloud Platform 主控台

  5. 在您的 Google 應用程式的 Google 儀表板中,在左側的導覽選單中,將滑鼠游標停在 API 和服務 上,然後按一下 OAuth 同意畫面 選項。建立同意畫面,確保同意畫面的使用者類型為 外部

  6. 在 Google 儀表板中

    1. 按一下 憑證 選單。

    2. 按一下 建立憑證 - OAuth 客戶端 ID

    3. 應用程式類型 清單中,選取 網站應用程式

    4. 使用剪貼簿中的 重新導向 URI 作為 授權的重新導向 URI

    5. 點擊 建立

    6. 記下 您的客戶端 ID您的客戶端密鑰

  7. 在 Keycloak 中,將 您的客戶端 ID 的值貼到 客戶端 ID 欄位中。

  8. 在 Keycloak 中,將 您的客戶端密鑰 的值貼到 客戶端密鑰 欄位中。

  9. 點擊 新增

  10. 將所需的範圍輸入到 預設範圍 欄位中。預設情況下,Keycloak 使用下列範圍:openid profile email。如需 Google 範圍的清單,請參閱 OAuth Playground

  11. 若要將存取權限限制為僅限您的 G Suite 組織成員,請在 託管網域 欄位中輸入 G Suite 網域。

  12. 點擊 儲存

Instagram

程序
  1. 按一下選單中的 身分提供者

  2. 新增供應商 清單中,選取 Instagram

    新增身分提供者

    Add Identity Provider

  3. 重新導向 URI 的值複製到您的剪貼簿。

  4. 在另一個瀏覽器分頁中,開啟 Meta for Developers

    1. 點擊 我的應用程式

    2. 選取 建立應用程式

      新增使用案例

      Add a use case

    3. 選取 其他

      選取應用程式類型

      Select an app type

    4. 選取 消費者

      建立應用程式

      Create an app

    5. 填寫所有必填欄位。

    6. 點擊 建立應用程式。Meta 接著會將您帶到儀表板。

    7. 在導覽面板中,選取 應用程式設定 - 基本

    8. 在頁面底部選取 + 新增平台

    9. 按一下 [網站]

    10. 輸入您網站的 URL。

      新增產品

      Add Product

    11. 從選單中選取 儀表板

    12. Instagram 基本顯示 方塊中,按一下 設定

    13. 按一下 建立新應用程式

      建立新的 Instagram 應用程式編號

      Create a New Instagram App ID

    14. 顯示名稱 欄位中輸入值。

      設定應用程式

      Setup the App

    15. 將 Keycloak 中的 重新導向 URL 貼到 有效的 OAuth 重新導向 URI 欄位中。

    16. 將 Keycloak 中的 重新導向 URL 貼到 取消授權回呼 URL 欄位中。

    17. 將 Keycloak 中的 重新導向 URL 貼到 資料刪除請求 URL 欄位中。

    18. 點擊 Instagram 應用程式密鑰 欄位中的 顯示

    19. 記下 Instagram 應用程式編號Instagram 應用程式密鑰

    20. 按一下 應用程式審查 - 請求

    21. 依照畫面上的指示操作。

  5. 在 Keycloak 中,將 Instagram 應用程式編號 的值貼到 客戶端 ID 欄位中。

  6. 在 Keycloak 中,將 Instagram 應用程式密鑰 的值貼到 客戶端密鑰 欄位中。

  7. 點擊 新增

LinkedIn

程序
  1. 按一下選單中的 身分提供者

  2. 新增供應商 清單中,選取 LinkedIn

    新增身分提供者

    Add Identity Provider

  3. 重新導向 URI 的值複製到您的剪貼簿。

  4. 在另一個瀏覽器分頁中,在 LinkedIn 開發人員入口網站中建立應用程式

    1. 建立應用程式後,按一下 驗證 索引標籤。

    2. 重新導向 URI 的值輸入到 您的應用程式的授權重新導向 URL 欄位中。

    3. 記下 您的客戶端 ID您的客戶端密鑰

    4. 按一下 產品 索引標籤,然後針對 使用 OpenID Connect 的 LinkedIn 登入 產品 要求存取權

  5. 在 Keycloak 中,將 客戶端 ID 的值貼到 客戶端 ID 欄位中。

  6. 在 Keycloak 中,將 客戶端密鑰 的值貼到 客戶端密鑰 欄位中。

  7. 點擊 新增

Microsoft

程序
  1. 按一下選單中的 身分提供者

  2. 新增供應商 清單中,選取 Microsoft

    新增身分提供者

    Add Identity Provider

  3. 重新導向 URI 的值複製到您的剪貼簿。

  4. 在另一個瀏覽器分頁中,在 Microsoft Azure應用程式註冊 下註冊應用程式。

    1. 在重新導向 URI 區段中,選取 網站 作為平台,然後將 重新導向 URI 的值貼到欄位中。

    2. 應用程式註冊 下尋找您的應用程式,並在 憑證和密碼 區段中新增客戶端密碼。

    3. 記下所建立密碼的

    4. 記下 概觀 區段中的 應用程式 (客戶端) 編號

  5. 在 Keycloak 中,將 應用程式 (客戶端) 編號 的值貼到 客戶端 ID 欄位中。

  6. 在 Keycloak 中,將密碼的 貼到 客戶端密鑰 欄位中。

  7. 點擊 新增

OpenShift 3

程序
  1. 按一下選單中的 身分提供者

  2. 新增供應商 清單中,選取 Openshift v3

    新增身分提供者

    Add Identity Provider

  3. 重新導向 URI 的值複製到您的剪貼簿。

  4. 使用 oc 命令列工具註冊您的客戶端。

    $ oc create -f <(echo '
    kind: OAuthClient
    apiVersion: v1
    metadata:
     name: kc-client (1)
    secret: "..." (2)
    redirectURIs:
     - "http://www.example.com/" (3)
    grantMethod: prompt (4)
    ')
1 您的 OAuth 客戶端的 名稱。當向 <openshift_master>/oauth/authorize<openshift_master>/oauth/token 發出請求時,會以 client_id 請求參數傳遞。
2 Keycloak 用於 client_secret 請求參數的 密碼
3 在向 <openshift_master>/oauth/authorize<openshift_master>/oauth/token 發出的請求中指定的 redirect_uri 參數,必須等於 (或以其為前綴) redirectURIs 中的其中一個 URI。您可以從「身分識別提供者」畫面中的 重新導向 URI 欄位取得此值。
4 grantMethod 是 Keycloak 用來決定當此客戶端請求令牌,但尚未被使用者授權存取時所採取的動作。
  1. 在 Keycloak 中,將 Client ID 的值貼到 Client ID 欄位。

  2. 在 Keycloak 中,將 Client Secret 的值貼到 Client Secret 欄位。

  3. 點擊 新增

OpenShift 4

先決條件
  1. 儲存在 Keycloak Truststore 中的 OpenShift 4 實例憑證。

  2. 已設定為使用 truststore 的 Keycloak 伺服器。如需更多資訊,請參閱設定 Truststore 指南。

程序
  1. 按一下選單中的 身分提供者

  2. Add provider 清單中,選取 Openshift v4

  3. 輸入 Client IDClient Secret,並在 Base URL 欄位中,輸入您的 OpenShift 4 實例的 API URL。此外,您可以將 Redirect URI 複製到您的剪貼簿。

    新增身分提供者

    Add Identity Provider

  4. 透過 OpenShift 4 Console (首頁 → API 瀏覽器 → OAuth 用戶端 → 實例) 或使用 oc 命令列工具來註冊您的客戶端。

    $ oc create -f <(echo '
    kind: OAuthClient
    apiVersion: oauth.openshift.io/v1
    metadata:
     name: kc-client (1)
    secret: "..." (2)
    redirectURIs:
     - "<here you can paste the Redirect URI that you copied in the previous step>" (3)
    grantMethod: prompt (4)
    ')
1 您的 OAuth 用戶端的 name。在向 <openshift_master>/oauth/authorize<openshift_master>/oauth/token 發出請求時,會當作 client_id 請求參數傳遞。name 參數在 OAuthClient 物件和 Keycloak 設定中必須相同。
2 Keycloak 用作 client_secret 請求參數的 secret
3 <openshift_master>/oauth/authorize<openshift_master>/oauth/token 發出請求時指定的 redirect_uri 參數必須等於(或以其為首碼)redirectURIs 中的其中一個 URI。正確設定它的最簡單方法是從 Keycloak OpenShift 4 身分提供者設定頁面 (Redirect URI 欄位) 複製並貼上。
4 grantMethod 是 Keycloak 用來決定當此客戶端請求令牌,但尚未被使用者授權存取時所採取的動作。

最後,您應該會在 Keycloak 實例的登入頁面上看到 OpenShift 4 身分提供者。點擊它之後,您應該會被重新導向到 OpenShift 4 登入頁面。

結果

Result

如需更多資訊,請參閱官方 OpenShift 文件

PayPal

程序
  1. 按一下選單中的 身分提供者

  2. Add provider 清單中,選取 PayPal

    新增身分提供者

    Add Identity Provider

  3. 重新導向 URI 的值複製到您的剪貼簿。

  4. 在另一個瀏覽器分頁中,開啟 PayPal 開發人員應用程式區域

    1. 點擊 Create App 來建立一個 PayPal 應用程式。

    2. 記下 Client IDClient Secret。點擊 Show 連結以檢視密碼。

    3. 確保已勾選 Log in with PayPal

    4. 在 Log in with PayPal 下,點擊 Advanced Settings

    5. Return URL 欄位的值設定為 Keycloak 中的 Redirect URI 值。請注意,URL 不能包含 localhost。如果您想在本地使用 Keycloak,請將 Return URL 中的 localhost 替換為 127.0.0.1,然後在瀏覽器中使用 127.0.0.1 而不是 localhost 來存取 Keycloak。

    6. 確保已勾選 Full NameEmail 欄位。

    7. 點擊 Save,然後點擊 Save Changes

  5. 在 Keycloak 中,將 客戶端 ID 的值貼到 客戶端 ID 欄位中。

  6. 在 Keycloak 中,將 Secret key 1 的值貼到 Client Secret 欄位。

  7. 點擊 新增

Stack Overflow

程序
  1. 按一下選單中的 身分提供者

  2. Add provider 清單中,選取 Stack Overflow

    新增身分提供者

    Add Identity Provider

  3. 在另一個瀏覽器分頁中,登入 在 Stack Apps 上註冊您的應用程式

    註冊應用程式

    Register Application

    1. Application Name 欄位中輸入您的應用程式名稱。

    2. OAuth Domain 欄位中輸入 OAuth 網域。

    3. 點擊 Register Your Application

      設定

      Settings

  4. 記下 Client IdClient SecretKey

  5. 在 Keycloak 中,將 Client Id 的值貼到 Client ID 欄位。

  6. 在 Keycloak 中,將 客戶端密鑰 的值貼到 客戶端密鑰 欄位中。

  7. 在 Keycloak 中,將 Key 的值貼到 Key 欄位。

  8. 點擊 新增

Twitter

先決條件
  1. 一個 Twitter 開發人員帳戶。

程序
  1. 按一下選單中的 身分提供者

  2. Add provider 清單中,選取 Twitter

    新增身分提供者

    Add Identity Provider

  3. 重新導向 URI 的值複製到您的剪貼簿。

  4. 在另一個瀏覽器分頁中,在 Twitter 應用程式管理中建立一個應用程式。

    1. 輸入應用程式名稱,然後點擊 Next

    2. 記下 API KeyAPI Key Secret 的值,然後點擊 App settings

    3. User authentication settings 區段中,點擊 Set up 按鈕。

    4. 選取 Web App 作為 Type of App

    5. Redirect URL 的值貼到 Callback URI / Redirect URL 欄位。

    6. Website URL 的值可以是任何有效的 URL,除了 localhost

    7. 點擊 Save,然後點擊 Done

  5. 在 Keycloak 中,將 API Key 的值貼到 Client ID 欄位。

  6. 在 Keycloak 中,將 API Key Secret 的值貼到 Client Secret 欄位。

  7. 點擊 新增

OpenID Connect v1.0 身分提供者

Keycloak 基於 OpenID Connect 協定來橋接身分提供者。這些身分提供者 (IDP) 必須支援規格中定義的授權碼流程,才能驗證使用者身分並授權存取。

程序
  1. 按一下選單中的 身分提供者

  2. Add provider 清單中,選取 OpenID Connect v1.0

    新增身分提供者

    Add Identity Provider

  3. 輸入您的初始設定選項。如需更多關於設定選項的資訊,請參閱一般 IDP 設定

    表 2. OpenID Connect 設定
    設定 說明

    授權 URL

    OIDC 協定要求的授權 URL 端點。

    令牌 URL

    OIDC 協定要求的令牌 URL 端點。

    登出 URL

    OIDC 協定中的登出 URL 端點。此值為選填。

    後端通道登出

    向 IDP 發出的後台、頻外、REST 請求,用於登出使用者。某些 IDP 僅透過瀏覽器重新導向執行登出,因為它們可能會使用瀏覽器 Cookie 來識別工作階段。

    使用者資訊 URL

    OIDC 協定定義的端點。此端點指向使用者個人檔案資訊。

    客戶端驗證

    定義 Keycloak 使用授權碼流程時所用的客戶端驗證方法。若是使用私密金鑰簽署的 JWT,Keycloak 會使用領域私密金鑰。在其他情況下,則定義客戶端密碼。如需更多資訊,請參閱客戶端驗證規格

    客戶端 ID

    一個領域,作為外部 IDP 的 OIDC 客戶端。如果您使用授權碼流程與外部 IDP 互動,則該領域必須具有 OIDC 客戶端 ID。

    客戶端密碼

    來自外部保管庫的客戶端密碼。如果您正在使用授權碼流程,則此密碼是必要的。

    客戶端斷言簽名演算法

    用於建立 JWT 斷言以進行客戶端驗證的簽名演算法。若是使用私密金鑰或客戶端密碼作為 jwt 簽署的 JWT,則這是必要的。如果未指定演算法,則會採用以下演算法。在使用私密金鑰簽署的 JWT 的情況下,會採用 RS256。在使用客戶端密碼作為 jwt 的情況下,會採用 HS256

    客戶端斷言受眾

    用於客戶端斷言的受眾。預設值為 IDP 的令牌端點 URL。

    發行者

    Keycloak 會根據此值驗證來自 IDP 的回應中的發行者聲明。

    預設範圍

    Keycloak 與驗證請求一起傳送的 OIDC 範圍清單。預設值為 openid。每個範圍以空格分隔。

    提示

    OIDC 規格中的提示參數。透過此參數,您可以強制重新驗證和其他選項。請參閱規格以取得更多詳細資訊。

    接受來自客戶端的提示=無轉發

    指定 IDP 是否接受包含 prompt=none 查詢參數的轉發驗證請求。如果領域收到包含 prompt=none 的驗證請求,該領域會檢查使用者是否已通過驗證,如果使用者尚未登入,則會傳回 login_required 錯誤。當 Keycloak 為驗證請求決定預設 IDP 時 (使用 kc_idp_hint 查詢參數或擁有領域的預設 IDP),您可以將包含 prompt=none 的驗證請求轉發到預設 IDP。預設 IDP 會檢查該處使用者的驗證。由於並非所有 IDP 都支援包含 prompt=none 的請求,Keycloak 會使用此開關來指示預設 IDP 在重新導向驗證請求之前支援此參數。

    如果使用者在 IDP 中未通過驗證,用戶端仍會收到 login_required 錯誤。如果使用者在 IDP 中通過驗證,如果 Keycloak 必須顯示需要使用者互動的驗證頁面,用戶端仍可能會收到 interaction_required 錯誤。此驗證包括必要動作 (例如,密碼變更)、同意畫面以及設定為由「首次代理登入」流程或「代理登入後」流程顯示的畫面。

    驗證簽章

    指定 Keycloak 是否驗證此 IDP 簽署的外部 ID Token 上的簽章。如果為開啟,Keycloak 必須知道外部 OIDC IDP 的公鑰。為了效能考量,Keycloak 會快取外部 OIDC 身分提供者的公鑰。

    使用 JWKS URL

    如果驗證簽章開啟,則此開關適用。如果使用 JWKS URL開啟,Keycloak 會從 JWKS URL 下載 IDP 的公鑰。當身分提供者產生新的金鑰對時,會下載新的金鑰。如果為關閉,Keycloak 會使用其資料庫中的公鑰 (或憑證),因此當 IDP 金鑰對變更時,也請將新金鑰匯入 Keycloak 資料庫。

    JWKS URL

    指向 IDP JWK 金鑰位置的 URL。如需詳細資訊,請參閱 JWK 規格。如果您使用外部 Keycloak 作為 IDP,則可以使用類似 http://broker-keycloak:8180/realms/test/protocol/openid-connect/certs 的 URL,如果您的代理 Keycloak 在 http://broker-keycloak:8180 上執行,且其領域為 test

    驗證公鑰

    Keycloak 用於驗證外部 IDP 簽章的 PEM 格式公鑰。如果使用 JWKS URL關閉,則會套用此金鑰。

    驗證公鑰 ID

    如果使用 JWKS URL關閉,則會套用此設定。此設定指定 PEM 格式公鑰的 ID。由於沒有從金鑰計算金鑰 ID 的標準方法,外部身分提供者可以使用與 Keycloak 使用的演算法不同的演算法。如果未指定此欄位的值,Keycloak 會將驗證公鑰用於所有請求,無論外部 IDP 傳送的金鑰 ID 為何。當為開啟時,此欄位的值是 Keycloak 用於驗證提供者簽章的金鑰 ID,且必須與 IDP 指定的金鑰 ID 相符。

您可以透過提供指向 OpenID 提供者中繼資料的 URL 或檔案,匯入所有此組態資料。如果您連線到 Keycloak 外部 IDP,則可以從 <root>/realms/{realm-name}/.well-known/openid-configuration 匯入 IDP 設定。此連結是描述 IDP 中繼資料的 JSON 文件。

如果您想要在提供者中使用 Json Web Encryption (JWE) ID Token 或 UserInfo 回應,IDP 需要知道與 Keycloak 搭配使用的公鑰。提供者會使用針對不同加密演算法定義的 領域金鑰來解密 Token。Keycloak 提供標準的 JWKS 端點,IDP 可用來自動下載金鑰。

SAML v2.0 身分提供者

Keycloak 可以代理以 SAML v2.0 通訊協定為基礎的身分提供者。

程序
  1. 按一下選單中的 身分提供者

  2. 新增提供者 清單中,選取 SAML v2.0

    新增身分提供者

    Add Identity Provider

  3. 輸入您的初始設定選項。如需更多關於設定選項的資訊,請參閱一般 IDP 設定

表 3. SAML 設定
設定 說明

服務提供者實體 ID

遠端身分提供者用來識別來自此服務提供者的請求的 SAML 實體 ID。預設情況下,此設定會設定為領域基本 URL <root>/realms/{realm-name}

身分提供者實體 ID

用於驗證收到的 SAML 判斷提示之發行者的實體 ID。如果為空,則不會執行發行者驗證。

單一登入服務 URL

啟動驗證程序的 SAML 端點。如果您的 SAML IDP 發佈 IDP 實體描述元,則會在此處指定此欄位的值。

成品服務 URL

SAML 成品解析端點。如果您的 SAML IDP 發佈 IDP 實體描述元,則會在此處指定此欄位的值。

單一登出服務 URL

SAML 登出端點。如果您的 SAML IDP 發佈 IDP 實體描述元,則會在此處指定此欄位的值。

後端通道登出

如果您的 SAML IDP 支援後端通道登出,請將此開關切換為開啟

NameID 原則格式

對應於名稱識別碼格式的 URI 參考。預設情況下,Keycloak 會將其設定為 urn:oasis:names:tc:SAML:2.0:nameid-format:persistent

主體類型

指定 SAML 判斷提示的哪個部分將用於識別和追蹤外部使用者身分。可以是主體 NameID 或 SAML 屬性 (依名稱或易記名稱)。主體 NameID 值不能與 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient' NameID 原則格式值一起設定。

主體屬性

如果主體類型為非空白,則此欄位會指定識別屬性的名稱 ("屬性 [名稱]") 或易記名稱 ("屬性 [易記名稱]")。

允許建立

允許外部身分提供者建立新的識別碼來表示主體。

HTTP-POST 繫結回應

控制回應外部 IDP 傳送的任何 SAML 請求中的 SAML 繫結。當為關閉時,Keycloak 會使用重新導向繫結。

ARTIFACT 繫結回應

控制回應外部 IDP 傳送的任何 SAML 請求中的 SAML 繫結。當為關閉時,Keycloak 會評估 HTTP-POST 繫結回應組態。

AuthnRequest 的 HTTP-POST 繫結

在要求外部 IDP 驗證時控制 SAML 繫結。當為關閉時,Keycloak 會使用重新導向繫結。

想要簽署 AuthnRequests

當為開啟時,Keycloak 會使用領域的金鑰對來簽署傳送至外部 SAML IDP 的請求。

想要簽署判斷提示

指出此服務提供者是否預期已簽署的判斷提示。

想要加密判斷提示

指出此服務提供者是否預期加密的判斷提示。

簽章演算法

如果想要簽署 AuthnRequests開啟,則為要使用的簽章演算法。請注意,不建議使用以 SHA1 為基礎的演算法,且可能會在未來的版本中移除。我們建議使用比 *_SHA1 更安全的演算法。此外,使用 *_SHA1 演算法,如果 SAML 身分提供者 (例如 Keycloak 的另一個執行個體) 在 Java 17 或更高版本上執行,驗證簽章將無法運作。

加密演算法

SAML IDP 用於加密 SAML 文件、判斷提示或 ID 的加密演算法。用於解密 SAML 文件部分的對應解密金鑰將根據此設定的演算法選擇,且應在用於加密 (ENC) 的領域金鑰中可用。如果未設定演算法,則允許任何支援的演算法,且將根據 SAML 文件本身指定的演算法選擇解密金鑰。

SAML 簽章金鑰名稱

使用 POST 繫結傳送的簽署 SAML 文件在 KeyName 元素中包含簽署金鑰的識別,預設情況下,其中包含 Keycloak 金鑰 ID。外部 SAML IDP 可能會預期不同的金鑰名稱。此開關控制 KeyName 是否包含:* KEY_ID - 金鑰 ID。* CERT_SUBJECT - 對應於領域金鑰的憑證的主體。Microsoft Active Directory Federation Services 預期 CERT_SUBJECT。* NONE - Keycloak 會省略 SAML 訊息中的金鑰名稱提示。

強制驗證

即使使用者已登入,使用者也必須在外部 IDP 輸入其認證。

驗證簽章

當為開啟時,領域預期來自外部 IDP 的 SAML 請求和回應會經過數位簽署。

中繼資料描述元 URL

身分提供者發佈 IDPSSODescriptor 中繼資料的外部 URL。當按一下重新載入金鑰匯入金鑰動作時,此 URL 會用於下載身分提供者憑證。

使用中繼資料描述元 URL

當為開啟時,會從中繼資料描述元 URL 自動下載用於驗證簽章的憑證,並快取在 Keycloak 中。SAML 提供者可以用兩種不同的方式驗證簽章。如果要求特定憑證 (通常在 POST 繫結中) 且不在快取中,則會自動從 URL 重新整理憑證。如果要求所有憑證來驗證簽章 (REDIRECT 繫結),則僅在最長快取時間之後才會完成重新整理 (如需快取運作方式的詳細資訊,請參閱所有提供者組態指南中的 public-key-storage spi)。也可以使用身分提供者頁面中的動作 重新載入金鑰 手動更新快取。

當選項為關閉時,會使用驗證 X509 憑證中的憑證來驗證簽章。

驗證 X509 憑證

使用中繼資料描述符 URL 設定為 關閉 時,Keycloak 用於驗證來自外部 IDP 的 SAML 請求和回應簽章的公開憑證。可以輸入多個憑證,並以逗號 (,) 分隔。憑證可以從 中繼資料描述符 URL 重新匯入,方法是在身分提供者頁面中點擊 匯入金鑰 操作。此操作會下載中繼資料端點中的目前憑證,並將其指派給此選項中的設定。您需要點擊 儲存 以永久儲存重新匯入的憑證。

簽署服務提供者中繼資料

當設定為 開啟 時,Keycloak 會使用 realm 的金鑰對來簽署 SAML 服務提供者中繼資料描述符

傳遞主體

控制 Keycloak 是否將 login_hint 查詢參數轉發到 IDP。Keycloak 會將此欄位的值新增至 AuthnRequest 的主體中的 login_hint 參數,以便目標提供者可以預先填寫其登入表單。

屬性使用服務索引

識別要向遠端 IDP 請求的屬性集。Keycloak 會自動將身分提供者設定中對應的屬性新增至自動產生的 SP 中繼資料文件中。

屬性使用服務名稱

在自動產生的 SP 中繼資料文件中宣告的屬性集的描述性名稱。

您可以透過提供 URL 或指向外部 IDP 的 SAML IDP 實體描述符的檔案,匯入所有組態資料。如果您要連線到 Keycloak 外部 IDP,您可以從 URL <root>/realms/{realm-name}/protocol/saml/descriptor 匯入 IDP 設定。此連結是一個描述 IDP 中繼資料的 XML 文件。您也可以透過提供 URL 或指向外部 SAML IDP 實體描述符的 XML 檔案,匯入所有此組態資料以進行連線。

請求特定的 AuthnContexts

身分提供者協助用戶端指定驗證使用者身分的方法的限制。例如,要求 MFA、Kerberos 驗證或安全性需求。這些限制使用特定的 AuthnContext 準則。用戶端可以要求一個或多個準則,並指定身分提供者必須如何符合要求的 AuthnContext,完全符合或滿足其他等效項目。

您可以透過在「要求的 AuthnContext 限制」區段中新增 ClassRefs 或 DeclRefs 來列出您的服務提供者需要的準則。通常,您需要提供 ClassRefs 或 DeclRefs 其中之一,因此請查看身分提供者文件,了解支援哪些值。如果沒有 ClassRefs 或 DeclRefs,身分提供者不會強制執行額外的限制。

表 4. 要求的 AuthnContext 限制
設定 說明

比較

身分提供者用於評估內容需求的方法。可用的值為 完全符合最小值最大值較好。預設值為 完全符合

AuthnContext ClassRefs

描述所需準則的 AuthnContext ClassRefs。

AuthnContext DeclRefs

描述所需準則的 AuthnContext DeclRefs。

SP 描述符

當您存取提供者的 SAML SP 中繼資料時,請在身分提供者組態設定中尋找 端點 項目。其中包含 SAML 2.0 服務提供者中繼資料 連結,會為服務提供者產生 SAML 實體描述符。您可以下載描述符或複製其 URL,然後將其匯入遠端身分提供者。

此中繼資料也可以透過以下 URL 公開取得

http[s]://{host:port}/realms/{realm-name}/broker/{broker-alias}/endpoint/descriptor

請確保您在存取描述符之前儲存任何組態變更。

在 SAML 請求中傳送主體

預設情況下,指向 SAML 身分提供者的社交按鈕會將使用者重新導向至以下登入 URL

http[s]://{host:port}/realms/${realm-name}/broker/{broker-alias}/login

將名為 login_hint 的查詢參數新增至此 URL 會將參數的值新增至 SAML 請求,作為主體屬性。如果此查詢參數為空,Keycloak 不會將主體新增至請求。

啟用「傳遞主體」選項以在 SAML 請求中傳送主體。

用戶端建議的身分提供者

OIDC 應用程式可以透過提示他們想要使用的身分提供者來繞過 Keycloak 登入頁面。您可以透過在授權碼流程授權端點中設定 kc_idp_hint 查詢參數來啟用此功能。

透過 Keycloak OIDC 用戶端配接器,您可以在存取應用程式中受保護的資源時指定此查詢參數。

例如

GET /myapplication.com?kc_idp_hint=facebook HTTP/1.1
Host: localhost:8080

在此情況下,您的 realm 必須具有別名為 facebook 的身分提供者。如果此提供者不存在,則會顯示登入表單。

如果您使用的是 JavaScript 配接器,您也可以透過以下方式達到相同的行為

const keycloak = new Keycloak({
        url: "http://keycloak-server",
        realm: "my-realm",
        clientId: "my-app"
);

await keycloak.createLoginUrl({
        idpHint: 'facebook'
});

透過 kc_idp_hint 查詢參數,如果為 身分提供者重新導向器 驗證器設定一個,用戶端可以覆寫預設的身分提供者。用戶端可以透過將 kc_idp_hint 查詢參數設定為空值來停用自動重新導向。

對應宣告和斷言

您可以將您正在驗證的外部 IDP 提供的 SAML 和 OpenID Connect 中繼資料匯入 realm。匯入後,您可以擷取使用者設定檔中繼資料和其他資訊,以便您讓應用程式可以使用這些資訊。

每個使用外部身分提供者登入您 realm 的使用者,都會根據 SAML 或 OIDC 斷言和宣告中的中繼資料,在 Keycloak 本機資料庫中擁有一個條目。

程序
  1. 按一下選單中的 身分提供者

  2. 從清單中選取一個身分提供者。

  3. 點擊 對應器 索引標籤。

    身分提供者對應器

    identity provider mappers

  4. 點擊 新增對應器

    身分提供者對應器

    identity provider mapper

  5. 同步模式覆寫 選取一個值。當使用者根據此設定重複登入時,對應器會更新使用者資訊。

    1. 選取 舊版 以使用先前 Keycloak 版本的行為。

    2. 選取 匯入 以從使用者首次在 Keycloak 中建立時匯入資料,在首次使用特定身分提供者登入 Keycloak 期間。

    3. 選取 強制 以在每次使用者登入時更新使用者資料。

    4. 選取 繼承 以使用身分提供者中設定的同步模式。所有其他選項都會覆寫此同步模式。

  6. 對應器類型 清單中選取一個對應器。將滑鼠游標停留在 對應器類型 上方,以取得對應器的描述和要輸入的對應器設定。

  7. 點擊 儲存

對於以 JSON 為基礎的宣告,您可以使用點符號表示巢狀結構,並使用方括號透過索引存取陣列欄位。例如:contact.address[0].country

若要調查社交提供者提供的使用者設定檔 JSON 資料的結構,您可以在啟動伺服器時啟用 DEBUG 層級記錄器 org.keycloak.social.user_profile_dump

可用的使用者工作階段資料

在使用者從外部 IDP 登入後,Keycloak 會儲存您可存取的使用者工作階段附註資料。此資料可以使用適當的用戶端對應器,傳播到使用權杖或傳回給用戶端的 SAML 斷言請求登入的用戶端。

identity_provider

用於執行登入的代理的 IDP 別名。

identity_provider_identity

目前已驗證使用者的 IDP 使用者名稱。通常(但不總是)與 Keycloak 使用者名稱相同。例如,Keycloak 可以將使用者 john` 連結到 Facebook 使用者 john123@gmail.com。在這種情況下,使用者工作階段附註的值為 john123@gmail.com

您可以使用類型為 使用者工作階段附註通訊協定對應器,將此資訊傳播到您的用戶端。

首次登入流程

當使用者透過身分代理登入時,Keycloak 會在 realm 的本機資料庫中匯入並連結使用者的各個方面。當 Keycloak 透過外部身分提供者成功驗證使用者時,可能存在兩種情況

  • Keycloak 已匯入並將使用者帳戶連結到已驗證的身分提供者帳戶。在這種情況下,Keycloak 會以現有使用者的身分驗證,並重新導向回應用程式。

  • 此使用者在 Keycloak 中不存在帳戶。通常,您會註冊並將新帳戶匯入 Keycloak 資料庫,但可能會有與相同電子郵件地址的現有 Keycloak 帳戶。將現有的本機帳戶自動連結到外部身分提供者是一個潛在的安全性漏洞。您無法總是信任從外部身分提供者取得的資訊。

不同的組織在處理其中一些情況時有不同的要求。透過 Keycloak,您可以使用 IDP 設定中的 首次登入流程 選項,為首次從外部 IDP 登入的使用者選擇 工作流程。預設情況下,首次登入流程 選項指向 首次代理登入 流程,但您可以為不同的身分提供者使用自己的流程或不同的流程。

此流程位於管理主控台的 驗證 索引標籤下。當您選擇 首次代理登入 流程時,您會看到預設使用的驗證器。您可以重新設定現有的流程。例如,您可以停用某些驗證器、將其中一些驗證器標示為 必要,或設定某些驗證器。

您也可以建立新的驗證流程、編寫您自己的驗證器實作,並在您的流程中使用它。如需詳細資訊,請參閱 伺服器開發人員指南

預設首次登入流程驗證器

檢閱設定檔
  • 此驗證器會顯示設定檔資訊頁面,以便使用者可以檢閱 Keycloak 從身分提供者擷取的設定檔。

  • 您可以在 動作 功能表中設定 首次登入時更新設定檔 選項。

  • 當設定為 開啟 時,系統會向使用者顯示設定檔頁面,要求其他資訊來聯合使用者的身分。

  • 遺失時,如果身分提供者沒有提供必要的資訊(例如電子郵件、名字或姓氏),使用者會看到個人資料頁面。

  • 當設定為 關閉 時,除非使用者在稍後階段點擊 確認連結現有帳號 驗證器所顯示頁面中的 檢閱個人資料資訊 連結,否則不會顯示個人資料頁面。

如果唯一則建立使用者

此驗證器會檢查是否已存在與身分提供者的帳號具有相同電子郵件或使用者名稱的 Keycloak 帳號。如果沒有,則此驗證器會建立新的本地 Keycloak 帳號,並將其與身分提供者連結,整個流程即完成。否則,它會進入下一個 處理現有帳號 子流程。如果您始終希望確保沒有重複的帳號,您可以將此驗證器標記為 必要。在這種情況下,如果存在現有的 Keycloak 帳號,使用者會看到錯誤頁面,並且需要透過帳號管理來連結身分提供者帳號。

  • 此驗證器會驗證是否已存在與身分提供者帳號具有相同電子郵件或使用者名稱的 Keycloak 帳號。

  • 如果帳號不存在,此驗證器會建立本地 Keycloak 帳號,將此帳號與身分提供者連結,並終止流程。

  • 如果帳號存在,此驗證器會執行下一個 處理現有帳號 子流程。

  • 為了確保沒有重複的帳號,您可以將此驗證器標記為 必要。如果 Keycloak 帳號存在,使用者會看到錯誤頁面,且使用者必須透過帳號管理來連結其身分提供者帳號。

確認連結現有帳號
  • 在資訊頁面上,使用者會看到一個具有相同電子郵件的 Keycloak 帳號。使用者可以再次檢閱他們的個人資料,並使用不同的電子郵件或使用者名稱。流程會重新開始並返回 檢閱個人資料 驗證器。

  • 或者,使用者可以確認他們想要將其身分提供者帳號與現有的 Keycloak 帳號連結。

  • 如果您不希望使用者看到此確認頁面,並直接透過電子郵件驗證或重新驗證來連結身分提供者帳號,請停用此驗證器。

透過電子郵件驗證現有帳號
  • 此驗證器預設為 替代。如果領域已設定 SMTP,Keycloak 會使用此驗證器。

  • 此驗證器會向使用者發送電子郵件,以確認他們想要將身分提供者與其 Keycloak 帳號連結。

  • 如果您不想透過電子郵件確認連結,而是希望使用者使用其密碼重新驗證,請停用此驗證器。

透過重新驗證來驗證現有帳號
  • 如果電子郵件驗證器不可用,請使用此驗證器。例如,您尚未為您的領域設定 SMTP。此驗證器會顯示登入畫面,讓使用者驗證以將其 Keycloak 帳號與身分提供者連結。

  • 使用者也可以使用已連結至其 Keycloak 帳號的其他身分提供者重新驗證。

  • 您可以強制使用者使用 OTP。否則,它是可選的,如果您的使用者帳號已設定 OTP,則會使用它。

在使用者可以使用任意使用者名稱或電子郵件地址自行註冊的通用環境中,自動連結驗證器是危險的。除非您仔細管理使用者註冊並分配使用者名稱和電子郵件地址,否則請勿使用此驗證器。

若要設定在不提示的情況下自動連結使用者的首次登入流程,請使用以下兩個驗證器建立新的流程

如果唯一則建立使用者

此驗證器可確保 Keycloak 處理唯一使用者。將驗證器需求設定為 替代

自動設定現有使用者

此驗證器會將現有使用者設定到驗證上下文中,而無需驗證。將驗證器需求設定為「替代」。

此設定是可用的最簡單設定,但也可以使用其他驗證器。例如:* 如果您希望最終使用者確認他們的個人資料資訊,可以在流程的開頭新增「檢閱個人資料」驗證器。* 您可以在此流程中新增驗證機制,強制使用者驗證其憑證。新增驗證機制需要複雜的流程。例如,您可以在「替代」子流程中將「自動設定現有使用者」和「密碼表單」設定為「必要」。

停用自動建立使用者

預設的首次登入流程會查找與外部身分相符的 Keycloak 帳號,並提供連結它們。如果沒有相符的 Keycloak 帳號存在,流程會自動建立一個。

這種預設行為可能不適用於某些設定。一個例子是當您使用唯讀 LDAP 使用者存放區時,其中所有使用者都是預先建立的。在這種情況下,您必須關閉自動建立使用者。

若要停用使用者建立

程序
  1. 在選單中點擊驗證

  2. 從列表中選取 首次代理登入

  3. 如果唯一則建立使用者 設定為 已停用

  4. 確認連結現有帳號 設定為 已停用

此設定也表示 Keycloak 本身將無法判斷哪個內部帳號會對應到外部身分。因此,透過重新驗證來驗證現有帳號 驗證器會要求使用者提供使用者名稱和密碼。

透過身分提供者啟用或停用使用者建立,與領域的 使用者註冊開關 完全獨立。您可以使用身分提供者啟用使用者建立,同時在領域登入設定中停用使用者自我註冊,反之亦然。

偵測現有使用者首次登入流程

為了設定首次登入流程,其中

  • 只有已在此領域中註冊的使用者才能登入,

  • 使用者會自動連結而無需提示,

請使用以下兩個驗證器建立新的流程

偵測現有代理使用者

此驗證器可確保處理唯一使用者。將驗證器需求設定為 必要

自動設定現有使用者

自動將現有使用者設定到驗證上下文中,而無需任何驗證。將驗證器需求設定為 必要

您必須將身分提供者設定的 首次登入流程 設定為該流程。如果您想要使用身分提供者屬性更新使用者個人資料(姓氏、名字…),您也可以將 同步模式 設定為 強制

如果您想要將身分委派給其他身分提供者(例如 GitHub、Facebook …),但您想要管理哪些使用者可以登入,則可以使用此流程。

使用此設定,Keycloak 無法判斷哪個內部帳號對應到外部身分。透過重新驗證來驗證現有帳號 驗證器會要求提供者提供使用者名稱和密碼。

當另一個帳號需要在同一個身分提供者內連結到同一個 Keycloak 帳號時,您可以設定以下驗證器。

確認覆寫現有連結

此驗證器會偵測使用者現有的代理連結,並顯示確認頁面以確認覆寫現有的代理連結。將驗證器需求設定為必要。

此驗證器的一個典型用法如下

  • 例如,考慮一個電子郵件為 john@gmail.com 的 Keycloak 使用者 john。該使用者連結到身分提供者 google,且 google 使用者名稱為 john@gmail.com

  • 然後,例如,Keycloak 使用者 john 使用電子郵件 john-new@gmail.com 建立新的 Google 帳號。

  • 然後,在登入 Keycloak 期間,使用者使用新的使用者名稱(例如 john-new@gmail.com)驗證到身分提供者 google,該使用者名稱尚未連結到任何 Keycloak 帳號(因為 Keycloak 帳號 john 仍與 google 使用者 john@gmail.com 連結),因此會觸發首次代理登入流程。

  • 在首次代理登入期間,Keycloak 使用者 john 會以某種方式驗證(預設的首次代理登入重新驗證,或例如透過像是 偵測現有代理使用者 的驗證器)。

  • 現在,有了驗證流程中的此驗證器,在使用者 john 確認後,就可以將 Keycloak 使用者 johngoogle 身分提供者的 IDP 連結覆寫為新的 google 連結,指向 google 使用者 john-new@gmail.com

在使用此驗證器建立驗證流程時,請確保在其他驗證器已透過其他方式建立 Keycloak 使用者後(透過重新驗證,或如上所述在 偵測現有代理使用者 之後)新增此驗證器。

擷取外部 IDP 令牌

使用 Keycloak,您可以使用 IDP 設定頁面上的 儲存令牌 設定選項,儲存來自與外部 IDP 進行驗證流程的令牌和回應。

應用程式程式碼可以擷取這些令牌和回應,以匯入額外的使用者資訊,或安全地請求外部 IDP。例如,應用程式可以使用 Google 令牌來使用其他 Google 服務和 REST API。若要擷取特定身分提供者的令牌,請發送如下請求

GET /realms/{realm}/broker/{provider_alias}/token HTTP/1.1
Host: localhost:8080
Authorization: Bearer <KEYCLOAK ACCESS TOKEN>

應用程式必須使用 Keycloak 進行驗證並接收存取令牌。此存取令牌必須設定有 broker 用戶端層級角色 read-token,因此使用者必須擁有此角色的角色對應,且用戶端應用程式必須在其範圍內具有該角色。在這種情況下,由於您正在存取 Keycloak 中受保護的服務,請發送使用者驗證期間由 Keycloak 發出的存取令牌。您可以透過將 儲存的令牌可讀取 開關設定為 開啟,在代理設定頁面中將此角色指派給新匯入的使用者。

這些外部令牌可以透過再次通過提供者登入或使用用戶端起始的帳號連結 API 來重新建立。

身分代理登出

登出時,Keycloak 會向最初用於登入的外部身分提供者發送請求,並將使用者從此身分提供者登出。

SSO 協定

本節討論身分驗證協定、Keycloak 身分驗證伺服器,以及受 Keycloak 身分驗證伺服器保護的應用程式如何與這些協定互動。

OpenID Connect

OpenID Connect (OIDC) 是一種身分驗證協定,它是 OAuth 2.0 的擴充。

OAuth 2.0 是一個建構授權協定的框架,並不完整。然而,OIDC 是一種完整的身分驗證和授權協定,它使用 Json Web Token (JWT) 標準。JWT 標準定義了身分令牌 JSON 格式,以及以精簡且網路友善的方式對資料進行數位簽章和加密的方法。

一般而言,OIDC 實作了兩種使用案例。第一種案例是應用程式要求 Keycloak 伺服器驗證使用者身分。成功登入後,應用程式會收到一個身分令牌和一個存取令牌身分令牌包含使用者資訊,包括使用者名稱、電子郵件和個人資料資訊。領域會數位簽章存取令牌,其中包含應用程式用來判斷使用者可以在應用程式中存取哪些資源的存取資訊(例如使用者角色對應)。

第二種使用案例是客戶端存取遠端服務。

  • 客戶端從 Keycloak 請求一個存取令牌,以便代表使用者調用遠端服務。

  • Keycloak 會驗證使用者身分,並要求使用者同意授權給請求的客戶端存取權。

  • 客戶端會收到由領域數位簽章的存取令牌

  • 客戶端使用存取令牌在遠端服務上發出 REST 請求。

  • 遠端 REST 服務會提取存取令牌

  • 遠端 REST 服務會驗證令牌的簽章。

  • 遠端 REST 服務會根據令牌內的存取資訊,決定處理或拒絕該請求。

OIDC 驗證流程

OIDC 有幾種方法或流程,客戶端或應用程式可以使用這些方法來驗證使用者身分並接收身分存取令牌。該方法取決於請求存取的應用程式或客戶端類型。

授權碼流程

授權碼流程是一種基於瀏覽器的協定,適合驗證和授權基於瀏覽器的應用程式。它使用瀏覽器重新導向來取得身分存取令牌。

  1. 使用者使用瀏覽器連線到應用程式。應用程式偵測到使用者未登入該應用程式。

  2. 應用程式將瀏覽器重新導向至 Keycloak 進行身分驗證。

  3. 應用程式在瀏覽器重新導向中將回呼 URL 作為查詢參數傳遞。Keycloak 在成功驗證後使用該參數。

  4. Keycloak 會驗證使用者身分,並建立一個一次性的、短暫的臨時代碼。

  5. Keycloak 使用回呼 URL 重新導向至應用程式,並將臨時代碼作為回呼 URL 中的查詢參數新增。

  6. 應用程式會提取臨時代碼,並向 Keycloak 發出背景 REST 調用,以將代碼交換為身分存取重新整理令牌。為防止重播攻擊,臨時代碼不能使用多次。

在令牌的生命週期內,系統很容易遭受被竊取令牌的攻擊。基於安全性和可擴展性的考量,存取令牌通常會設定為快速過期,因此後續的令牌請求會失敗。如果令牌過期,應用程式可以使用登入協定傳送的其他重新整理令牌取得新的存取令牌。

機密客戶端會在將臨時代碼交換為令牌時提供客戶端密碼。公開客戶端不需要提供客戶端密碼。當嚴格強制執行 HTTPS 並且嚴格控制為客戶端註冊的重新導向 URI 時,公開客戶端是安全的。HTML5/JavaScript 客戶端必須是公開客戶端,因為沒有安全的方法可以將客戶端密碼安全地傳輸到 HTML5/JavaScript 客戶端。如需更多詳細資訊,請參閱管理客戶端章節。

Keycloak 也支援 程式碼交換證明金鑰規格。

隱式流程

隱式流程是一種基於瀏覽器的協定。它類似於授權碼流程,但請求較少,而且沒有重新整理令牌。

當透過重新導向 URI 傳輸令牌時,存在存取令牌在瀏覽器歷史記錄中洩漏的可能性(請參閱下文)。

此外,此流程不為客戶端提供重新整理令牌。因此,存取令牌必須是長期有效的,或者使用者必須在令牌過期時重新驗證身分。

我們不建議使用此流程。支援此流程是因為它在 OIDC 和 OAuth 2.0 規格中。

協定運作方式如下

  1. 使用者使用瀏覽器連線到應用程式。應用程式偵測到使用者未登入該應用程式。

  2. 應用程式將瀏覽器重新導向至 Keycloak 進行身分驗證。

  3. 應用程式在瀏覽器重新導向中將回呼 URL 作為查詢參數傳遞。Keycloak 在成功驗證後使用該查詢參數。

  4. Keycloak 會驗證使用者身分,並建立身分存取令牌。Keycloak 使用回呼 URL 重新導向至應用程式,並額外將身分存取令牌新增為回呼 URL 中的查詢參數。

  5. 應用程式會從回呼 URL 中提取身分存取令牌。

資源擁有者密碼憑證授權(直接存取授權)

REST 客戶端使用直接存取授權來代表使用者取得令牌。它是一個 HTTP POST 請求,其中包含

  • 使用者的憑證。憑證會以表單參數傳送。

  • 客戶端的 ID。

  • 客戶端的密碼(如果它是機密客戶端)。

HTTP 回應包含身分存取重新整理令牌。

客戶端憑證授權

客戶端憑證授權會根據與客戶端關聯的服務帳戶的中繼資料和權限建立令牌,而不是取得代表外部使用者運作的令牌。REST 客戶端會使用客戶端憑證授權

如需更多資訊,請參閱服務帳戶章節。

重新整理令牌授權

預設情況下,Keycloak 會從大多數流程的令牌回應中傳回重新整理令牌。一些例外情況是上述的隱式流程或客戶端憑證授權。

重新整理令牌與 SSO 瀏覽器工作階段的使用者工作階段相關聯,並且在使用者工作階段的生命週期內可能有效。但是,該客戶端應至少以每個指定的時間間隔傳送一次重新整理令牌請求。否則,工作階段可能會被視為「閒置」並可能過期。如需更多資訊,請參閱逾時章節

Keycloak 支援離線令牌,通常可以在客戶端即使在對應的瀏覽器 SSO 工作階段已過期的情況下,仍需要使用重新整理令牌時使用。

重新整理令牌輪替

可以指定一旦使用重新整理令牌,便將其視為無效。這表示客戶端必須始終從上次重新整理回應中儲存重新整理令牌,因為 Keycloak 不會再將已使用的較舊重新整理令牌視為有效。可以使用逾時章節中指定的撤銷重新整理令牌選項來設定此選項。

Keycloak 也支援不存在重新整理令牌輪替的情況。在這種情況下,會在登入期間傳回重新整理令牌,但來自重新整理令牌請求的後續回應不會傳回新的重新整理令牌。例如,建議在 保護應用程式章節的 FAPI 2 草案規格中使用此作法。在 Keycloak 中,可以使用 客戶端原則跳過重新整理令牌輪替。您可以將執行器 suppress-refresh-token-rotation 新增至某些客戶端設定檔,並設定客戶端原則以指定將觸發設定檔的客戶端,這表示將跳過這些客戶端的重新整理令牌輪替。

裝置授權授權

連線至網際網路的裝置上的客戶端使用此授權,這些裝置的輸入能力有限或缺乏合適的瀏覽器。以下是協定的簡要摘要

  1. 應用程式向 Keycloak 請求裝置代碼和使用者代碼。Keycloak 會建立裝置代碼和使用者代碼。Keycloak 會傳回包含裝置代碼和使用者代碼的回應給應用程式。

  2. 應用程式為使用者提供使用者代碼和驗證 URI。使用者存取驗證 URI,以便使用其他瀏覽器進行身分驗證。您可以定義一個簡短的 verification_uri,該 URI 將重新導向至 Keycloak 驗證 URI (/realms/realm_name/device),Keycloak 外部 - 例如在 Proxy 中。

  3. 應用程式會重複輪詢 Keycloak,以找出使用者是否完成使用者授權。如果使用者驗證完成,應用程式會將裝置代碼交換為身分存取重新整理權杖。

用戶端啟動的後端通道驗證授權

此功能由想要直接與 OpenID 提供者通訊來啟動驗證流程的用戶端使用,而無需像 OAuth 2.0 的授權碼授權那樣透過使用者的瀏覽器重新導向。以下是協定的簡要摘要

  1. 用戶端會向 Keycloak 請求一個 auth_req_id,用於識別用戶端發出的驗證請求。Keycloak 會建立 auth_req_id。

  2. 收到此 auth_req_id 後,此用戶端需要重複輪詢 Keycloak,以從 Keycloak 取得存取權杖、重新整理權杖和 ID 權杖,以換取 auth_req_id,直到使用者通過驗證為止。

管理員可以針對每個 realm 將用戶端啟動的後端通道驗證 (CIBA) 相關操作配置為 CIBA 政策

此外,請參閱 Keycloak 文件中的其他位置,例如保護應用程式章節中的 後端通道驗證端點用戶端啟動的後端通道驗證授權

CIBA 政策

管理員會在 管理主控台 上執行以下操作

  • 開啟 驗證 → CIBA 政策 標籤。

  • 設定項目並按一下 儲存

可設定的項目及其描述如下。

設定 說明

後端通道權杖傳遞模式

指定 CD (消費裝置) 如何取得驗證結果和相關權杖。有三種模式:「輪詢 (poll)」、「ping」和「推送 (push)」。Keycloak 僅支援「輪詢 (poll)」。預設設定為「輪詢 (poll)」。此設定為必要。如需更多詳細資訊,請參閱 CIBA 規格

到期時間

自收到驗證請求以來,「auth_req_id」的到期時間,以秒為單位。預設設定為 120。此設定為必要。如需更多詳細資訊,請參閱 CIBA 規格

間隔

CD (消費裝置) 在輪詢權杖端點的請求之間需要等待的間隔時間,以秒為單位。預設設定為 5。此設定為選填。如需更多詳細資訊,請參閱 CIBA 規格

要求驗證的使用者提示

識別正在請求驗證的最終使用者的方式。預設設定為「login_hint」。有三種模式:「login_hint」、「login_hint_token」和「id_token_hint」。Keycloak 僅支援「login_hint」。此設定為必要。如需更多詳細資訊,請參閱 CIBA 規格

提供者設定

CIBA 授權使用以下兩個提供者。

  1. 驗證通道提供者:提供 Keycloak 與實際透過 AD (驗證裝置) 驗證使用者的實體之間的通訊。

  2. 使用者解析器提供者:從用戶端提供的資訊取得 Keycloak 的 UserModel,以識別使用者。

Keycloak 有預設的提供者。但是,管理員需要像這樣設定驗證通道提供者

kc.[sh|bat] start --spi-ciba-auth-channel-ciba-http-auth-channel-http-authentication-channel-uri=https://backend.internal.example.com

可設定的項目及其描述如下。

設定 說明

http-authentication-channel-uri

指定實際透過 AD (驗證裝置) 驗證使用者的實體的 URI。

驗證通道提供者

CIBA 標準文件並未指定如何透過 AD 驗證使用者。因此,可能會由產品自行決定實作方式。Keycloak 將此驗證委派給外部驗證實體。為了與驗證實體通訊,Keycloak 提供驗證通道提供者。

Keycloak 的實作假設驗證實體在 Keycloak 管理員的控制之下,因此 Keycloak 信任驗證實體。不建議使用 Keycloak 管理員無法控制的驗證實體。

驗證通道提供者是以 SPI 提供者的形式提供,以便 Keycloak 的使用者可以實作自己的提供者以滿足其環境需求。Keycloak 提供其預設提供者,稱為 HTTP 驗證通道提供者,該提供者使用 HTTP 與驗證實體通訊。

如果 Keycloak 的使用者想要使用 HTTP 驗證通道提供者,他們需要了解 Keycloak 與驗證實體之間的合約,該合約包含以下兩個部分。

驗證委派請求/回應

Keycloak 將驗證請求傳送至驗證實體。

驗證結果通知/ACK

驗證實體會將驗證結果通知 Keycloak。

驗證委派請求/回應包含以下訊息。

驗證委派請求

該請求從 Keycloak 傳送至驗證實體,要求其透過 AD 進行使用者驗證。

POST [delegation_reception]
  • 標頭

名稱 說明

Content-Type

application/json

訊息本文為 JSON 格式。

Authorization

Bearer [token]

[token] 用於驗證實體將驗證結果通知 Keycloak 時。

  • 參數

類型 名稱 說明

路徑

delegation_reception

驗證實體提供的端點,用於接收委派請求

  • 本文

名稱 說明

login_hint

它會告知驗證實體由 AD 驗證的使用者是誰。
依預設,這是使用者的「使用者名稱」。
此欄位為必要,並由 CIBA 標準文件定義。

scope

它會告知驗證實體從已驗證使用者取得同意的範圍。
此欄位為必要,並由 CIBA 標準文件定義。

is_consent_required

它會顯示驗證實體是否需要取得已驗證使用者關於範圍的同意。
此欄位為必要。

binding_message

其值旨在顯示在 CD 和 AD 的 UI 中,以讓使用者識別出 AD 的驗證是由 CD 觸發的。
此欄位為選填,並由 CIBA 標準文件定義。

acr_values

它會告知來自 CD 的要求驗證內容類別參考。
此欄位為選填,並由 CIBA 標準文件定義。

驗證委派回應

該回應從驗證實體返回至 Keycloak,以通知 Keycloak 驗證實體已收到驗證請求。

  • 回應

HTTP 狀態碼 說明

201

它會通知 Keycloak 已收到驗證委派請求。

驗證結果通知/ACK 包含以下訊息。

驗證結果通知

驗證實體會將驗證請求的結果傳送至 Keycloak。

POST /realms/[realm]/protocol/openid-connect/ext/ciba/auth/callback
  • 標頭

名稱 說明

Content-Type

application/json

訊息本文為 JSON 格式。

Authorization

Bearer [token]

[token] 必須是驗證實體在驗證委派請求中從 Keycloak 收到的權杖。

  • 參數

類型 名稱 說明

路徑

realm

realm 名稱

  • 本文

名稱 說明

status

它會告知透過 AD 進行使用者驗證的結果。
它必須是以下其中一種狀態。
SUCCEED:AD 的驗證已成功完成。
UNAUTHORIZED:AD 的驗證尚未完成。
CANCELLED:AD 的驗證已由使用者取消。

驗證結果 ACK

該回應從 Keycloak 返回至驗證實體,以通知 Keycloak 已從驗證實體收到 AD 的使用者驗證結果。

  • 回應

HTTP 狀態碼 說明

200

它會通知驗證實體已收到驗證結果的通知。

使用者解析器提供者

即使是同一個使用者,其表示方式在每個 CD、Keycloak 和驗證實體中可能不同。

為了讓 CD、Keycloak 和驗證實體識別同一個使用者,此使用者解析器提供者會在它們之間轉換其自己的使用者表示方式。

使用者解析器提供者是以 SPI 提供者的形式提供,以便 Keycloak 的使用者可以實作自己的提供者以滿足其環境需求。Keycloak 提供其預設提供者,稱為預設使用者解析器提供者,其具有以下特性。

  • 僅支援 login_hint 參數,並用作預設值。

  • Keycloak 中 UserModel 的 username 用於表示 CD、Keycloak 和驗證實體上的使用者。

OIDC 登出

OIDC 有四個與登出機制相關的規格

同樣地,由於所有這些都在 OIDC 規格中說明,我們在此僅提供簡要概述。

工作階段管理

這是基於瀏覽器的登出。應用程式會定期從 Keycloak 取得工作階段狀態資訊。當工作階段在 Keycloak 終止時,應用程式會注意到並觸發其自己的登出。

RP 啟動的登出

這也是基於瀏覽器的登出,登出會先將使用者重新導向至 Keycloak 的特定端點。當使用者按一下先前使用 Keycloak 驗證使用者的某些應用程式頁面上的 登出 連結時,通常會發生此重新導向。

一旦使用者被重新導向至登出端點,Keycloak 將會向用戶端傳送登出請求,以讓它們使本地使用者工作階段失效,並可能會在登出流程完成後將使用者重新導向至某些 URL。如果未使用 id_token_hint 參數,則可能會選擇性地要求使用者確認登出。登出後,只要提供了 post_logout_redirect_uri 作為參數,使用者就會自動重新導向至指定的 post_logout_redirect_uri。請注意,如果包含 post_logout_redirect_uri,則需要包含 client_idid_token_hint 參數。此外,post_logout_redirect_uri 參數需要與用戶端組態中指定的其中一個 有效登出後重新導向 URI 相符。

根據用戶端組態,可以透過前端通道或後端通道將登出請求傳送至用戶端。對於依賴前一節中描述的工作階段管理的前端瀏覽器用戶端,Keycloak 不需要向它們傳送任何登出請求;這些用戶端會自動偵測到瀏覽器中的 SSO 工作階段已登出。

前端通道登出

若要設定用戶端以透過前端通道接收登出請求,請查看 前端通道登出 用戶端設定。使用此方法時,請考慮以下事項

  • Keycloak 傳送至用戶端的登出請求依賴於瀏覽器和為登出頁面呈現的內嵌 iframes

  • 由於基於 iframes,前端通道登出可能會受到內容安全策略 (CSP) 的影響,並且登出請求可能會被封鎖。

  • 如果使用者在呈現登出頁面之前或在實際將登出請求傳送至用戶端之前關閉瀏覽器,則他們在用戶端上的工作階段可能不會失效。

請考慮使用後端通道登出,因為它提供更可靠且安全的方法來登出使用者並終止他們在用戶端上的工作階段。

如果用戶端未啟用前通道登出,Keycloak 將會先嘗試使用後通道登出 URL,透過後通道傳送登出請求。如果未定義,伺服器將會改用管理 URL

後通道登出

這是一種非基於瀏覽器的登出方式,它使用 Keycloak 和用戶端之間的直接後通道通訊。Keycloak 會傳送一個包含登出令牌的 HTTP POST 請求給所有已登入 Keycloak 的用戶端。這些請求會傳送到 Keycloak 上註冊的後通道登出 URL,並預期在用戶端觸發登出。

Keycloak 伺服器 OIDC URI 端點

以下是 Keycloak 發佈的 OIDC 端點清單。當非 Keycloak 用戶端介面卡使用 OIDC 與驗證伺服器通訊時,可以使用這些端點。它們都是相對 URL。URL 的根目錄包含 HTTP(S) 協定、主機名稱,以及可選的路徑。例如:

https://127.0.0.1:8080
/realms/{realm-name}/protocol/openid-connect/auth

用於在授權碼流程中取得臨時程式碼,或使用隱式流程、直接授權或用戶端授權取得令牌。

/realms/{realm-name}/protocol/openid-connect/token

由授權碼流程使用,將臨時程式碼轉換為令牌。

/realms/{realm-name}/protocol/openid-connect/logout

用於執行登出。

/realms/{realm-name}/protocol/openid-connect/userinfo

用於 OIDC 規範中描述的使用者資訊服務。

/realms/{realm-name}/protocol/openid-connect/revoke

用於 RFC7009 中描述的 OAuth 2.0 令牌撤銷。

/realms/{realm-name}/protocol/openid-connect/certs

用於包含驗證任何 JSON Web 令牌 (jwks_uri) 所需公鑰的 JSON Web 金鑰集 (JWKS)。

/realms/{realm-name}/protocol/openid-connect/auth/device

用於裝置授權許可,以取得裝置程式碼和使用者程式碼。

/realms/{realm-name}/protocol/openid-connect/ext/ciba/auth

這是用戶端啟動後通道驗證許可的 URL 端點,用於取得 auth_req_id,以識別用戶端發出的驗證請求。

/realms/{realm-name}/protocol/openid-connect/logout/backchannel-logout

這是執行 OIDC 規範中描述的後通道登出的 URL 端點。

在所有這些 URL 中,請將 {realm-name} 替換為網域的名稱。

SAML

SAML 2.0 是一個與 OIDC 類似但更成熟的規範。它源自 SOAP 和 Web 服務訊息傳遞規範,因此通常比 OIDC 更冗長。SAML 2.0 是一種驗證協定,在驗證伺服器和應用程式之間交換 XML 文件。XML 簽章和加密用於驗證請求和回應。

一般而言,SAML 實作了兩種使用案例。

第一種使用案例是應用程式請求 Keycloak 伺服器驗證使用者。成功登入後,應用程式將收到一個 XML 文件。此文件包含一個 SAML 斷言,其中指定了使用者屬性。網域會數位簽署該文件,其中包含存取資訊(例如使用者角色對應),應用程式會使用這些資訊來判斷允許使用者在應用程式中存取的資源。

第二種使用案例是用戶端存取遠端服務。用戶端會從 Keycloak 請求 SAML 斷言,代表使用者叫用遠端服務。

SAML 繫結

Keycloak 支援三種繫結類型。

重新導向繫結

重新導向繫結使用一系列瀏覽器重新導向 URI 來交換資訊。

  1. 使用者使用瀏覽器連線到應用程式。應用程式偵測到使用者尚未通過驗證。

  2. 應用程式會產生一個 XML 驗證請求文件,並將其編碼為 URI 中的查詢參數。此 URI 用於重新導向至 Keycloak 伺服器。根據您的設定,應用程式也可以數位簽署 XML 文件,並將簽章作為重新導向至 Keycloak 的 URI 中的查詢參數。此簽章用於驗證傳送請求的用戶端。

  3. 瀏覽器會重新導向至 Keycloak。

  4. 伺服器會擷取 XML 驗證請求文件,並驗證數位簽章(如果需要)。

  5. 使用者輸入其驗證憑證。

  6. 驗證後,伺服器會產生一個 XML 驗證回應文件。該文件包含一個 SAML 斷言,其中保留有關使用者的中繼資料,包括姓名、地址、電子郵件以及使用者擁有的任何角色對應。該文件通常會使用 XML 簽章進行數位簽署,並且也可以加密。

  7. XML 驗證回應文件會編碼為重新導向 URI 中的查詢參數。該 URI 會將瀏覽器帶回應用程式。數位簽章也會包含為查詢參數。

  8. 應用程式會收到重新導向 URI 並擷取 XML 文件。

  9. 應用程式會驗證網域的簽章,以確保它收到有效的驗證回應。SAML 斷言內的資訊用於做出存取決策或顯示使用者資料。

POST 繫結

POST 繫結與重新導向繫結類似,但 POST 繫結使用 POST 請求而非 GET 請求來交換 XML 文件。POST 繫結使用 JavaScript 使瀏覽器在交換文件時向 Keycloak 伺服器或應用程式傳送 POST 請求。HTTP 以 HTML 文件回應,其中包含一個含有嵌入式 JavaScript 的 HTML 表單。當頁面載入時,JavaScript 會自動叫用表單。

由於以下兩個限制,建議使用 POST 繫結

  • 安全性 — 使用重新導向繫結時,SAML 回應是 URL 的一部分。它比較不安全,因為有可能在記錄中擷取到回應。

  • 大小 — 在 HTTP 酬載中傳送文件比在有限的 URL 中提供更大的資料量範圍。

ECP

增強型用戶端或代理 (ECP) 是一種 SAML v.2.0 設定檔,允許在 Web 瀏覽器內容之外交換 SAML 屬性。它通常由基於 REST 或 SOAP 的用戶端使用。

Keycloak 伺服器 SAML URI 端點

Keycloak 對所有 SAML 請求都有一個端點。

http(s)://authserver.host/realms/{realm-name}/protocol/saml

所有繫結都使用此端點。

OpenID Connect 與 SAML 的比較

以下列出選擇協定時要考慮的一些因素。

對於大多數用途,Keycloak 建議使用 OIDC。

OIDC

  • OIDC 專為 Web 設計。

  • OIDC 適用於 HTML5/JavaScript 應用程式,因為它比 SAML 更容易在用戶端實作。

  • OIDC 令牌是 JSON 格式,這使得 JavaScript 更容易取用。

  • OIDC 具有使安全性實作更容易的功能。例如,請參閱規格用來判斷使用者登入狀態的iframe 技巧

SAML

  • SAML 設計為在 Web 之上運作的一層。

  • SAML 可能比 OIDC 更冗長。

  • 使用者選擇 SAML 而非 OIDC,是因為人們認為它更成熟。

  • 使用者選擇 SAML 而非 OIDC,是因為現有的應用程式是透過它來保護的。

Docker 登錄檔 v2 驗證

Docker 驗證預設為停用。若要啟用 Docker 驗證,請參閱啟用和停用功能指南。

Docker 登錄檔 V2 驗證是一種與 OIDC 類似的協定,可針對 Docker 登錄檔驗證使用者。Keycloak 對此協定的實作讓 Docker 用戶端可以使用 Keycloak 驗證伺服器針對登錄檔進行驗證。此協定使用標準的令牌和簽章機制,但它確實偏離了真正的 OIDC 實作。它會偏離的原因是,它對請求和回應使用非常特定的 JSON 格式,並將存放庫名稱和權限對應到 OAuth 範圍機制。

Docker 驗證流程

驗證流程在Docker API 文件中描述。以下是從 Keycloak 驗證伺服器的角度來看的摘要

  • 執行 docker login

  • Docker 用戶端會從 Docker 登錄檔請求資源。如果資源受到保護,且請求中沒有驗證令牌,則 Docker 登錄檔伺服器會以 401 HTTP 訊息回應,其中包含一些關於所需權限和授權伺服器位置的資訊。

  • Docker 用戶端會根據 Docker 登錄檔的 401 HTTP 訊息建構驗證請求。用戶端會使用本機快取的憑證(來自 docker login 命令)作為 HTTP 基本驗證請求的一部分,傳送至 Keycloak 驗證伺服器。

  • Keycloak 驗證伺服器會嘗試驗證使用者,並傳回包含 OAuth 樣式持有人令牌的 JSON 主體。

  • Docker 用戶端會從 JSON 回應接收持有人令牌,並在授權標頭中使用它來請求受保護的資源。

  • Docker 登錄伺服器接收來自 Keycloak 伺服器、帶有權杖的受保護資源新請求。登錄伺服器會驗證權杖,並授與對請求資源的存取權(如果適當)。

在透過 Docker 通訊協定成功驗證後,Keycloak 不會建立瀏覽器 SSO 會話。瀏覽器 SSO 會話不使用 Docker 通訊協定,因為它無法重新整理權杖或從 Keycloak 伺服器取得權杖或會話的狀態;因此,瀏覽器 SSO 會話不是必要的。如需更多詳細資訊,請參閱暫時性會話章節。

Keycloak Docker Registry v2 驗證伺服器 URI 端點

Keycloak 為所有 Docker auth v2 請求提供一個端點。

http(s)://authserver.host/realms/{realm-name}/protocol/docker-v2/auth

控制管理主控台的存取權

在 Keycloak 上建立的每個領域都有一個專用的管理主控台,可從該主控台管理該領域。master 領域是一個特殊領域,允許管理員管理系統上的多個領域。您也可以定義對不同領域中使用者更精細的存取權,以管理伺服器。本章將介紹所有關於此的案例。

主領域存取控制

Keycloak 中的 master 領域是一個特殊領域,與其他領域的處理方式不同。可以授予 Keycloak master 領域中的使用者管理 Keycloak 伺服器上部署的零個或多個領域的權限。建立領域時,Keycloak 會自動建立各種角色,授予對該新領域的精細存取權。可以透過將這些角色對應到 master 領域中的使用者來控制對管理主控台和管理 REST 端點的存取。可以建立多個超級使用者,以及只能管理特定領域的使用者。

全域角色

master 領域中有兩個領域層級的角色。它們是

  • admin

  • create-realm

具有 admin 角色的使用者是超級使用者,並且具有管理伺服器上任何領域的完全存取權。具有 create-realm 角色的使用者可以建立新領域。他們將被授予對他們建立的任何新領域的完全存取權。

領域特定角色

master 領域中的管理使用者可以被授予對系統中一個或多個其他領域的管理權限。Keycloak 中的每個領域都由 master 領域中的一個用戶端表示。用戶端的名稱為 <領域名稱>-realm。這些用戶端各自定義了用戶端層級的角色,這些角色定義了管理個別領域的不同存取層級。

可用的角色為

  • view-realm

  • view-users

  • view-clients

  • view-events

  • manage-realm

  • manage-users

  • create-client

  • manage-clients

  • manage-events

  • view-identity-providers

  • manage-identity-providers

  • impersonation

將您想要的角色指派給您的使用者,他們將只能使用管理主控台的特定部分。

具有 manage-users 角色的管理員將只能將管理員角色指派給他們自己擁有的使用者。因此,如果管理員具有 manage-users 角色,但不具有 manage-realm 角色,則他們將無法指派此角色。

專用領域管理主控台

每個領域都有一個專用的管理主控台,可透過前往 URL /admin/{realm-name}/console 來存取。可以透過指派特定的使用者角色對應,授予該領域內的使用者領域管理權限。

每個領域都有一個稱為 realm-management 的內建用戶端。您可以透過前往領域的 Clients 左側選單項目來檢視此用戶端。此用戶端定義了用戶端層級的角色,這些角色指定了可以授予管理領域的權限。

  • view-realm

  • view-users

  • view-clients

  • view-events

  • manage-realm

  • manage-users

  • create-client

  • manage-clients

  • manage-events

  • view-identity-providers

  • manage-identity-providers

  • impersonation

將您想要的角色指派給您的使用者,他們將只能使用管理主控台的特定部分。

精細的管理權限

精細的管理權限是預覽功能,尚未完全支援。此功能預設為停用。

若要啟用,請使用 --features=preview--features=admin-fine-grained-authz 啟動伺服器

有時 manage-realmmanage-users 等角色太過粗略,您需要建立具有更精細權限的受限管理帳戶。Keycloak 允許您定義和指派受限的存取原則,以管理領域。例如:

  • 管理一個特定的用戶端

  • 管理屬於特定群組的使用者

  • 管理群組的成員資格

  • 有限的使用者管理。

  • 精細的模擬控制

  • 能夠將特定受限的角色集指派給使用者。

  • 能夠將特定受限的角色集指派給複合角色。

  • 能夠將特定受限的角色集指派給用戶端的範圍。

  • 檢視和管理使用者、群組、角色和用戶端的新一般原則。

關於精細的管理權限,有一些重要的注意事項

  • 精細的管理權限是實作在授權服務之上。強烈建議您先閱讀這些功能的相關資訊,再深入了解精細權限。

  • 精細權限僅在專用管理主控台和這些領域中定義的管理員中可用。您無法定義跨領域的精細權限。

  • 精細權限是用於授予其他權限。您無法覆寫內建管理角色的預設行為。

管理一個特定用戶端

首先,讓我們看看如何允許管理員只管理一個用戶端。在我們的範例中,我們有一個名為 test 的領域和一個名為 sales-application 的用戶端。在 test 領域中,我們將授與該領域中的使用者只管理該應用程式的權限。

您無法執行跨領域的精細權限。master 領域中的管理員僅限於先前章節中定義的預定義管理角色。
權限設定

我們必須做的第一件事是登入管理主控台,以便我們可以為該用戶端設定權限。我們瀏覽到要定義精細權限的用戶端的管理區段。

用戶端管理

Fine grain client

您應該會看到一個名為 Permissions 的索引標籤選單項目。按一下該索引標籤。

用戶端權限索引標籤

Fine grain client permissions tab

預設情況下,每個用戶端都未啟用執行精細權限。因此,請將 Permissions Enabled 開關切換為開啟,以初始化權限。

如果您將 Permissions Enabled 開關切換為關閉,它將刪除您為此用戶端定義的所有權限。
用戶端權限索引標籤

Fine grain permission tab

當您將 Permissions Enabled 切換為開啟時,它會使用授權服務在幕後初始化各種權限物件。在此範例中,我們對用戶端的 manage 權限感興趣。按一下該權限會將您重新導向至處理該用戶端 manage 權限的權限。所有授權物件都包含在 realm-management 用戶端的 Authorization 索引標籤中。

用戶端管理權限

Fine grain client manage permission

首次初始化時,manage 權限沒有任何相關的原則。您需要透過前往原則索引標籤來建立一個原則。若要快速前往,請按一下上圖中顯示的 Client details 連結。然後按一下原則索引標籤。

在此頁面上,尋找 Create client policy 按鈕,您可以使用該按鈕定義許多原則。您可以定義與角色或群組相關聯的原則,甚至可以在 JavaScript 中定義規則。在此簡單範例中,我們將建立 User Policy

使用者原則

Fine grain client user policy

此原則將比對使用者資料庫中硬式編碼的使用者。在此案例中,它是 sales-admin 使用者。然後,我們必須返回 sales-application 用戶端的 manage 權限頁面,並將該原則指派給權限物件。

指派使用者原則

Fine grain client assign user policy

現在,sales-admin 使用者具有管理 sales-application 用戶端的權限。

我們還需要做一件事。前往 Users,選取 sales-admin 使用者,然後前往 Role Mappings 索引標籤,並將 query-clients 角色指派給該使用者。

指派 query-clients

Fine grain assign query clients

為什麼您必須這樣做?此角色會告知管理主控台當 sales-admin 瀏覽管理主控台時要轉譯哪些選單項目。query-clients 角色會告知管理主控台,它應為 sales-admin 使用者轉譯用戶端選單。

重要事項 如果您未設定 query-clients 角色,受限的管理員(如 sales-admin)在登入管理主控台時將不會看到任何選單選項

測試

接下來,我們登出主領域,然後使用 sales-admin 作為使用者名稱,重新登入 test 領域的專用管理主控台。此位置位於 /admin/test/console 下。

銷售管理員登入

Fine grain sales admin login

現在,此管理員可以管理這一個用戶端。

限制使用者角色對應

您可能想要做的另一件事是限制管理員允許指派給使用者的角色集。繼續我們的上一個範例,讓我們擴展 'sales-admin' 使用者的權限集,使其也可以控制哪些使用者可以存取此應用程式。透過精細的權限,我們可以啟用它,以便 sales-admin 只能指派授予特定存取權給 sales-application 的角色。我們也可以限制它,使管理員只能對應角色,而不能執行任何其他類型的使用者管理。

sales-application 已定義三個不同的用戶端角色。

銷售應用程式角色

Fine grain sales application roles

我們希望 sales-admin 使用者能夠將這些角色對應到系統中的任何使用者。這樣做的第一步是允許管理員對應角色。如果我們按一下 viewLeads 角色,您會看到此角色有一個 Permissions 索引標籤。

檢視潛在客戶角色權限索引標籤

Fine grain view leads role

如果我們點擊該分頁並開啟「權限已啟用」,您會看到我們可以對許多操作套用政策。

檢視潛在客戶權限

Fine grain view leads permissions

我們感興趣的是 map-role。點擊此權限,並新增與先前範例中建立的相同使用者政策。

映射角色權限

Fine grain map roles permission

我們所做的是設定 sales-admin 可以映射 viewLeads 角色。我們尚未指定管理員允許將此角色映射到哪些使用者。為此,我們必須前往此領域的管理控制台的「使用者」區段。點擊左側選單中的「使用者」項目,將我們帶到該領域的使用者介面。您應該會看到「權限」分頁。點擊該分頁並啟用它。

使用者權限

Fine grain user permissions

我們感興趣的權限是 map-roles。這是一項限制性政策,只允許管理員將角色映射到使用者。如果我們點擊 map-roles 權限,並再次新增我們為此建立的使用者政策,我們的 sales-admin 將能夠將角色映射到任何使用者。

我們要做的最後一件事是將 view-users 角色新增到 sales-admin。這將允許管理員檢視他想要新增 sales-application 角色的領域中的使用者。

新增檢視使用者

Fine grain add view users

測試一下

接下來,我們登出主領域,然後使用 sales-admin 作為使用者名稱,重新登入 test 領域的專用管理主控台。此位置位於 /admin/test/console 下。

您會看到現在 sales-admin 可以檢視系統中的使用者。如果您選擇其中一位使用者,您會看到每個使用者的詳細資訊頁面都是唯讀的,除了「角色映射」分頁。進入此分頁後,您會發現沒有可供管理員映射到使用者的「可用」角色,除非我們瀏覽 sales-application 角色。

指派 viewLeads

Fine grain add view leads

我們僅指定 sales-admin 可以映射 viewLeads 角色。

每個用戶端映射角色捷徑

如果我們必須針對 sales-application 發佈的每個用戶端角色都執行此操作,那將會很繁瑣。為了讓事情更輕鬆,有一種方法可以指定管理員可以映射用戶端定義的任何角色。如果我們登入回到主要領域管理員的管理控制台,並回到 sales-application 權限頁面,您會看到 map-roles 權限。

用戶端映射角色權限

Fine grain client permissions

如果您授予管理員存取此特定權限,該管理員將能夠映射用戶端定義的任何角色。

完整權限清單

除了管理特定用戶端或用戶端的特定角色之外,您還可以透過精細的權限做更多事情。本章定義了可以針對領域描述的完整權限類型清單。

角色

當您前往特定角色的「權限」分頁時,您會看到列出的這些權限類型。

map-role

決定管理員是否可以將此角色映射到使用者的政策。這些政策僅指定該角色可以映射到使用者,而不是管理員被允許執行使用者角色映射工作。管理員還必須擁有管理或角色映射權限。請參閱 使用者權限 以取得更多資訊。

map-role-composite

決定管理員是否可以將此角色以複合角色映射到另一個角色的政策。如果管理員必須管理該用戶端的權限,則他可以為該用戶端定義角色,但他將無法將複合角色新增到這些角色,除非他擁有他想要新增為複合角色的 map-role-composite 權限。

map-role-client-scope

決定管理員是否可以將此角色套用到用戶端範圍的政策。即使管理員可以管理用戶端,除非授予此權限,否則他將沒有權限為該用戶端建立包含此角色的權杖。

用戶端

當您前往特定用戶端的「權限」分頁時,您會看到列出的這些權限類型。

view

決定管理員是否可以檢視用戶端配置的政策。

manage

決定管理員是否可以檢視和管理用戶端配置的政策。這方面存在一些問題,因為可能會無意中洩漏權限。例如,即使管理員沒有權限將角色映射到用戶端的範圍,管理員也可以定義一個硬編碼角色的協定映射器。這是目前協定映射器的限制,因為它們沒有像角色那樣為它們分配個別權限的方法。

configure

用於管理用戶端的精簡權限集。它類似於 manage 範圍,但管理員不允許定義協定映射器、變更用戶端範本或用戶端的範圍。

map-roles

決定管理員是否可以將用戶端定義的任何角色映射到使用者的政策。這是一個捷徑、易於使用的功能,可避免為用戶端定義的每個角色都必須定義政策。

map-roles-composite

決定管理員是否可以將用戶端定義的任何角色以複合角色映射到另一個角色的政策。這是一個捷徑、易於使用的功能,可避免為用戶端定義的每個角色都必須定義政策。

map-roles-client-scope

決定管理員是否可以將用戶端定義的任何角色映射到另一個用戶端範圍的政策。這是一個捷徑、易於使用的功能,可避免為用戶端定義的每個角色都必須定義政策。

使用者

當您前往所有使用者的「權限」分頁時,您會看到列出的這些權限類型。

view

決定管理員是否可以檢視領域中所有使用者的政策。

manage

決定管理員是否可以管理領域中所有使用者的政策。此權限授予管理員執行使用者角色映射的權限,但它沒有指定允許管理員映射哪些角色。您需要為您希望管理員能夠映射的每個角色定義權限。

map-roles

這是 manage 範圍授予的權限的子集。在這種情況下,只允許管理員映射角色。不允許管理員執行任何其他使用者管理操作。此外,與 manage 一樣,管理員允許套用的角色必須按角色指定,或者在處理用戶端角色時按角色集指定。

manage-group-membership

map-roles 類似,但它與群組成員資格有關:可以將使用者新增到哪些群組或從哪些群組中移除。這些政策僅授予管理員管理群組成員資格的權限,而不是允許管理員管理成員資格的群組。您必須為每個群組的 manage-members 權限指定政策。

impersonate

決定是否允許管理員模擬其他使用者的政策。這些政策會套用到管理員的屬性和角色映射。

user-impersonated

決定可以模擬哪些使用者的政策。這些政策將套用到被模擬的使用者。例如,您可能想要定義一項政策,禁止任何人模擬具有管理員權限的使用者。

群組

當您前往特定群組的「權限」分頁時,您會看到列出的這些權限類型。

view

決定管理員是否可以檢視群組相關資訊的政策。

manage

決定管理員是否可以管理群組設定的政策。

view-members

決定管理員是否可以檢視群組成員的使用者詳細資訊的政策。

manage-members

決定管理員是否可以管理屬於此群組的使用者的政策。

manage-membership

決定管理員是否可以變更群組成員資格的政策。從群組新增或移除成員。

管理組織

當與客戶或業務合作夥伴等第三方整合時,您可能希望將他們的身份與其他人分開管理,並在他們與領域互動時,在您的整個業務生態系統中建立統一且安全的體驗。

在領域中,組織代表這些第三方,以便領域或組織管理員可以管理其成員的整個生命週期,以及他們如何以每個組織為基礎,向領域進行驗證和授權。

組織是開始使用 Keycloak 的 IAM 功能來解決企業對企業 (B2B) 用例的起點。它在領域內啟用多租戶,以便使用者可以從領域存取受保護的資源,但具有更受限制和控制的內容,該內容是他們所屬的組織。

Keycloak 組織是一項功能,可在 Keycloak 中啟用對組織的支援。目前,它提供管理組織所需的一些核心功能,例如

  • 管理成員

  • 使用邀請連結加入組織成員

  • 透過身份仲介聯合其身份來加入組織成員

  • 在組織範圍內進行驗證時的身份優先登入和組織特定步驟

  • 為了授權目的,透過權杖將組織特定的宣告傳播到應用程式

在 Keycloak 中啟用組織

要使用組織,您必須為目前的領域啟用此功能。

程序
  1. 在選單中點擊領域設定

  2. 組織切換為開啟

  3. 點擊「儲存

啟用組織

Enabling Organizations

一旦啟用此功能,您就可以透過選單中可用的組織區段來管理組織。

管理組織

組織區段,您可以管理您領域中的所有組織。

管理組織

Managing organizations

建立組織

程序
  1. 點擊建立組織

建立組織

Creating organization

組織具有以下設定

名稱

組織的使用者友善名稱。該名稱在領域內是唯一的。

別名

此組織的別名,用於在內部引用組織。別名在領域內是唯一的,並且必須與 URL 相容,因此 URL 中通常不允許的字元將不允許在別名中使用。如果未設定,Keycloak 將嘗試使用名稱作為別名。如果名稱與 URL 不相容,您將收到錯誤,並要求您指定別名。定義後,別名無法在之後變更。

重新導向 URL

完成註冊或接受透過電子郵件傳送的組織邀請後,使用者會自動重新導向至指定的重新導向 URL。如果留空,使用者預設會被重新導向至帳戶控制台。

網域

屬於此組織的一個或多個網域集合。一個網域不能在同一個領域內被不同的組織共用。

說明

用來描述組織的自由文字欄位。

建立組織後,您可以管理以下章節中描述的其他設定

了解組織網域

在管理組織時,與組織關聯的網域在組織成員如何驗證到領域以及如何驗證其個人資料方面起著重要作用。

網域的主要作用之一是幫助識別使用者所屬的組織。透過查看他們的電子郵件地址,Keycloak 將使用相同的網域比對對應的組織,並最終根據組織需求變更驗證流程。

網域還允許組織強制規定使用者不得在其電子郵件中使用與組織無關的網域。當使用者及其身分來自與組織相關的身分提供者,並且您想要強制其電子郵件地址使用特定的電子郵件網域時,此限制尤其有用。

停用組織

要停用組織,請將「已啟用」切換為「關閉」。

停用組織

Disabling organization

當組織被停用時,您仍然可以透過管理介面來管理它,但組織成員無法驗證到領域,包括透過與該組織相關的身分提供者進行驗證,因為它們也會自動被停用。

但是,組織的非受管成員仍然可以驗證到領域,因為他們也是領域使用者,但令牌將不包含有關他們與已停用組織關係的元數據。

有關受管和非受管使用者的更多詳細資訊,請參閱受管和非受管成員章節。

刪除組織

要刪除組織,請在列表頁面或編輯組織時,點擊對應組織的「刪除」動作。

刪除組織

Deleting organization

移除組織時,所有與之相關的數據(包括任何受管成員)都將被刪除。

非受管使用者和身分提供者仍保留在領域中,但它們不再連結到該組織。

有關受管和非受管使用者的更多詳細資訊,請參閱受管和非受管成員

管理屬性

管理員可以使用屬性來儲存有關組織的其他元數據。組織屬性是一個鍵/值對,可以保存多個字串值。

為此,請點擊「屬性」標籤,並透過提供鍵和值來設定您想要的任何屬性。

要為同一個屬性和鍵提供多個值,只需新增另一個具有相同鍵但值不同的屬性即可。

管理組織屬性

Managing organization attributes

管理成員

組織成員基本上是領域使用者,但連結到單一組織。他們在邏輯上與領域中的其他使用者分開,以便您確切知道哪些使用者屬於哪個組織。

有多種方法可以將成員新增或加入到組織

  • 新增現有的領域使用者作為成員

  • 透過與組織相關的身分提供者

  • 傳送建立新帳戶的邀請

  • 傳送邀請給現有使用者加入組織

一旦成為組織的成員,該使用者的帳戶可以像領域中的任何常規帳戶一樣進行管理,方法是存取選單中的「使用者」部分。

但是,您可以透過存取管理組織時的「成員」標籤,將使用者範圍縮小到僅限於與組織相關的使用者。在此標籤中,您可以找到所有組織成員的清單,以及新增新成員和編輯及移除現有成員的操作。

管理組織成員

Managing organization members

受管和非受管成員

在管理成員時,請考量他們與組織的關係如何影響其帳戶的生命週期。成員可以透過不同的流程加入組織,每個流程都表示其帳戶與組織之間連結的強度。

成員有兩種型別

  • 受管

  • 非受管

受管成員是由組織管理的成員,它們不能在其組織之外存在。例如,考量一個透過與組織相關的身分提供者建立的帳戶。該帳戶不屬於領域,因為它是從組織聯合而來。在這種情況下,身分的單一事實來源是組織,其生命週期由組織控制。如果您移除組織或成員,該帳戶也會從領域中移除。

另一方面,非受管成員是可以不依賴組織而存在的成員。例如,當將現有領域使用者新增到組織時,該帳戶首先屬於領域,並最終連結到組織。在這種情況下,移除組織或成員不會從領域中移除該帳戶;領域是身分的單一事實來源。

將現有領域使用者新增為成員

現有的領域使用者可以從清單中選取該使用者,並將該使用者新增到組織,以加入組織。

程序
  1. 點擊「新增成員」。

  2. 點擊「新增領域使用者」。

  3. 選取一個或多個使用者,然後點擊「新增」以將其新增到組織。

新增領域使用者

Adding a realm user

一旦使用者成為組織的成員,該使用者就能像一般使用者一樣驗證到領域,並使用領域支援的任何憑證。

邀請使用者

管理員可以透過電子郵件邀請使用者加入組織。

程序
  1. 點擊「新增成員」。

  2. 點擊「邀請成員」。

  3. 提供電子郵件地址

  4. 點擊「傳送

邀請成員

Inviting members

或者,您也可以為「名字」和「姓氏」欄位提供值,以便使用包含收件人姓名問候訊息的個人化電子郵件。

邀請基本上是一封包含連結的電子郵件,使用者應點擊該連結以執行加入組織的必要步驟。這些步驟取決於該使用者是否已在領域中擁有帳戶,或者是否應在加入組織之前建立新帳戶。

如果該電子郵件對應到領域中的現有使用者,則使用者將遵循的步驟基本上是確認加入組織的意圖。

另一方面,如果沒有使用者與給定的電子郵件地址相關聯,則這些步驟將涉及透過領域的自我註冊流程建立新帳戶。在這種情況下,使用者必須提供用於傳送邀請的相同電子郵件地址。

使用身分提供者加入成員

組織可能擁有自己的身分提供者作為其身分的單一事實來源。在這種情況下,從身分提供者聯合而來的用戶會自動新增為組織的成員。

當使用者透過與組織相關的身分提供者加入組織時,他們會自動標記為受管成員。在這種情況下,他們將經歷在領域中設定的代理登入流程,並在成功驗證後自動加入組織。

透過身分提供者加入新成員可以透過以下兩種方式完成:自動將使用者重新導向到組織的身分提供者,或在登入頁面時選取身分提供者。

在這兩種情況下,一旦使用者提供電子郵件,Keycloak 將嘗試根據電子郵件網域比對組織。如果電子郵件網域與組織相符,並且身分提供者與相同的網域相關聯,並且啟用了「當電子郵件網域相符時重新導向」設定,則使用者會自動重新導向到身分提供者。一旦使用者在身分提供者處驗證並完成第一個代理登入流程,該使用者就會自動新增為組織成員。

另一方面,如果未啟用「當電子郵件網域相符時重新導向」,但身分提供者的設定為「不在登入頁面隱藏」,則使用者可以選取身分提供者,然後被重新導向到身分提供者以繼續加入流程。

有關更多詳細資訊,請參閱管理身分提供者

移除成員

您可以從組織中移除成員。

從您想要移除的成員旁邊的動作選單中,點擊「移除」。

從組織中移除成員時,請記住,根據該使用者是否為受管或非受管成員,使用者可能會或可能不會從領域中移除。

有關更多詳細資訊,請參閱受管和非受管成員

管理身分提供者

組織可能擁有自己的身分提供者作為其身分的單一事實來源。在這種情況下,您想要設定組織以使用組織的身分提供者驗證使用者、聯合其身分,並最終將其新增為組織的成員。

一個組織可以有多個與之相關的身分提供者,以便他們可以從不同的來源驗證其使用者,並對每個使用者強制執行不同的限制。

在將身分提供者連結到組織之前,您可以從選單中的「身分提供者」部分建立領域層級的組織。您可以將領域中提供的任何內建社交和身分提供者連結到組織。

將身分提供者連結到組織

您可以從 身分提供者 標籤將身分提供者連結至組織。如果已存在身分提供者,您會看到它們的清單,以及搜尋、編輯或取消與組織連結的選項。

組織身分提供者

Organization identity providers

程序
  1. 點擊 連結身分提供者

  2. 選取一個 身分提供者

  3. 設定適當的設定

  4. 點擊「儲存

正在連結身分提供者

Linking identity provider

身分提供者具有以下設定

身分提供者

您想要連結至組織的身分提供者。一個身分提供者只能連結至一個組織。

網域

您想要與身分提供者連結的組織網域。

在登入頁面隱藏

當使用者在組織範圍內進行身份驗證時,是否應在登入頁面隱藏此身分提供者。

當電子郵件網域符合時重新導向

當成員的電子郵件網域符合設定給身分提供者的網域時,是否應自動重新導向至身分提供者。

一旦連結至組織,就可以像管理 realm 中的任何其他提供者一樣,透過存取選單中的 身分提供者 區段來管理身分提供者。但是,此處描述的選項僅在組織範圍內管理身分提供者時才可用。唯一的例外是為方便起見而在此處提供的 在登入頁面隱藏 選項。

編輯已連結的身分提供者

您可以隨時編輯已連結身分提供者的任何組織相關設定。.程序

  1. 在選單中,點擊 組織 並前往 身分提供者 標籤。

  2. 在清單中找到 身分提供者

    您可以使用搜尋選項來執行此步驟。

  3. 點擊該行末尾的動作按鈕 (三個點)。

  4. 點擊 編輯

  5. 進行必要的更改。

  6. 點擊 儲存

正在編輯已連結的身分提供者

Editing linked identity provider

取消身分提供者與組織的連結

當身分提供者取消與組織的連結時,它仍然可以作為 realm 層級的提供者使用,不再與組織關聯。若要刪除已取消連結的提供者,請使用選單中的 身分提供者 區段。

程序
  1. 在選單中,點擊 組織 並前往 身分提供者 標籤。

  2. 在清單中找到 身分提供者

    您可以使用搜尋功能來執行此步驟。

  3. 點擊該行末尾的動作按鈕 (三個點)。

  4. 點擊 取消連結提供者

正在取消身分提供者的連結

Unlinking identity provider

驗證成員

當您為 realm 啟用組織時,使用者身份驗證會變更。如果使用者被識別為在組織的環境中進行身份驗證,則身份驗證流程會根據每個組織進行變更。

建立 realm 時,會自動更新身份驗證流程,以啟用特定步驟來驗證和加入組織成員。更新的身份驗證流程是

  • 瀏覽器

  • 首次代理登入

瀏覽器 流程的主要變更是預設為「身分優先登入」,以便在提示使用者輸入憑證之前先識別使用者。關於首次代理登入流程,主要變更是當使用者透過與組織關聯的身分提供者進行身份驗證並成功完成流程後,會自動將使用者新增為組織成員。

是否使用「身分優先登入」的選擇取決於 realm 中是否存在組織。如果不存在組織,使用者會依照一般步驟使用使用者名稱和密碼或在瀏覽器流程中設定的任何其他步驟進行身份驗證。否則,系統會先要求使用者提供使用者名稱或電子郵件,以繼續驗證至 realm。

「身分優先登入」的主要目標是識別使用者

  • 使用者是現有使用者還是新使用者?

  • 使用者是否是 realm 中任何組織的成員?

  • 如果是組織成員,使用者是否已連結至任何與組織關聯的身分提供者?

根據識別使用者時的結果,身份驗證流程會變更為繼續通過要求使用者提供憑證進行身份驗證,或者最終自動重新導向使用者,通過身分提供者在組織的安全範圍內進行身份驗證。

了解「身分優先登入」

除了在提供使用者名稱後識別使用者之外,「身分優先登入」也負責

  • 將電子郵件網域與組織匹配。

  • 如果已存在提供的使用者名稱帳戶,則決定是否應繼續身份驗證流程

  • 根據網域和身分提供者如何設定給組織,決定應如何對使用者進行身份驗證

  • 如果電子郵件網域與設定給身分提供者的網域匹配,則透過與組織關聯的身分提供者順暢地驗證使用者

「身分優先登入」提供與一般登入頁面相同的功能,包括使用者名稱和密碼欄位。使用者仍然可以透過點擊註冊連結自行註冊,或者選擇 realm 中未連結至組織的任何身分或社群代理。

「身分優先登入」頁面

Identity-first login page

如果使用者不存在,而該使用者嘗試使用與組織網域匹配的電子郵件網域進行身份驗證,「身分優先登入」頁面會再次出現,並顯示一則訊息,指出提供的使用者名稱無效。此時,無需要求使用者提供憑證。

當使用者不存在時的「身分優先登入」

Identity-first login error

有多種選項可以註冊使用者,讓使用者驗證至 realm 並加入組織。

如果 realm 啟用了自行註冊設定,使用者可以點擊「身分優先登入」頁面上的 註冊 連結,並在 realm 中建立帳戶。之後,管理員可以向使用者傳送邀請連結,或手動將使用者新增為組織成員。如需更多詳細資訊,請參閱管理成員

如果組織有不含網域的身分提供者,並且 在登入頁面隱藏 設定為 關閉,使用者也可以點擊「身分優先登入」頁面上的身分提供者連結,以自動建立帳戶並在透過身分提供者驗證後加入組織。如需更多詳細資訊,請參閱管理身分提供者

與前一節類似的情況下,組織可能已設定一個具有組織網域之一的身分提供者。在這種情況下,如果使用者的電子郵件與組織的特定網域匹配,則會將使用者重新導向至身分提供者。一旦流程完成,就會建立帳戶,使用者就會加入組織。

設定現有的身份驗證流程

如先前針對新 realm 所述,身份驗證流程會自動更新,並加入必要的步驟,以支援組織並驗證其成員。對於現有的 realm,除了啟用 realm 的組織之外,您還需要手動更新現有的 (自訂) 身份驗證流程。

請按照以下步驟變更 瀏覽器 流程

程序
  1. 複製目前繫結至 瀏覽器流程 繫結類型的流程,以避免中斷您目前使用的流程

  2. 點擊 新增子流程 並為其命名,例如 我的組織

  3. 將新新增的 我的組織 子流程移至 身分提供者重新導向器 執行步驟後立即執行。此處的重點是子流程應在任何其他使用您在 realm 中支援的任何憑證來驗證使用者的子流程或執行步驟之前發生。新增後,將 需求 變更為 替代

  4. 點擊 我的組織 子流程中的 新增子流程,並為其命名,例如 我的組織 - 條件式。新增後,將 需求 變更為 條件式

  5. 點擊 我的組織 - 條件式 子流程中的 新增條件,並選取 條件 - 使用者已設定。新增後,將 需求 變更為 必要

  6. 點擊 我的組織 - 條件式 子流程中的 新增步驟,並選取 *組織身分優先登入

    • 執行步驟。新增後,將 需求 變更為 替代

  7. 將身份驗證流程繫結至 瀏覽器 繫結類型。

組織瀏覽器流程

Organizations browser flow

一旦您對 realm 啟用組織設定並建立至少一個組織,您應該能夠看到「身分優先登入」頁面並開始在您的 realm 中使用組織。

請按照以下步驟變更 首次代理登入 流程

程序
  1. 複製目前繫結至 首次代理登入流程 繫結類型的流程,以避免中斷您目前使用的流程

  2. 點擊 新增子流程 並為其命名,例如 組織成員 - 條件式。新增後,將 需求 變更為 條件式

  3. 點擊 組織成員 - 條件式 子流程中的 新增條件,並選取 條件 - 使用者已設定。新增後,將 需求 變更為 必要

  4. 點擊 組織成員 - 條件式 子流程中的 新增步驟,並選取 組織成員加入 執行步驟。新增後,將 需求 變更為 必要

  5. 將身份驗證流程繫結至 首次代理登入 繫結類型。

組織首次代理流程

Organizations first broker flow

您現在應該可以使用與組織關聯的任何身分提供者進行身份驗證,並且讓使用者在完成首次瀏覽器登入流程後立即加入組織成為成員。

對應組織宣告

若要將組織特定的宣告對應到權杖,用戶端需要在將授權請求傳送至伺服器時請求 organization 範圍。在組織環境中進行身份驗證時,用戶端可以請求 organization 範圍來對應使用者為其成員的組織相關資訊。

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

"organization": {
  "testcorp": {
    "id": "42c3e46f-2477-44d7-a85b-d3b43f6b31fa",
    "attr1": [
      "value1"
    ]
  }
}

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

organization 範圍是 realm 中內建的選用用戶端範圍。因此,此範圍預設會新增至 realm 中建立的任何用戶端。它也定義了 組織成員資格 對應程式,該對應程式控制組織成員資格資訊如何對應到權杖。

預設情況下,組織 ID 和屬性不包含在組織宣告中。若要包含它們,請編輯對應程式並啟用 新增組織 ID新增組織屬性 選項。
在組織宣告中包含屬性

Including attributes in the organization claim

organization 範圍可以使用不同的格式請求

格式 說明

organization

如果使用者是單一組織的成員,則會對應到單一組織。否則,如果使用者是多個組織的成員,則在向 realm 驗證時,系統會提示使用者選擇一個組織。

organization:<別名>

對應到具有指定別名的單一組織。

organization:*

對應到使用者所屬的所有組織。

管理 OpenID Connect 和 SAML 用戶端

用戶端是可以請求使用者驗證的實體。用戶端有兩種形式。第一種用戶端是想要參與單一登入的應用程式。這些用戶端只是希望 Keycloak 為它們提供安全性。另一種類型的用戶端是請求存取權杖,以便代表已驗證的使用者調用其他服務。本節討論有關設定用戶端的各個方面以及各種方法。

管理 OpenID Connect 用戶端

OpenID Connect 是建議用來保護應用程式的協定。它是從頭開始設計,以符合網路需求,並且最適合搭配 HTML5/JavaScript 應用程式使用。

建立 OpenID Connect 用戶端

若要保護使用 OpenID Connect 協定的應用程式,您需要建立用戶端。

程序
  1. 在選單中點擊 用戶端

  2. 按一下 建立用戶端

    建立用戶端

    Create Client

  3. 用戶端類型 保留為 OpenID Connect

  4. 輸入 用戶端 ID

    此 ID 是一個字母數字字串,用於 OIDC 請求和 Keycloak 資料庫中,以識別用戶端。

  5. 提供用戶端的 名稱

    如果您計劃將此名稱本地化,請設定一個替換字串值。例如,字串值可以設定為 ${myapp}。如需更多資訊,請參閱 伺服器開發人員指南

  6. 點擊 儲存

此動作會建立用戶端,並帶您到 設定 索引標籤,您可以在其中執行 基本設定

基本設定

設定 索引標籤包含許多選項來設定此用戶端。

設定索引標籤

Settings tab

一般設定
客戶端 ID

用於 OIDC 請求和 Keycloak 資料庫中,以識別用戶端的字母數字 ID 字串。

名稱

Keycloak UI 螢幕中用戶端的名稱。若要本地化名稱,請設定一個替換字串值。例如,字串值可以設定為 ${myapp}。如需更多資訊,請參閱 伺服器開發人員指南

說明

用戶端的描述。此設定也可以本地化。

始終在主控台中顯示

即使此使用者沒有活動的連線階段,也始終在帳戶主控台中列出此用戶端。

存取設定
根 URL

如果 Keycloak 使用任何已設定的相對 URL,此值會附加到這些 URL 的前面。

首頁 URL

提供當驗證伺服器需要重新導向或連結回用戶端時的預設 URL。

有效的重新導向 URI

必填欄位。輸入 URL 模式,然後按一下 + 以新增,按一下 - 以移除現有的 URL,然後按一下 儲存。使用完全比對 (區分大小寫) 字串來比較有效的重新導向 URI。

您可以在 URL 模式的結尾使用萬用字元。例如 http://host.com/path/*。為了避免安全性問題,如果傳遞的重新導向 URI 包含 userinfo 部分,或其 路徑 管理對父目錄 (/../) 的存取,則不會執行萬用字元比較,而是執行標準且安全的完全字串比對。

也可以設定完整的萬用字元 * 有效重新導向 URI,以允許任何 httphttps 重新導向 URI。請勿在生產環境中使用它。

明確的重新導向 URI 模式通常更安全。如需更多資訊,請參閱 不明確的重新導向 URI

Web 來源

輸入 URL 模式,然後按一下 + 以新增,按一下 - 以移除現有的 URL。按一下 [儲存]。

此選項會處理 跨來源資源共用 (CORS)。如果瀏覽器 JavaScript 嘗試對其網域與 JavaScript 程式碼來源不同的伺服器執行 AJAX HTTP 請求,則請求必須使用 CORS。伺服器必須處理 CORS 請求,否則瀏覽器將不會顯示或允許處理該請求。此協定可防止 XSS、CSRF 和其他基於 JavaScript 的攻擊。

此處列出的網域 URL 會內嵌在傳送至用戶端應用程式的存取權杖中。用戶端應用程式會使用此資訊來決定是否允許在其上調用 CORS 請求。只有 Keycloak 用戶端配接器支援此功能。如需更多資訊,請參閱 保護應用程式指南

管理 URL

用戶端的回呼端點。伺服器會使用此 URL 來執行回呼,例如推送撤銷原則、執行後端通道登出和其他管理作業。對於 Keycloak Servlet 配接器,此 URL 可以是 Servlet 應用程式的根 URL。如需更多資訊,請參閱 保護應用程式指南

功能組態
用戶端驗證

OIDC 用戶端的類型。

  • 開啟

    適用於執行瀏覽器登入且在發出存取權杖請求時需要用戶端密碼的伺服器端用戶端。此設定應適用於伺服器端應用程式。

  • 關閉

    適用於執行瀏覽器登入的用戶端。由於無法確保用戶端能夠安全地保存密碼,因此務必透過設定正確的重新導向 URI 來限制存取。

Authorization

啟用或停用此用戶端的細緻授權支援。

標準流程

如果啟用此選項,此用戶端可以使用 OIDC 授權碼流程

直接存取授權

如果啟用此選項,此用戶端可以使用 OIDC 直接存取授權

隱含流程

如果啟用此選項,此用戶端可以使用 OIDC 隱含流程

服務帳戶角色

如果啟用此選項,此用戶端可以驗證 Keycloak 並檢索專用於此用戶端的存取權杖。依照 OAuth2 規格,這會啟用此用戶端的 用戶端憑證授權 支援。

Auth 2.0 裝置授權授與

如果啟用此選項,此用戶端可以使用 OIDC 裝置授權授與

OIDC CIBA 授與

如果啟用此選項,此用戶端可以使用 OIDC 用戶端起始的反向通道驗證授與

登入設定
登入主題

用於登入、OTP、授與註冊和忘記密碼頁面的佈景主題。

需要同意

如果啟用此選項,使用者必須同意用戶端存取。

適用於執行瀏覽器登入的用戶端。由於無法確保用戶端能夠安全地保存密碼,因此務必透過設定正確的重新導向 URI 來限制存取。

在螢幕上顯示用戶端

如果 需要同意關閉,則套用此開關。

  • 關閉

    同意螢幕將僅包含與設定的用戶端範圍對應的同意。

  • 開啟

    同意螢幕上也會有一個關於此用戶端本身的項目。

用戶端同意螢幕文字

如果啟用 需要同意在螢幕上顯示用戶端,則會套用。包含同意螢幕上關於此用戶端權限的文字。

登出設定
前端通道登出

如果啟用 前端通道登出,應用程式應該能夠依照 OpenID Connect 前端通道登出 規格,透過前端通道登出使用者。如果啟用此選項,您也應該提供 前端通道登出 URL

前端通道登出 URL

Keycloak 將用於透過前端通道傳送登出請求至用戶端的 URL。

後端通道登出 URL

當登出請求傳送至此 realm (透過 end_session_endpoint) 時,將導致用戶端自行登出的 URL。如果省略此選項,則不會將登出請求傳送至用戶端。

需要後端通道登出連線階段

指定在使用 後端通道登出 URL 時,連線階段 ID 宣告是否包含在登出權杖中。

後端通道登出撤銷離線連線階段

指定在使用後端通道登出 URL 時,revoke_offline_access 事件是否包含在登出權杖中。Keycloak 在收到包含此事件的登出權杖時,將會撤銷離線連線階段。

進階設定

在完成設定標籤頁上的欄位後,您可以使用其他標籤頁來執行進階設定。例如,您可以使用權限角色標籤頁來為管理員設定細緻的身份驗證。請參閱細緻的管理員權限。此外,請參閱本章的其餘章節以了解其他功能。

進階標籤頁

當您點擊進階標籤頁時,會顯示其他欄位。如需特定欄位的詳細資訊,請點擊該欄位的問號圖示。但是,本節將詳細說明某些欄位。

細緻的 OpenID Connect 設定

Logo URL

指向客戶端應用程式標誌的 URL。

Policy URL

依賴方客戶端提供給終端使用者,以便了解如何使用個人資料的 URL。

Terms of Service URL

依賴方客戶端提供給終端使用者,以便閱讀依賴方服務條款的 URL。

簽署和加密的 ID 令牌支援

Keycloak 可以根據 Json Web Encryption (JWE) 規範來加密 ID 令牌。管理員可決定是否為每個客戶端加密 ID 令牌。

用於加密 ID 令牌的金鑰是內容加密金鑰 (CEK)。Keycloak 和客戶端必須協商使用哪個 CEK 以及如何傳遞。用於決定 CEK 的方法是金鑰管理模式。Keycloak 支援的金鑰管理模式是金鑰加密。

在金鑰加密中

  1. 客戶端會產生一個非對稱密碼金鑰對。

  2. 公鑰用於加密 CEK。

  3. Keycloak 會為每個 ID 令牌產生一個 CEK。

  4. Keycloak 使用此產生的 CEK 加密 ID 令牌。

  5. Keycloak 使用客戶端的公鑰加密 CEK。

  6. 客戶端使用其私鑰解密此加密的 CEK。

  7. 客戶端使用解密的 CEK 解密 ID 令牌。

除了客戶端之外,沒有任何一方可以解密 ID 令牌。

客戶端必須傳遞其用於加密 CEK 的公鑰給 Keycloak。Keycloak 支援從客戶端提供的 URL 下載公鑰。客戶端必須根據 Json Web Keys (JWK) 規範提供公鑰。

程序如下

  1. 開啟客戶端的金鑰標籤頁。

  2. JWKS URL 切換為開啟。

  3. JWKS URL 文字方塊中輸入客戶端的公鑰 URL。

金鑰加密的演算法定義於 Json Web Algorithm (JWA) 規範中。Keycloak 支援

  • RSAES-PKCS1-v1_5(RSA1_5)

  • 使用預設參數的 RSAES OAEP (RSA-OAEP)

  • 使用 SHA-256 和 MFG1 的 RSAES OAEP 256 (RSA-OAEP-256)

選取演算法的程序如下

  1. 開啟客戶端的進階標籤頁。

  2. 開啟 Fine Grain OpenID Connect Configuration

  3. ID Token Encryption Content Encryption Algorithm 下拉式選單中選取演算法。

OpenID Connect 相容性模式

本節的存在是為了向後相容性。點擊每個欄位的問號圖示以取得詳細資訊。

已啟用 OAuth 2.0 相互 TLS 憑證繫結的存取令牌

相互 TLS 將存取令牌和重新整理令牌與在 TLS 交握期間交換的客戶端憑證繫結在一起。這種繫結可防止攻擊者使用遭竊的令牌。

此類型的令牌是持有金鑰令牌。與不記名令牌不同,持有金鑰令牌的接收者可以驗證令牌的傳送者是否合法。

如果此設定開啟,則工作流程如下

  1. 令牌請求會以授權碼流程或混合流程傳送到令牌端點。

  2. Keycloak 會請求客戶端憑證。

  3. Keycloak 會收到客戶端憑證。

  4. Keycloak 成功驗證客戶端憑證。

如果驗證失敗,Keycloak 會拒絕令牌。

在以下情況下,Keycloak 將驗證傳送存取令牌或重新整理令牌的客戶端

  • 將帶有持有金鑰重新整理令牌的令牌重新整理請求傳送到令牌端點。

  • 將帶有持有金鑰存取令牌的 UserInfo 請求傳送到 UserInfo 端點。

  • 將帶有持有金鑰重新整理令牌的登出請求傳送到不符合 OIDC 的 Keycloak 專有登出端點。

如需更多詳細資訊,請參閱 OAuth 2.0 相互 TLS 客戶端身份驗證和憑證繫結存取令牌中的 相互 TLS 客戶端憑證繫結的存取令牌

Keycloak 客戶端介面卡不支援持有金鑰令牌驗證。Keycloak 介面卡將存取令牌和重新整理令牌視為不記名令牌。

應用程式層的 OAuth 2.0 展示所有權證明 (DPoP)

DPoP 將存取令牌和重新整理令牌與客戶端金鑰對的公鑰部分繫結在一起。這種繫結可防止攻擊者使用遭竊的令牌。

此類型的令牌是持有金鑰令牌。與不記名令牌不同,持有金鑰令牌的接收者可以驗證令牌的傳送者是否合法。

如果客戶端開關 OAuth 2.0 DPoP Bound Access Tokens Enabled 開啟,則工作流程如下

  1. 令牌請求會以授權碼流程或混合流程傳送到令牌端點。

  2. Keycloak 會請求 DPoP 證明。

  3. Keycloak 會收到 DPoP 證明。

  4. Keycloak 成功驗證 DPoP 證明。

如果驗證失敗,Keycloak 會拒絕令牌。

如果開關 OAuth 2.0 DPoP Bound Access Tokens Enabled 關閉,客戶端仍然可以在令牌請求中傳送 DPoP 證明。在這種情況下,Keycloak 將驗證 DPoP 證明,並將指紋新增至令牌。但是,如果開關關閉,Keycloak 伺服器不會針對此客戶端強制執行 DPoP 繫結。如果您想要確保特定客戶端始終使用 DPoP 繫結,建議將此開關開啟。

在以下情況下,Keycloak 將驗證傳送存取令牌或重新整理令牌的客戶端

  • 將帶有持有金鑰重新整理令牌的令牌重新整理請求傳送到令牌端點。此驗證僅針對 DPoP 規範中所述的公用客戶端執行。對於機密客戶端,由於使用適當的客戶端憑證進行客戶端身份驗證可確保請求來自合法的客戶端,因此不會執行驗證。對於公用客戶端,存取令牌和重新整理令牌都是 DPoP 繫結的。對於機密客戶端,只有存取令牌是 DPoP 繫結的。

  • 將帶有持有金鑰存取令牌的 UserInfo 請求傳送到 UserInfo 端點。

  • 將帶有持有金鑰重新整理令牌的登出請求傳送到不符合 OIDC 的 Keycloak 專有登出端點。此驗證僅針對上述的公用客戶端執行。

如需更多詳細資訊,請參閱 OAuth 2.0 展示所有權證明 (DPoP)

Keycloak 客戶端介面卡不支援 DPoP 持有金鑰令牌驗證。Keycloak 介面卡將存取令牌和重新整理令牌視為不記名令牌。

DPoP 為預覽,且未完全支援。此功能預設為停用。

若要啟用,請使用 --features=preview--features=dpop 啟動伺服器

OIDC 的進階設定

OpenID Connect 的進階設定允許您在客戶端層級設定覆寫,以用於工作階段和令牌逾時

Advanced Settings

設定 說明

Access Token Lifespan(存取權杖生命週期)

該值會覆寫具有相同名稱的領域選項。

Client Session Idle(用戶端工作階段閒置)

該值會覆寫具有相同名稱的領域選項。該值應短於全域的 SSO 工作階段閒置

Client Session Max(用戶端工作階段最大值)

該值會覆寫具有相同名稱的領域選項。該值應短於全域的 SSO 工作階段最大值

客戶端離線工作階段閒置

此設定允許您為客戶端設定較短的離線工作階段閒置逾時。逾時是工作階段在 Keycloak 撤銷其離線令牌之前保持閒置的時間量。如果未設定,則會使用領域 離線工作階段閒置

客戶端離線工作階段最大值

此設定允許您為客戶端設定較短的離線工作階段最大存留期。存留期是 Keycloak 撤銷相應離線令牌之前的最大時間。此選項需要全域在領域中啟用 離線工作階段最大值限制,且預設為 離線工作階段最大值

程式碼交換程式碼挑戰方法的證明金鑰

如果攻擊者竊取合法客戶端的授權碼,程式碼交換的證明金鑰 (PKCE) 可防止攻擊者收到適用於該程式碼的令牌。

管理員可以選取以下選項之一

(空白)

除非客戶端將適當的 PKCE 參數傳送至 Keycloak 授權端點,否則 Keycloak 不會套用 PKCE。

S256

Keycloak 會將程式碼挑戰方法為 S256 的 PKCE 套用至客戶端。

plain

Keycloak 會將程式碼挑戰方法為 plain 的 PKCE 套用至客戶端。

如需更多詳細資訊,請參閱 RFC 7636 OAuth 公用客戶端程式碼交換的證明金鑰

ACR 到驗證等級(LoA)的對應

在客戶端的進階設定中,您可以定義哪個 Authentication Context Class Reference (ACR) 值會對應到哪個 Level of Authentication (LoA)。如 ACR 對 LoA 的對應中所述,此對應也可以在領域中指定。最佳做法是在領域層級設定此對應,以便在多個客戶端之間共用相同的設定。

當登入請求從此客戶端傳送到 Keycloak,且沒有 acr_values 參數且沒有附加 acr 宣告的 claims 參數時,可以使用 Default ACR Values 來指定預設值。請參閱 官方 OIDC 動態客戶端註冊規範

請注意,預設 ACR 值會當作預設層級使用,但不能可靠地用於強制使用特定層級登入。例如,假設您將 Default ACR Values 設定為層級 2。然後預設情況下,會要求使用者使用層級 2 進行身份驗證。但是,當使用者明確將參數附加到登入請求中 (例如 acr_values=1) 時,將會使用層級 1。因此,如果客戶端確實需要層級 2,則建議客戶端檢查 ID 令牌內是否存在 acr 宣告,並仔細檢查其中是否包含請求的層級 2。

ACR to LoA mapping

如需更多詳細資訊,請參閱逐步驗證官方 OIDC 規格

機密客戶端憑證

如果客戶端的客戶端驗證設定為開啟,則必須在憑證標籤頁下設定客戶端的憑證。

憑證標籤頁

Credentials Tab

客戶端驗證器下拉式清單指定用於客戶端的憑證類型。

客戶端 ID 和密碼

此選項是預設設定。密碼會自動產生。如有必要,請點擊重新產生以重新建立密碼。

已簽署 JWT

Signed JWT

已簽署 JWT 是「已簽署 Json Web Token」。

當選擇此憑證類型時,您還必須在 金鑰 標籤頁中產生客戶端的私鑰和憑證。私鑰將用於簽署 JWT,而憑證則由伺服器用於驗證簽名。

金鑰索引標籤

Keys tab

點擊 產生新金鑰 按鈕以開始此流程。

產生金鑰

generate client keys

  1. 選取您要使用的封存格式。

  2. 輸入金鑰密碼

  3. 輸入儲存密碼

  4. 點擊產生

當您產生金鑰時,Keycloak 會儲存憑證,而您會下載您用戶端的私密金鑰和憑證。

您也可以使用外部工具產生金鑰,然後點擊匯入憑證來匯入用戶端的憑證。

匯入憑證

Import Certificate

  1. 選取憑證的封存格式。

  2. 輸入儲存密碼。

  3. 點擊匯入檔案來選取憑證檔案。

  4. 點擊匯入

如果您點擊使用 JWKS URL,則不需要匯入憑證。在這種情況下,您可以提供公鑰以 JWK 格式發佈的 URL。使用此選項,如果金鑰有變更,Keycloak 會重新匯入金鑰。

如果您使用的是由 Keycloak 介面卡保護的用戶端,您可以設定此格式的 JWKS URL,假設 https://myhost.com/myapp 是您用戶端應用程式的根 URL

https://myhost.com/myapp/k_jwks

請參閱 伺服器開發人員指南 以瞭解更多詳細資訊。

使用用戶端密碼簽署的 JWT

如果您選取此選項,您可以使用由用戶端密碼簽署的 JWT,而不是私密金鑰。

用戶端密碼將用於用戶端簽署 JWT。

X509 憑證

Keycloak 會驗證用戶端在 TLS 交握期間是否使用正確的 X509 憑證。

X509 憑證

x509 client auth

驗證器還會使用已設定的正規表示式驗證運算式來檢查憑證的主題 DN 欄位。對於某些使用案例,接受所有憑證就已足夠。在這種情況下,您可以使用 (.*?)(?:$) 運算式。

Keycloak 有兩種方式可以從請求中取得用戶端 ID

  • 查詢中的 client_id 參數(在 OAuth 2.0 規格的 2.2 節中描述)。

  • 以表單參數的形式提供 client_id

用戶端密碼輪換

請注意,用戶端密碼輪換支援正在開發中。請實驗性地使用此功能。

對於具有 機密 用戶端驗證 的用戶端,Keycloak 支援透過 用戶端原則 輪換用戶端密碼的功能。

用戶端密碼輪換原則可提供更高的安全性,以減輕諸如密碼洩漏等問題。一旦啟用,Keycloak 最多支援每個用戶端同時有兩個活動中的密碼。此原則會根據以下設定來管理輪換

  • 密碼過期:[秒] - 當密碼輪換時,這是新密碼的過期時間。將數加到密碼建立日期。在原則執行時計算。

  • 已輪換密碼過期:[秒] - 當密碼輪換時,此值是舊密碼的剩餘過期時間。此值應始終小於密碼過期。當值為 0 時,舊密碼將在用戶端輪換期間立即移除。將數加到密碼輪換日期。在原則執行時計算。

  • 更新期間輪換的剩餘過期時間:[秒] - 對動態用戶端進行更新時應執行用戶端密碼輪換的時間段。在原則執行時計算。

當發生用戶端密碼輪換時,會產生新的主要密碼,而舊的用戶端主要密碼會成為具有新過期時間的次要密碼。

用戶端密碼輪換規則

輪換不會自動發生或透過背景程序發生。為了執行輪換,需要在用戶端上執行更新動作,無論是透過 Keycloak 管理主控台的重新產生密碼功能,在用戶端的認證索引標籤中,還是透過管理 REST API。當調用用戶端更新動作時,密碼輪換會根據規則發生

  • 密碼過期的值小於目前日期時。

  • 在動態用戶端註冊用戶端更新請求期間,如果更新期間輪換的剩餘過期時間的值與目前日期和密碼過期之間的時間段相符,則用戶端密碼將會自動輪換。

此外,可以透過管理 REST API 強制隨時進行用戶端密碼輪換。

在建立新用戶端期間,如果用戶端密碼輪換原則為活動狀態,則會自動套用該行為。

若要將密碼輪換行為套用到現有的用戶端,請在您定義原則後更新該用戶端,以便套用該行為。

建立 OIDC 用戶端密碼輪換原則

以下是定義密碼輪換原則的範例

程序
  1. 在選單中點擊領域設定

  2. 點擊用戶端原則索引標籤。

  3. 設定檔頁面上,點擊建立用戶端設定檔

    建立設定檔

    Create Client Profile

  4. 名稱輸入任何名稱。

  5. 描述輸入描述,以協助您識別設定檔的用途。

  6. 點擊 儲存

    此動作會建立設定檔,並讓您可以設定執行器。

  7. 點擊新增執行器,以設定此設定檔的執行器。

    建立設定檔執行器

    Client Profile Executor

  8. 執行器類型選取密碼輪換

  9. 密碼過期輸入每個密碼的最大持續時間(以秒為單位)。

  10. 已輪換密碼過期輸入每個已輪換密碼的最大持續時間(以秒為單位)。

    請記住,已輪換密碼過期的值必須始終小於密碼過期
  11. 輸入任何更新動作會更新用戶端的時間量(以秒為單位),作為剩餘過期時間

  12. 點擊 新增

    在上面的範例中

    • 每個密碼的有效期為一週。

    • 已輪換的密碼在兩天後過期。

    • 更新動態用戶端的窗口會在密碼過期前一天開始。

  13. 返回用戶端原則索引標籤。

  14. 點擊原則

  15. 點擊建立用戶端原則

    建立用戶端密碼輪換原則

    Client Rotation Policy

  16. 名稱輸入任何名稱。

  17. 描述輸入描述,以協助您識別原則的用途。

  18. 點擊 儲存

    此動作會建立原則,並讓您可以將原則與設定檔關聯。它也允許您設定原則執行的條件。

  19. 在「條件」下,點擊新增條件

    建立用戶端密碼輪換原則條件

    Client Rotation Policy Condition

  20. 若要將此行為套用至所有機密用戶端,請在條件類型欄位中選取用戶端存取類型

    若要套用至特定用戶端群組,另一種方法是在條件類型欄位中選取用戶端角色類型。透過這種方式,您可以建立特定的角色,並將自訂的輪換設定指派給每個角色。

  21. 機密新增至用戶端存取類型欄位。

  22. 點擊 新增

  23. 返回原則設定中的「用戶端設定檔」下方,點擊新增用戶端設定檔,然後從清單中選取每週用戶端密碼輪換設定檔,然後點擊新增

    用戶端密碼輪換原則

    Client Rotation Policy

若要將密碼輪換行為套用至現有的用戶端,請按照下列步驟執行

使用管理控制台
  1. 在選單中點擊 用戶端

  2. 點擊一個用戶端。

  3. 點擊 **Credentials** 索引標籤。

  4. 點擊用戶端密碼的重新產生


使用用戶端 REST 服務,可以使用兩種方式執行
  • 透過用戶端的更新作業

  • 透過重新產生用戶端密碼端點

使用服務帳戶

每個 OIDC 用戶端都有內建的服務帳戶。使用此服務帳戶以取得存取權杖。

程序
  1. 在選單中點擊 用戶端

  2. 選取您的用戶端。

  3. 點擊設定索引標籤。

  4. 用戶端驗證 切換至開啟

  5. 選取服務帳戶角色

  6. 點擊 儲存

  7. 設定您的用戶端認證

  8. 按一下 Scope 索引標籤。

  9. 驗證您是否擁有角色或將允許完整範圍切換為開啟

  10. 點擊服務帳戶角色索引標籤

  11. 為您的用戶端設定此服務帳戶可用的角色。

來自存取權杖的角色是以下項目的交集

  • 與從連結的用戶端範圍繼承的角色範圍對應結合的用戶端角色範圍對應。

  • 服務帳戶角色。

要調用的 REST URL 是 /realms/{realm-name}/protocol/openid-connect/token。必須將此 URL 作為 POST 請求調用,並且需要您在請求中張貼用戶端認證。

預設情況下,用戶端認證由 Authorization: Basic 標頭中的用戶端 clientID 和 clientSecret 表示,但是您也可以使用已簽署的 JWT 判斷提示或任何其他自訂的用戶端驗證機制來驗證用戶端。

您還需要根據 OAuth2 規格將 grant_type 參數設定為「client_credentials」。

例如,用於擷取服務帳戶的 POST 調用可能如下所示

    POST /realms/demo/protocol/openid-connect/token
    Authorization: Basic cHJvZHVjdC1zYS1jbGllbnQ6cGFzc3dvcmQ=
    Content-Type: application/x-www-form-urlencoded

    grant_type=client_credentials

回應將與 OAuth 2.0 規格中的此 存取權杖回應 類似。

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
    "access_token":"2YotnFZFEjr1zCsicMWpAA",
    "token_type":"bearer",
    "expires_in":60
}

預設情況下只會傳回存取權杖。不會傳回任何重新整理權杖,並且預設情況下,在 Keycloak 端成功驗證後不會建立任何使用者工作階段。由於缺少重新整理權杖,因此當存取權杖過期時,需要重新驗證。但是,這種情況並不意味著 Keycloak 伺服器有任何額外的負擔,因為預設情況下不會建立工作階段。

在這種情況下,不需要登出。但是,可以透過將請求傳送至 OpenID Connect 端點一節中所述的 OAuth2 撤銷端點來撤銷已發出的存取權杖。

其他資源

如需更多詳細資訊,請參閱用戶端認證授權

受眾支援

通常,部署 Keycloak 的環境包含一組使用 Keycloak 進行身份驗證的機密公開用戶端應用程式。

服務(在 OAuth 2 規格 中稱為資源伺服器)也可用於處理來自用戶端應用程式的請求,並向這些應用程式提供資源。這些服務需要傳送存取權杖(Bearer 權杖)以驗證請求。此權杖由前端應用程式在登入 Keycloak 時取得。

在服務間信任度低的環境中,您可能會遇到以下情況:

  1. 前端用戶端應用程式需要針對 Keycloak 進行身份驗證。

  2. Keycloak 驗證使用者。

  3. Keycloak 向應用程式發出權杖。

  4. 應用程式使用權杖來調用不受信任的服務。

  5. 不受信任的服務會將回應傳回應用程式。但是,它會保留應用程式的權杖。

  6. 然後,不受信任的服務會使用應用程式的權杖來調用受信任的服務。這會導致安全性問題,因為不受信任的服務會濫用權杖來代表用戶端應用程式存取其他服務。

這種情況在服務之間信任度高的環境中不太可能發生,但在信任度低的環境中則不然。在某些環境中,這種工作流程可能是正確的,因為不受信任的服務可能必須從受信任的服務中檢索資料,才能將資料返回給原始用戶端應用程式。

當服務之間存在高度信任時,無限受眾會很有用。否則,應限制受眾。您可以限制受眾,同時允許不受信任的服務從受信任的服務中檢索資料。在這種情況下,請確保將不受信任的服務和受信任的服務都新增為權杖的受眾。

為了防止濫用存取權杖,請限制權杖上的受眾,並將您的服務設定為驗證權杖上的受眾。流程將變更如下:

  1. 前端應用程式針對 Keycloak 進行身份驗證。

  2. Keycloak 驗證使用者。

  3. Keycloak 向應用程式發出權杖。應用程式知道它將需要調用不受信任的服務,因此它會在傳送至 Keycloak 的身份驗證請求中放置 scope=<不受信任的服務>(有關 scope 參數的更多詳細資訊,請參閱 用戶端範圍章節)。

    發給應用程式的權杖在其受眾中包含對不受信任服務的引用("audience": [ "<不受信任的服務>" ]),這表示用戶端使用此存取權杖來調用不受信任的服務。

  4. 不受信任的服務使用權杖調用受信任的服務。調用不成功,因為受信任的服務會檢查權杖上的受眾,並發現其受眾僅限於不受信任的服務。此行為是預期的,並且安全性不會遭到破壞。

如果用戶端稍後想要調用受信任的服務,它必須重新發出帶有 scope=<受信任的服務> 的 SSO 登入,以取得另一個權杖。然後,返回的權杖將包含受信任的服務作為受眾。

"audience": [ "<trusted service>" ]

使用此值來調用 <受信任的服務>

設定

設定受眾檢查時:

  • 請確保將服務設定為檢查傳送給它們的存取權杖上的受眾。這可以使用特定於您用於保護 OIDC 用戶端應用程式的用戶端 OIDC 配接器的方式來完成。

  • 請確保 Keycloak 發出的存取權杖包含所有必要的受眾。可以使用用戶端角色新增受眾,如 下一節 或硬式編碼中所述。請參閱 硬式編碼受眾

自動新增受眾

受眾解析協定映射程式是在預設用戶端範圍 roles 中定義的。該映射程式會檢查至少有一個用戶端角色可供目前權杖使用的用戶端。然後,每個用戶端的用戶端 ID 都會新增為受眾,這在您的服務用戶端依賴用戶端角色時很有用。服務用戶端通常可能是不啟用任何流程的用戶端,它可能不會直接向自身發出任何權杖。它代表 OAuth 2 資源伺服器

例如,對於服務用戶端和機密用戶端,您可以使用為機密用戶端發出的存取權杖來調用服務用戶端 REST 服務。如果符合以下條件,則服務用戶端將自動新增為發給機密用戶端的存取權杖的受眾:

  • 服務用戶端本身已定義任何用戶端角色。

  • 目標使用者已指派至少其中一個用戶端角色。

  • 機密用戶端具有指派角色的角色範圍對應。

如果您想要確保不會自動新增受眾,請勿直接在機密用戶端上設定角色範圍對應。相反,您可以建立專用用戶端範圍,其中包含您專用用戶端範圍的用戶端角色的角色範圍對應。

假設將用戶端範圍新增為機密用戶端的選用用戶端範圍,如果 scope=<受信任的服務> 參數明確要求,則用戶端角色和受眾將新增至權杖。

前端用戶端本身不會自動新增至存取權杖受眾,因此可以輕鬆區分存取權杖和 ID 權杖,因為存取權杖不會包含發出權杖的用戶端作為受眾。

如果您需要將用戶端本身作為受眾,請參閱 硬式編碼受眾 選項。但是,不建議將同一個用戶端同時用作前端和 REST 服務。

硬式編碼受眾

當您的服務依賴領域角色,或完全不依賴權杖中的角色時,使用硬式編碼受眾可能會很有用。硬式編碼受眾是一個協定映射程式,它會將指定服務用戶端的用戶端 ID 新增為權杖的受眾。如果您想要使用與用戶端 ID 不同的受眾,則可以使用任何自訂值,例如 URL。

您可以將協定映射程式直接新增至前端用戶端。如果直接新增協定映射程式,則也會一直新增受眾。

若要更好地控制協定映射程式,您可以在專用用戶端範圍上建立協定映射程式,例如 good-service

受眾協定映射程式

audience mapper

  • good-service 用戶端的 用戶端詳細資訊索引標籤,您可以產生配接器組態,並確認 verify-token-audience 設定為 true。如果您使用此組態,則此動作會強制配接器驗證受眾。

  • 您需要確保機密用戶端能夠在其權杖中要求 good-service 作為受眾。

    在機密用戶端上:

    1. 按一下用戶端範圍索引標籤。

    2. good-service 指派為選用(或預設)用戶端範圍。

      有關更多詳細資訊,請參閱 用戶端範圍連結章節

  • 您可以選擇性地評估用戶端範圍並產生範例存取權杖。如果 good-service 包含在 scope 參數中,則在您將其指派為選用用戶端範圍時,good-service 將新增至產生的存取權杖的受眾。

  • 在您的機密用戶端應用程式中,請確保使用 scope 參數。當您想要發出權杖以存取 good-service 時,必須包含值 good-service

    請參閱:

    • 如果您的應用程式使用 javascript 配接器,請參閱 保護應用程式章節中的Keycloak JavaScript 配接器

預設情況下,受眾受眾解析協定映射程式只會將受眾新增至存取權杖。ID 權杖通常只包含一個受眾,即發出權杖的用戶端 ID,這是 OpenID Connect 規格的要求。但是,除非受眾映射程式已新增,否則存取權杖不一定會具有發出權杖的用戶端 ID。

建立 SAML 用戶端

Keycloak 支援已註冊應用程式的 SAML 2.0。支援 POST 和重新導向繫結。您可以選擇需要用戶端簽名驗證。您也可以讓伺服器簽署和/或加密回應。

程序
  1. 在選單中點擊 用戶端

  2. 按一下建立用戶端以前往建立用戶端頁面。

  3. 用戶端類型設定為 SAML

    建立用戶端

    add client saml

  4. 輸入用戶端的用戶端 ID。這通常是一個 URL,並且是應用程式傳送的 SAML 請求中預期的 issuer 值。

  5. 按一下儲存。此動作會建立用戶端,並將您帶到設定索引標籤。

以下章節說明此索引標籤上的每個設定。

設定索引標籤

設定 索引標籤包含許多選項來設定此用戶端。

用戶端設定

client settings saml

一般設定
客戶端 ID

在 OIDC 請求和 Keycloak 資料庫中用來識別用戶端的字母數字 ID 字串。此值必須符合 AuthNRequest 中傳送的 issuer 值。Keycloak 會從 Authn SAML 請求中提取 issuer,並透過此值將其與用戶端進行比對。

名稱

Keycloak UI 畫面中用戶端的名稱。若要將名稱當地語系化,請設定替換字串值。例如,字串值,例如 ${myapp}。有關更多資訊,請參閱 伺服器開發人員指南

說明

用戶端的描述。此設定也可以本地化。

始終在主控台中顯示

即使此使用者沒有活動的連線階段,也始終在帳戶主控台中列出此用戶端。

存取設定
根 URL

當 Keycloak 使用已設定的相對 URL 時,此值會附加到 URL 的前面。

首頁 URL

如果 Keycloak 需要連結到用戶端,則會使用此 URL。

有效的重新導向 URI

輸入 URL 模式並點擊 + 號以新增。點擊 - 號以移除。點擊儲存以儲存這些變更。萬用字元值僅允許在 URL 的結尾使用。例如,http://host.com/*$$。當未註冊確切的 SAML 端點,且 Keycloak 從請求中提取斷言消費者 URL 時,會使用此欄位。

IDP 起始的 SSO URL 名稱

當您想要執行 IDP 起始的 SSO 時,用於參考用戶端的 URL 片段名稱。將此欄位留空將會停用 IDP 起始的 SSO。您將從瀏覽器參考的 URL 將會是:server-root/realms/{realm}/protocol/saml/clients/{client-url-name}

IDP 起始的 SSO 中繼狀態

當您想要執行 IDP 起始的 SSO 時,您想要隨 SAML 請求傳送的中繼狀態。

主要 SAML 處理 URL

此 URL 用於所有 SAML 請求,且回應會導向至 SP。它會被用作斷言消費者服務 URL 和單一登出服務 URL。

如果登入請求包含斷言消費者服務 URL,則這些登入請求將會優先處理。此 URL 必須由已註冊的有效重新導向 URI 模式驗證。

SAML 功能
名稱 ID 格式

主旨的名稱 ID 格式。如果請求中未指定名稱 ID 原則,或如果「強制名稱 ID 格式」屬性設定為「開啟」,則會使用此格式。

強制名稱 ID 格式

如果請求具有名稱 ID 原則,則忽略它並使用在管理主控台的名稱 ID 格式下設定的值。

強制 POST 繫結

預設情況下,Keycloak 會使用原始請求的初始 SAML 繫結進行回應。透過啟用強制 POST 繫結,即使原始請求使用重新導向繫結,Keycloak 仍會使用 SAML POST 繫結進行回應。

強制 Artifact 繫結

如果啟用,回應訊息會透過 SAML ARTIFACT 繫結系統傳回至用戶端。

包含 AuthnStatement

SAML 登入回應可能會指定使用的驗證方法,例如密碼,以及登入和工作階段過期的時間戳記。預設會啟用包含 AuthnStatement,以便AuthnStatement元素會包含在登入回應中。將此設定為「關閉」會阻止用戶端判斷最大工作階段長度,這可能會建立不會過期的用戶端工作階段。

包含 OneTimeUse 條件

如果啟用,登入回應中會包含 OneTimeUse 條件。

最佳化 REDIRECT 簽署金鑰查找

當設定為「開啟」時,SAML 通訊協定訊息會包含 Keycloak 原生擴充功能。此擴充功能包含簽署金鑰 ID 的提示。SP 會使用此擴充功能進行簽章驗證,而不是嘗試使用金鑰驗證簽章。

此選項適用於簽章在查詢參數中傳輸,且在此資訊中找不到簽章資訊的 REDIRECT 繫結。這與 POST 繫結訊息相反,後者的文件簽章中始終包含金鑰 ID。

當 Keycloak 伺服器和配接器提供 IDP 和 SP 時,會使用此選項。此選項僅在簽署文件設定為「開啟」時相關。

簽章和加密
簽署文件

當設定為「開啟」時,Keycloak 會使用領域私密金鑰簽署文件。

簽署斷言

斷言會被簽署並嵌入在 SAML XML Auth 回應中。

簽章演算法

簽署 SAML 文件時使用的演算法。請注意,基於 SHA1 的演算法已過時,並可能在未來版本中移除。我們建議使用更安全的演算法,而不是 *_SHA1。此外,對於 *_SHA1 演算法,如果 SAML 用戶端在 Java 17 或更高版本上執行,則驗證簽章無法運作。

SAML 簽章金鑰名稱

使用 POST 繫結傳送的已簽署 SAML 文件在 KeyName 元素中包含簽署金鑰的識別資訊。此動作可透過SAML 簽章金鑰名稱選項控制。此選項控制 Keyname 的內容。

  • KEY_ID KeyName 包含金鑰 ID。此選項為預設選項。

  • CERT_SUBJECT KeyName 包含與領域金鑰對應的憑證中的主旨。Microsoft Active Directory Federation Services 預期會使用此選項。

  • NONE KeyName 提示會完全從 SAML 訊息中省略。

標準化方法

XML 簽章的標準化方法。

登入設定
登入主題

用於登入、OTP、授與註冊和忘記密碼頁面的佈景主題。

需要同意

如果啟用此選項,使用者必須同意用戶端存取。

適用於執行瀏覽器登入的用戶端。由於無法確保用戶端能夠安全地保存密碼,因此務必透過設定正確的重新導向 URI 來限制存取。

在螢幕上顯示用戶端

如果 需要同意關閉,則套用此開關。

  • 關閉

    同意螢幕將僅包含與設定的用戶端範圍對應的同意。

  • 開啟

    同意螢幕上也會有一個關於此用戶端本身的項目。

用戶端同意螢幕文字

如果啟用 需要同意在螢幕上顯示用戶端,則會套用。包含同意螢幕上關於此用戶端權限的文字。

登出設定
前端通道登出

如果啟用前端通道登出,應用程式需要瀏覽器重新導向以執行登出。例如,應用程式可能需要重設 Cookie,這只能透過重新導向來完成。如果停用前端通道登出,Keycloak 會叫用背景 SAML 請求以登出應用程式。

金鑰索引標籤

加密斷言

使用領域私密金鑰加密 SAML 文件中的斷言。AES 演算法使用 128 位元金鑰大小。

需要用戶端簽章

如果啟用需要用戶端簽章,則預期來自用戶端的文件已簽署。Keycloak 將使用在 金鑰索引標籤中設定的用戶端公開金鑰或憑證驗證此簽章。

允許 ECP 流程

如果為 true,則允許此應用程式使用 SAML ECP 設定檔進行驗證。

進階索引標籤

此索引標籤包含許多用於特定情況的欄位。某些欄位在其他主題中涵蓋。如需其他欄位的詳細資訊,請按一下問號圖示。

細微 SAML 端點設定
Logo URL

指向客戶端應用程式標誌的 URL。

Policy URL

依賴方客戶端提供給終端使用者,以便了解如何使用個人資料的 URL。

Terms of Service URL

依賴方客戶端提供給終端使用者,以便閱讀依賴方服務條款的 URL。

斷言消費者服務 POST 繫結 URL

斷言消費者服務的 POST 繫結 URL。

斷言消費者服務重新導向繫結 URL

斷言消費者服務的重新導向繫結 URL。

登出服務 POST 繫結 URL

登出服務的 POST 繫結 URL。

登出服務重新導向繫結 URL

登出服務的重新導向繫結 URL。

登出服務 Artifact 繫結 URL

登出服務的Artifact繫結 URL。當與 強制 Artifact 繫結選項一起設定時,登入和登出流程都會強制使用Artifact繫結。除非設定此屬性,否則不會將Artifact繫結用於登出。

登出服務 SOAP 繫結 URL

登出服務的重新導向繫結 URL。僅在使用後端通道登出時適用。

Artifact 繫結 URL

傳送 HTTP artifact 訊息的 URL。

Artifact 解析服務

用戶端 SOAP 端點的 URL,將在此處傳送 ArtifactResolve 訊息。

IDP 起始的登入

IDP 起始的登入是一項功能,可讓您在 Keycloak 伺服器上設定一個端點,該端點會將您登入特定的應用程式/用戶端。在用戶端的設定索引標籤中,您需要指定IDP 起始的 SSO URL 名稱。這是一個沒有空格的簡單字串。在此之後,您可以在下列 URL 參考您的用戶端:root/realms/{realm}/protocol/saml/clients/{url-name}

IDP 起始的登入實作偏好 POST 而非 REDIRECT 繫結(如需詳細資訊,請查看saml 繫結)。因此,最終繫結和 SP URL 會以下列方式選取

  1. 如果定義了特定的斷言消費者服務 POST 繫結 URL(在用戶端設定的細微 SAML 端點設定區段內),則會透過該 URL 使用 POST 繫結。

  2. 如果指定了一般的主要 SAML 處理 URL,則會再次透過此一般 URL 使用 POST 繫結。

  3. 作為最後手段,如果設定了斷言消費者服務重新導向繫結 URL(在細微 SAML 端點設定內),則會使用此 URL 的 REDIRECT 繫結。

如果您的用戶端需要特殊的中繼狀態,您也可以在設定索引標籤中的IDP 起始的 SSO 中繼狀態欄位中設定。或者,瀏覽器可以在 RelayState 查詢參數中指定中繼狀態,例如 root/realms/{realm}/protocol/saml/clients/{url-name}?RelayState=thestate

當使用身分代理時,可以從外部 IDP 為用戶端設定 IDP 起始的登入。實際用戶端會如上所述在代理 IDP 上設定為 IDP 起始的登入。外部 IDP 必須為應用程式 IDP 起始的登入設定用戶端,這會指向代理的特殊 URL,並代表代理 IDP 中選定用戶端的 IDP 起始的登入端點。這表示在外部 IDP 的用戶端設定中

  • IDP 起始的 SSO URL 名稱會設定為將發佈為 IDP 起始的登入起點的名稱,

  • 細微 SAML 端點設定區段中的斷言消費者服務 POST 繫結 URL 必須設定為下列 URL:broker-root/realms/{broker-realm}/broker/{idp-name}/endpoint/clients/{client-id},其中

    • broker-root 是基本代理 URL

    • broker-realm 是代理上宣告外部 IDP 的領域名稱

    • idp-name 是代理上的外部 IDP 名稱

    • client-id 是在代理上定義的 SAML 用戶端的 IDP 起始的 SSO URL 名稱屬性的值。正是這個用戶端將可從外部 IDP 進行 IDP 起始的登入。

請注意,您可以從代理身分提供者 (IDP) 匯入基本的用戶端設定到外部 IDP 的用戶端設定中 - 只要使用代理 IDP 設定中的 SP 描述符,並在端點 URL 中加入 clients/client-id 即可。

使用實體描述符建立用戶端

您可以使用標準的 SAML 實體描述符 XML 檔案來匯入用戶端,而無需手動註冊 SAML 2.0 用戶端。

「用戶端」頁面包含 匯入用戶端 選項。

新增用戶端

Import SAML client

程序
  1. 點擊 瀏覽

  2. 載入包含 XML 實體描述符資訊的檔案。

  3. 檢查資訊以確保一切都已正確設定。

某些 SAML 用戶端轉接器(例如 mod-auth-mellon)需要 IDP 的 XML 實體描述符。您可以前往此 URL 找到此描述符

root/realms/{realm}/protocol/saml/descriptor

其中 realm 是您用戶端的領域。

為了從一個用戶端連結到另一個用戶端,Keycloak 提供了一個重新導向端點:/realms/realm_name/clients/{client-id}/redirect

如果用戶端使用 HTTP GET 請求存取此端點,Keycloak 會以 HTTP 307(暫時重新導向)的形式,在回應的 Location 標頭中傳回所提供用戶端和領域的設定基礎 URL。因此,用戶端只需要知道領域名稱和用戶端 ID 即可連結到它們。這種間接方式可以避免硬式編碼用戶端基礎 URL。

例如,假設領域為 master,用戶端 ID 為 account

http://host:port/realms/master/clients/account/redirect

這個 URL 會暫時重新導向至:http://host:port/realms/master/account

OIDC 權杖和 SAML 斷言對應

接收 ID 權杖、存取權杖或 SAML 斷言的應用程式可能需要不同的角色和使用者中繼資料。

您可以使用 Keycloak 來

  • 硬式編碼角色、宣告和自訂屬性。

  • 將使用者中繼資料提取到權杖或斷言中。

  • 重新命名角色。

您可以在管理主控台中的 對應器 標籤中執行這些動作。

對應器標籤

mappers oidc

新的用戶端沒有內建的對應器,但它們可以從用戶端範圍繼承一些對應器。有關更多詳細資訊,請參閱用戶端範圍章節

協定對應器會將項目(例如電子郵件地址)對應到身分和存取權杖中的特定宣告。對應器的功能應該從其名稱中不言自明。您可以按一下 新增內建 來新增預先設定的對應器。

每個對應器都有一組常見的設定。其他設定取決於對應器類型。按一下對應器旁的 編輯 來存取設定畫面,以調整這些設定。

對應器設定

mapper config

您可以將滑鼠游標停留在工具提示上來檢視每個選項的詳細資訊。

您可以使用大多數 OIDC 對應器來控制宣告的位置。您可以透過調整 新增至 ID 權杖新增至存取權杖 開關,選擇在 idaccess 權杖中包含或排除宣告。

您可以新增對應器類型,如下所示

程序
  1. 前往 對應器 標籤。

  2. 按一下 設定新的對應器

    新增對應器

    add mapper

  3. 從清單方塊中選取 對應器類型

優先順序

對應器實作具有優先順序優先順序不是對應器的設定屬性。它是對應器具體實作的屬性。

對應器會依對應器清單中的順序排序。權杖或斷言中的變更會依照該順序套用,其中最低的順序會先套用。因此,依賴其他實作的實作會依必要的順序處理。

例如,若要計算將包含在權杖中的角色

  1. 根據這些角色解析對象。

  2. 處理使用權杖中已有的角色和對象的 JavaScript 指令碼。

OIDC 使用者工作階段註記對應器

使用者工作階段詳細資訊是使用對應器定義的,並且當您在用戶端上使用或啟用某項功能時,會自動包含這些詳細資訊。按一下 新增內建 來包含工作階段詳細資訊。

模擬的使用者工作階段提供以下詳細資訊

  • IMPERSONATOR_ID:模擬使用者的 ID。

  • IMPERSONATOR_USERNAME:模擬使用者的使用者名稱。

服務帳戶工作階段提供以下詳細資訊

  • clientId:服務帳戶的用戶端 ID。

  • client_id:服務帳戶的用戶端 ID。

  • clientAddress:服務帳戶驗證裝置的遠端主機 IP。

  • clientHost:服務帳戶驗證裝置的遠端主機名稱。

指令碼對應器

使用 指令碼對應器,透過執行使用者定義的 JavaScript 程式碼,將宣告對應到權杖。有關將指令碼部署到伺服器的更多詳細資訊,請參閱 JavaScript 提供者

當指令碼部署時,您應該能夠從可用的對應器清單中選取已部署的指令碼。

成對主體識別符對應器

預設情況下,主體宣告 sub 由預設用戶端範圍 basic 中的 主體 (sub) 協定對應器對應。

若要使用成對主體識別符,可以使用 成對主體識別符 之類的協定對應器,您可以從 basic 用戶端範圍中移除 主體 (sub) 協定對應器。不過,這並非絕對必要,因為 主體 (sub) 協定對應器會在 成對主體識別符 對應器之前執行,因此成對值會覆寫主體對應器新增的值。這是由於主體對應器的優先順序所致。因此,移除內建的 主體 (sub) 對應器唯一的好處可能是透過避免使用協定對應器來節省一些效能,這可能沒有任何影響。

使用輕量型存取權杖

Keycloak 中的存取權杖包含敏感資訊,包括個人識別資訊 (PII)。因此,如果資源伺服器不想將這種類型的資訊揭露給第三方實體(例如用戶端),Keycloak 支援從存取權杖中移除 PII 的輕量型存取權杖。此外,當資源伺服器取得從存取權杖中移除的 PII 時,它可以透過將存取權杖傳送到 Keycloak 的權杖內省端點來取得 PII。

無法從輕量型存取權杖中移除的資訊

協定對應器可以控制將哪些資訊放入存取權杖中,而輕量型存取權杖會使用協定對應器。因此,無法從輕量型存取權杖中移除以下資訊。
expiatjtiisstypazpsidscopecnf

在 Keycloak 中使用輕量型存取權杖

透過將 用戶端原則use-lightweight-access-token 執行器套用至用戶端,用戶端可以接收輕量型存取權杖,而不是存取權杖。輕量型存取權杖包含由協定對應器控制的宣告,其中其設定 新增至輕量型存取權杖(預設為關閉)會開啟。此外,透過開啟其協定對應器的設定 新增至權杖內省,用戶端可以透過將存取權杖傳送到 Keycloak 的權杖內省端點來取得宣告。

內省端點

在某些情況下,使用 HTTP 標頭 Accept: application/jwt 而不是 Accept: application/json 來觸發權杖內省端點可能很有用,這對於輕量型存取權杖尤其有用。請參閱保護應用程式章節中 權杖內省端點 的詳細資訊。

產生用戶端轉接器設定

Keycloak 可以產生您可以用來在應用程式的部署環境中安裝用戶端轉接器的設定檔。OIDC 和 SAML 支援多種類型的轉接器。

  1. 按一下「動作」選單,然後選取 下載轉接器設定 選項

    client installation

  2. 選擇您想要產生設定檔的格式選項

支援所有適用於 OIDC 和 SAML 的 Keycloak 用戶端配接器。也支援適用於 SAML 的 mod-auth-mellon Apache HTTPD 配接器以及標準 SAML 實體描述檔。

用戶端範圍

使用 Keycloak 在名為用戶端範圍的實體中定義共用的用戶端設定。用戶端範圍會為多個用戶端設定協定對應器角色範圍對應

用戶端範圍也支援 OAuth 2 scope 參數。用戶端應用程式使用此參數來請求存取權杖中的宣告或角色,具體取決於應用程式的需求。

若要建立用戶端範圍,請依照下列步驟執行

  1. 按一下選單中的 用戶端範圍

    用戶端範圍清單

    client scopes list

  2. 點擊 建立

  3. 為您的用戶端範圍命名。

  4. 點擊 儲存

用戶端範圍具有與一般用戶端相似的索引標籤。您可以定義協定對應器角色範圍對應。這些對應可以由其他用戶端繼承,並設定為從此用戶端範圍繼承。

協定

當您建立用戶端範圍時,請選擇協定。連結在相同範圍中的用戶端必須具有相同的協定。

每個領域在選單中都有一組預先定義的內建用戶端範圍。

  • SAML 協定:role_list。此範圍包含一個用於 SAML 判斷提示中角色清單的協定對應器。

  • OpenID Connect 協定:有多個可用的用戶端範圍

    • 角色

      此範圍未在 OpenID Connect 規格中定義,並且不會自動新增至存取權杖中的 scope 宣告。此範圍具有對應器,這些對應器用於將使用者的角色新增至存取權杖,並為至少有一個用戶端角色的用戶端新增受眾。這些對應器在受眾章節中有更詳細的說明。

    • web-origins

      此範圍也未在 OpenID Connect 規格中定義,並且未新增至存取權杖中的 scope 宣告。此範圍用於將允許的 Web 來源新增至存取權杖 allowed-origins 宣告。

    • microprofile-jwt

      此範圍會處理在MicroProfile/JWT Auth 規格中定義的宣告。此範圍為 upn 宣告定義了使用者屬性對應器,並為 groups 宣告定義了領域角色對應器。可以變更這些對應器,以便可以使用不同的屬性來建立 MicroProfile/JWT 特定宣告。

    • offline_access

      當用戶端需要取得離線權杖時,會使用此範圍。關於離線權杖的更多詳細資訊,請參閱離線存取章節OpenID Connect 規格

    • profile

    • 電子郵件

    • address

    • phone

用戶端範圍 profileemailaddressphoneOpenID Connect 規格中定義。這些範圍沒有定義任何角色範圍對應,但它們確實定義了協定對應器。這些對應器對應於 OpenID Connect 規格中定義的宣告。

例如,當您開啟 phone 用戶端範圍並開啟 對應器 索引標籤時,您會看到協定對應器,這些對應器對應於規格中針對範圍 phone 定義的宣告。

用戶端範圍對應器

client scopes phone

phone 用戶端範圍連結到用戶端時,該用戶端會自動繼承 phone 用戶端範圍中定義的所有協定對應器。為此用戶端核發的存取權杖包含有關使用者的電話號碼資訊,前提是該使用者已定義電話號碼。

內建用戶端範圍包含規格中定義的協定對應器。您可以自由編輯用戶端範圍,並建立、更新或移除任何協定對應器或角色範圍對應。

用戶端範圍包含與同意畫面相關的選項。如果連結的用戶端在用戶端上啟用需要同意,這些選項會很有用。

在同意畫面上顯示

如果啟用在同意畫面上顯示,並且該範圍已新增至需要同意的用戶端,則同意畫面文字中指定的文字將會顯示在同意畫面上。當使用者通過驗證並從 Keycloak 重新導向至用戶端之前,會顯示此文字。如果停用在同意畫面上顯示,則此用戶端範圍將不會顯示在同意畫面上。

同意畫面文字

當此用戶端範圍新增至需要同意的用戶端時,同意畫面上顯示的文字預設為用戶端範圍的名稱。此文字的值可以透過使用 ${var-name} 字串指定取代變數來自訂。自訂值在您佈景主題的屬性檔案中設定。請參閱伺服器開發人員指南,以取得有關自訂的更多資訊。

將用戶端範圍與用戶端連結

用戶端範圍和用戶端之間的連結是在用戶端的 用戶端範圍 索引標籤中設定的。用戶端範圍和用戶端之間有兩種連結方式可用。

預設用戶端範圍

此設定適用於 OpenID Connect 和 SAML 用戶端。在為用戶端核發 OpenID Connect 權杖或 SAML 判斷提示時,會套用預設用戶端範圍。用戶端將會繼承在用戶端範圍中定義的協定對應器和角色範圍對應。對於 OpenID Connect 協定,無論 OpenID Connect 授權請求中 scope 參數使用的值為何,一律會套用對應器和角色範圍對應。

選用用戶端範圍

此設定僅適用於 OpenID Connect 用戶端。僅當 OpenID Connect 授權請求中的 scope 參數要求時,才會在為此用戶端核發權杖時套用選用用戶端範圍。

範例

在此範例中,假設用戶端具有連結為預設用戶端範圍的 profileemail,以及連結為選用用戶端範圍的 phoneaddress。當用戶端將請求傳送至 OpenID Connect 授權端點時,會使用 scope 參數的值。

scope=openid phone

scope 參數包含字串,其中 scope 值以空格分隔。值 openid 是用於所有 OpenID Connect 請求的中繼值。權杖將會包含來自預設用戶端範圍 profileemail 以及 phone 的對應器和角色範圍對應,這是由 scope 參數要求的選用用戶端範圍。

評估用戶端範圍

對應器索引標籤包含協定對應器,而 範圍 索引標籤包含為此用戶端宣告的角色範圍對應。它們不包含從用戶端範圍繼承的對應器和範圍對應。可以查看有效的協定對應器(即在用戶端本身定義以及從連結的用戶端範圍繼承的協定對應器)和在為用戶端產生權杖時使用的有效角色範圍對應。

程序
  1. 按一下用戶端的 用戶端範圍 索引標籤。

  2. 開啟子索引標籤 評估

  3. 選取您想要套用的選用用戶端範圍。

這也會向您顯示 scope 參數的值。此參數需要從應用程式傳送到 Keycloak OpenID Connect 授權端點。

評估用戶端範圍

client scopes evaluate

若要從您的應用程式傳送 scope 參數的自訂值,請參閱保護應用程式章節中的 Keycloak JavaScript 配接器,以了解 javascript 配接器。

所有範例都是針對特定使用者產生,並針對特定用戶端核發,並指定 scope 參數的值。範例包含所有使用的宣告和角色對應。

用戶端範圍權限

當向使用者核發權杖時,只有在允許使用者使用時,才會套用用戶端範圍。

當用戶端範圍未定義任何角色範圍對應時,允許每個使用者使用此用戶端範圍。但是,當用戶端範圍定義了角色範圍對應時,使用者必須至少是其中一個角色的成員。使用者角色和用戶端範圍的角色之間必須存在交集。複合角色會納入評估此交集。

如果未允許使用者使用用戶端範圍,則在產生權杖時不會使用任何協定對應器或角色範圍對應。用戶端範圍不會出現在權杖中的 scope 值中。

領域預設用戶端範圍

使用 領域預設用戶端範圍 來定義自動連結至新建立用戶端的用戶端範圍集。

程序
  1. 按一下用戶端的 用戶端範圍 索引標籤。

從這裡,選取您想要新增為新建立用戶端的 預設用戶端範圍選用用戶端範圍 的用戶端範圍。

預設用戶端範圍

client scopes default

當建立用戶端時,您可以根據需要取消連結預設用戶端範圍。這類似於移除預設角色

範圍說明

用戶端範圍

用戶端範圍是 Keycloak 中在 Realm 層級設定且可以連結到用戶端的實體。當請求連同對應的 scope 參數值傳送到 Keycloak 授權端點時,會依名稱參考用戶端範圍。請參閱用戶端範圍連結章節以取得更多詳細資訊。

角色範圍對應

此功能在用戶端或用戶端範圍的 範圍 標籤下可用。使用 角色範圍對應 來限制可在存取權杖中使用的角色。請參閱角色範圍對應章節以取得更多詳細資訊。

授權範圍

授權範圍涵蓋可以在應用程式中執行的動作。請參閱授權服務指南以取得更多詳細資訊。

用戶端策略

為了讓保護用戶端應用程式變得容易,以統一方式實現以下幾點是有益的。

  • 設定用戶端可以擁有哪些組態的策略

  • 驗證用戶端組態

  • 符合所需的安全性標準和設定檔,例如金融級 API (FAPI) 和 OAuth 2.1

為了以統一方式實現這些點,引入了用戶端策略概念。

使用案例

用戶端策略實現了以下提到的幾點。

設定用戶端可以擁有哪些組態的策略

在用戶端建立/更新期間,用戶端策略可以強制執行用戶端上的組態設定,而且在發送到 Keycloak 伺服器的 OpenID Connect 請求期間,這些設定與特定的用戶端相關。Keycloak 也透過保護應用程式指南用戶端註冊服務中描述的 用戶端註冊策略支援類似的功能。但是,用戶端註冊策略只能涵蓋 OIDC 動態用戶端註冊。用戶端策略不僅涵蓋用戶端註冊策略可以執行的動作,還涵蓋其他用戶端註冊和組態方式。目前的計劃是將用戶端註冊取代為用戶端策略。

驗證用戶端組態

Keycloak 支援驗證用戶端是否遵循「程式碼交換的證明金鑰」、「請求物件簽署演算法」、「金鑰持有者權杖」等設定,以及一些端點,例如授權端點、權杖端點等等。這些可以由每個設定項目 (在管理主控台中,切換、下拉式選單等等) 指定。為了保護用戶端應用程式,管理員需要以適當的方式設定許多設定,這使得管理員難以保護用戶端應用程式。用戶端策略可以執行上述提到的這些用戶端組態的驗證,並且還可以用於自動設定某些用戶端組態開關,以滿足進階的安全性需求。將來,個別的用戶端組態設定可能會由直接執行所需驗證的用戶端策略取代。

符合所需的安全性標準和設定檔,例如 FAPI 和 OAuth 2.1

全域用戶端設定檔是預設在 Keycloak 中預先設定的用戶端設定檔。它們預先設定為符合標準安全設定檔,例如保護應用程式章節中的 FAPIOAuth 2.1,這使得管理員可以輕鬆保護其用戶端應用程式以符合特定的安全性設定檔。目前,Keycloak 具有支援 FAPI 和 OAuth 2.1 規格的全域設定檔。管理員只需要設定用戶端策略來指定哪些用戶端應符合 FAPI 和 OAuth 2.1 即可。管理員可以設定用戶端設定檔和用戶端策略,以便可以輕鬆使 Keycloak 用戶端符合各種其他安全性設定檔,例如 SPA、原生應用程式、開放銀行等等。

通訊協定

用戶端策略概念獨立於任何特定的通訊協定。Keycloak 目前特別支援用於OpenID Connect (OIDC) 通訊協定的用戶端設定檔,但也提供了用於SAML 通訊協定的用戶端設定檔。

架構

用戶端策略包含四個建構區塊:條件、執行器、設定檔和策略。

條件

條件決定採用策略的用戶端以及何時採用策略。某些條件在用戶端建立/更新時檢查,而其他條件則在用戶端請求期間檢查 (OIDC 授權請求、權杖端點請求等等)。條件檢查是否滿足一個指定的準則。例如,某些條件會檢查用戶端的存取類型是否為機密。

條件不能單獨使用。它可以用於之後描述的策略中。

條件可以像其他可設定的提供者一樣進行設定。可以設定的內容取決於每個條件的性質。

提供以下條件

建立/更新用戶端的方式
  • 動態用戶端註冊 (匿名或使用初始存取權杖或註冊存取權杖驗證)

  • 管理 REST API (管理主控台等等)

因此,例如,在建立用戶端時,可以將條件設定為當此用戶端是由沒有初始存取權杖的 OIDC 動態用戶端註冊 (匿名動態用戶端註冊) 建立時評估為 true。因此,此條件可用於例如確保透過 OIDC 動態用戶端註冊註冊的所有用戶端都符合 FAPI 或 OAuth 2.1。

用戶端的作者 (透過是否存在於特定角色或群組來檢查)

在 OpenID Connect 動態用戶端註冊上,用戶端的作者是經過驗證以取得用於產生新用戶端的存取權杖的最終使用者,而不是實際使用存取權杖存取註冊端點的現有用戶端的服務帳戶。透過管理 REST API 進行註冊時,用戶端的作者是 Keycloak 的管理員等最終使用者。

用戶端存取類型 (機密、公開、僅持有者)

例如,當用戶端發送授權請求時,如果此用戶端為機密,則會採用策略。機密用戶端已啟用用戶端驗證,而公開用戶端已停用用戶端驗證。僅持有者是一種已棄用的用戶端類型。

用戶端範圍

如果用戶端具有特定的用戶端範圍 (作為預設範圍或在目前請求中使用的選用範圍),則評估為 true。這可用於例如確保具有範圍 fapi-example-scope 的 OIDC 授權請求需要符合 FAPI。

用戶端角色

適用於具有指定名稱的用戶端角色的用戶端。通常,您可以為請求的用戶端建立指定名稱的用戶端角色,並將其用作「標記角色」,以確保指定的用戶端策略將應用於請求的用戶端。

通常存在要求對指定的用戶端 (例如 my-client-1my-client-2) 應用特定用戶端策略的使用案例。實現此結果的最佳方法是在您的策略中使用 用戶端角色條件,然後為請求的用戶端建立指定名稱的用戶端角色。此用戶端角色可以用作「標記角色」,專門用於標記特定用戶端的特定用戶端策略。
用戶端網域名稱、主機或 IP 位址

適用於用戶端的特定網域名稱。或適用於管理員從特定主機或 IP 位址註冊/更新用戶端的情況。

用戶端屬性

適用於具有指定名稱和值的用戶端屬性的用戶端。如果您指定多個用戶端屬性,它們將使用 AND 條件進行評估。如果您想要使用 OR 條件進行評估,請多次設定此條件。

任何用戶端

此條件始終評估為 true。它可以用於例如確保特定 Realm 中的所有用戶端都符合 FAPI。

執行器

執行器指定在採用策略的用戶端上執行的動作。執行器執行一個或多個指定的動作。例如,某些執行器會檢查授權請求中參數 redirect_uri 的值是否與授權端點上預先註冊的其中一個重新導向 URI 完全符合,如果不符合,則會拒絕此請求。

執行器不能單獨使用。它可以用於之後描述的設定檔中。

執行器可以像其他可設定的提供者一樣進行設定。可以設定的內容取決於每個執行器的性質。

執行器會對各種事件採取動作。執行器實作可以忽略某些類型的事件 (例如,用於檢查 OIDC request 物件的執行器僅對 OIDC 授權請求採取動作)。事件為

  • 建立用戶端 (包括透過動態用戶端註冊建立)

  • 更新用戶端

  • 發送授權請求

  • 發送權杖請求

  • 發送權杖重新整理請求

  • 發送權杖撤銷請求

  • 發送權杖內省請求

  • 發送使用者資訊請求

  • 發送包含重新整理權杖的登出請求 (請注意,使用重新整理權杖登出是任何規格都不支援的 Keycloak 專有功能。更建議您依賴官方 OIDC 登出)。

在每個事件中,執行器都可以在多個階段中運作。例如,在建立/更新用戶端時,執行器可以透過自動設定特定用戶端設定來修改用戶端組態。之後,執行器會在驗證階段中驗證此組態。

此執行器 (executor) 的數個目的之一,是實現客戶端一致性設定檔(例如 FAPI 和 OAuth 2.1)的安全需求。為此,需要以下執行器:

  • 強制使用安全的 用戶端驗證方法 來驗證用戶端

  • 強制使用 金鑰持有者 (Holder-of-key) 權杖

  • 強制使用 程式碼交換證明金鑰 (PKCE)

  • 強制使用安全的簽章演算法來進行 已簽署的 JWT 用戶端驗證 (private-key-jwt)

  • 強制使用 HTTPS 重新導向 URI,並確保設定的重新導向 URI 不包含萬用字元

  • 強制 OIDC request 物件符合高安全性等級

  • 強制 OIDC 混合流程的回應類型,包括用作 FAPI 1 規範中所述「分離式簽章」的 ID 權杖,這表示從授權回應傳回的 ID 權杖不會包含使用者設定檔資料

  • 強制更安全地處理 statenonce 參數,以防止 CSRF 攻擊

  • 強制在用戶端註冊時使用更安全的簽章演算法

  • 強制在 CIBA 請求中使用 binding_message 參數

  • 強制執行 用戶端密鑰輪換

  • 強制執行用戶端註冊存取權杖

  • 強制檢查用戶端是否為在開始授權碼流程以取得存取權杖之前發出意圖的用戶端,例如英國開放銀行 (UK OpenBanking)

  • 強制禁止隱式和混合流程

  • 強制檢查 PAR 請求是否包含授權請求所需的必要參數

  • 強制使用 DPoP 綁定權杖 (當啟用 dpop 功能時可用)

  • 強制 使用輕量級存取權杖

  • 強制跳過重新整理權杖輪換,且從重新整理權杖回應中不會傳回重新整理權杖

  • 強制使用 OAuth 2.1 規範要求的有效重新導向 URI

  • 強制不能使用 SAML 重新導向綁定,或 SAML 請求和斷言必須簽署

設定檔

設定檔由數個執行器組成,可以實現 FAPI 和 OAuth 2.1 等安全性設定檔。設定檔可透過管理 REST API (管理主控台) 及其執行器一起設定。有三個「全域設定檔」,預設會在 Keycloak 中設定,並預先配置符合 FAPI 1 Baseline、FAPI 1 Advanced、FAPI CIBA、FAPI 2 和 OAuth 2.1 規範的執行器。更多詳細資訊請參閱 保護應用程式 章節中的FAPIOAuth 2.1

原則

原則由數個條件和設定檔組成。此原則可以套用至符合此原則所有條件的用戶端。原則會參考數個設定檔,而這些設定檔的所有執行器都會針對採用此原則的用戶端執行其任務。

組態設定

原則、設定檔、條件、執行器可以透過管理 REST API 進行設定,這也表示管理主控台。若要執行此操作,請到「領域」→「領域設定」→「用戶端原則」索引標籤,這表示管理員可以為每個領域設定用戶端原則。

全域用戶端設定檔」在每個領域中都會自動提供。但是,預設不會設定任何用戶端原則。這表示,如果管理員希望其領域的用戶端符合 FAPI 標準,則始終需要建立任何用戶端原則。全域設定檔無法更新,但如果管理員想要對全域設定檔設定進行一些小變更,可以輕鬆地將它們用作範本並建立自己的設定檔。管理主控台中提供 JSON 編輯器,可簡化根據某些全域設定檔建立新設定檔的程序。

回溯相容性

用戶端原則可以取代「保護應用程式指南」中的用戶端註冊服務中所述的用戶端註冊原則。但是,用戶端註冊原則仍然會同時存在。這表示,例如,在動態用戶端註冊請求期間建立/更新用戶端時,會同時套用用戶端原則和用戶端註冊原則。

目前的計畫是移除用戶端註冊原則功能,並將現有的用戶端註冊原則自動移轉到新的用戶端原則中。

用戶端密鑰輪換範例

請參閱 用戶端密鑰輪換 的範例設定。

使用金鑰庫取得密鑰

Keycloak 目前提供了兩種現成可用的 Vault SPI 實作:基於純文字檔案的金鑰庫和基於 Java KeyStore 的金鑰庫。

若要從金鑰庫取得密鑰,而不是直接輸入,請在適當的欄位中輸入以下特殊製作的字串

${vault.key}

其中 key 是金鑰庫識別的密鑰名稱。

為了防止密鑰洩漏到不同的領域,Keycloak 會將領域名稱與從金鑰庫運算式取得的 key 結合在一起。此方法表示 key 不會直接對應到金鑰庫中的項目,而是根據用於將 key 與領域名稱組合的演算法建立最終項目名稱。在基於檔案的金鑰庫中,這種組合會反映到特定的檔名,而在基於 Java KeyStore 的金鑰庫中,則會反映到特定的別名。

您可以在以下欄位中從金鑰庫取得密鑰

SMTP 密碼

在領域 SMTP 設定

LDAP 繫結認證

在基於 LDAP 的使用者聯合的 LDAP 設定中。

OIDC 身分提供者密鑰

在身分提供者 OpenID Connect 設定內的「用戶端密鑰」中

金鑰解析器

所有內建的提供者都支援金鑰解析器的組態設定。金鑰解析器會實作演算法或策略,以將領域名稱與從 ${vault.key} 運算式取得的金鑰組合,成為用於從金鑰庫擷取密鑰的最終項目名稱。Keycloak 使用 keyResolvers 屬性來設定提供者使用的解析器。此值是以逗號分隔的解析器名稱清單。以下是 files-plaintext 提供者的組態設定範例

kc.[sh|bat] start --spi-vault-file-key-resolvers=REALM_UNDERSCORE_KEY,KEY_ONLY

解析器會按照您在組態設定中宣告的相同順序執行。對於每個解析器,Keycloak 會使用解析器產生的最後一個項目名稱,它會將領域與金鑰庫金鑰組合以搜尋金鑰庫的密鑰。如果 Keycloak 找到密鑰,則會傳回密鑰。如果沒有找到,Keycloak 會使用下一個解析器。這種搜尋會持續進行,直到 Keycloak 找到非空的密鑰或沒有解析器可用為止。如果 Keycloak 找不到密鑰,則會傳回空的密鑰。

在先前的範例中,Keycloak 會先使用 REALM_UNDERSCORE_KEY 解析器。如果 Keycloak 在金鑰庫中找到使用該解析器的項目,則 Keycloak 會傳回該項目。如果沒有找到,則 Keycloak 會再次使用 KEY_ONLY 解析器進行搜尋。如果 Keycloak 找到使用 KEY_ONLY 解析器的項目,則 Keycloak 會傳回該項目。如果 Keycloak 使用所有解析器,則會傳回空的密鑰。

以下是目前可用解析器的清單

名稱 說明

KEY_ONLY

Keycloak 會忽略領域名稱,並使用金鑰庫運算式中的金鑰。

REALM_UNDERSCORE_KEY

Keycloak 會使用底線字元來組合領域和金鑰。Keycloak 會使用另一個底線字元來逸出領域或金鑰中出現的底線。例如,如果領域稱為 master_realm,而金鑰為 smtp_key,則組合的金鑰為 master__realm_smtp__key

REALM_FILESEPARATOR_KEY

Keycloak 會使用平台檔案分隔符號字元來組合領域和金鑰。

FACTORY_PROVIDED

Keycloak 會使用金鑰庫提供者工廠的 VaultKeyResolver 來組合領域和金鑰,允許透過擴充現有的工廠並實作 getFactoryResolver 方法來建立自訂金鑰解析器。

如果您沒有為內建提供者設定解析器,則 Keycloak 會選取 REALM_UNDERSCORE_KEY

設定稽核以追蹤事件

Keycloak 包含一套稽核功能。您可以記錄每個登入和管理員動作,並在管理主控台中檢閱這些動作。Keycloak 也包含一個接聽器 SPI,可接聽事件並觸發動作。內建接聽器的範例包括記錄檔和在發生事件時傳送電子郵件。

稽核使用者事件

您可以記錄和檢視影響使用者的每個事件。Keycloak 會針對成功的使用者登入、使用者輸入不正確的密碼或更新使用者帳戶等動作觸發登入事件。預設情況下,Keycloak 不會在管理主控台中儲存或顯示事件。只有錯誤事件才會記錄到管理主控台和伺服器的記錄檔中。

程序

使用此程序開始稽核使用者事件。

  1. 點擊功能表中的 領域設定

  2. 按一下「事件」索引標籤。

  3. 按一下「使用者事件設定」索引標籤。

  4. 儲存事件切換為開啟

    使用者事件設定

    User events settings

  5. 到期欄位中指定儲存事件的時間長度。

  6. 點擊新增儲存類型以查看其他可以儲存的事件。

    新增類型

    Add types

  7. 點擊 新增

當您想刪除所有已儲存的事件時,請點擊清除使用者事件

程序

您現在可以檢視事件。

  1. 點擊選單中的事件標籤。

    使用者事件

    Login Events

  2. 要篩選事件,請點擊搜尋使用者事件

    搜尋使用者事件

    Search user event

事件類型

登入事件

事件 說明

登入

使用者登入。

註冊

使用者註冊。

登出

使用者登出。

代碼換取權杖

應用程式或客戶端交換代碼以取得權杖。

重新整理權杖

應用程式或客戶端重新整理權杖。

暴力破解保護

事件 說明

使用者因永久鎖定而停用

由於登入失敗次數過多,暴力破解保護永久停用了使用者帳戶。

使用者因暫時鎖定而停用

由於登入失敗次數過多,暴力破解保護暫時停用了使用者帳戶。

身分代理

事件 說明

聯合身分連結覆寫

現有的聯合身分連結被覆寫

聯合身分連結覆寫錯誤

嘗試覆寫現有的聯合身分連結時發生錯誤

OAuth

事件 說明

OAuth2 擴充授權

已執行 OAuth2 授權

OAuth2 擴充授權錯誤

在執行 OAuth2 授權期間發生錯誤

帳戶事件

事件 說明

社群連結

使用者帳戶連結到社群媒體提供者。

移除社群連結

從社群媒體帳戶到使用者帳戶的連結斷開。

更新電子郵件

帳戶的電子郵件地址變更。

更新設定檔

帳戶的個人資料變更。

傳送密碼重設

Keycloak 傳送密碼重設電子郵件。

更新密碼 (已棄用)

帳戶的密碼變更。

更新憑證

帳戶的密碼或 (基於時間的) 一次性密碼 (OTP/TOTP) 設定變更。

更新 TOTP (已棄用)

帳戶的基於時間的一次性密碼 (TOTP) 設定變更。

移除 TOTP (已棄用)

Keycloak 從帳戶中移除 TOTP。

移除憑證

Keycloak 從帳戶中移除憑證。

傳送驗證電子郵件

Keycloak 傳送電子郵件驗證電子郵件。

驗證電子郵件

Keycloak 驗證帳戶的電子郵件地址。

每個事件都有對應的錯誤事件。

事件監聽器

事件監聽器監聽事件並根據該事件執行動作。Keycloak 包括兩個內建的監聽器:記錄事件監聽器和電子郵件事件監聽器。

記錄事件監聽器

當啟用記錄事件監聽器時,此監聽器會在發生錯誤事件時寫入日誌檔。

來自記錄事件監聽器的日誌訊息範例

11:36:09,965 WARN  [org.keycloak.events] (default task-51) type=LOGIN_ERROR, realmId=master,
                    clientId=myapp,
                    userId=19aeb848-96fc-44f6-b0a3-59a17570d374, ipAddress=127.0.0.1,
                    error=invalid_user_credentials, auth_method=openid-connect, auth_type=code,
                    redirect_uri=https://127.0.0.1:8180/myapp,
                    code_id=b669da14-cdbb-41d0-b055-0810a0334607, username=admin

您可以使用記錄事件監聽器來防範駭客機器人攻擊

  1. 在日誌檔中解析 LOGIN_ERROR 事件。

  2. 擷取失敗登入事件的 IP 位址。

  3. 將 IP 位址傳送至入侵防禦軟體架構工具。

記錄事件監聽器將事件記錄到 org.keycloak.events 日誌類別。預設情況下,Keycloak 不會在伺服器日誌中包含偵錯日誌事件。

若要在伺服器日誌中包含偵錯日誌事件

  1. 變更 org.keycloak.events 類別的日誌層級

  2. 變更記錄事件監聽器使用的日誌層級。

若要變更記錄事件監聽器使用的日誌層級,請新增以下內容

bin/kc.[sh|bat] start --spi-events-listener-jboss-logging-success-level=info --spi-events-listener-jboss-logging-error-level=error

日誌層級的有效值為 debuginfowarnerrorfatal

電子郵件事件監聽器

電子郵件事件監聽器會在事件發生時傳送訊息至使用者的電子郵件地址,並支援以下事件

  • 登入錯誤。

  • 更新密碼。

  • 更新基於時間的一次性密碼 (TOTP)。

  • 移除一次性密碼 (OTP)。

  • 更新憑證。

  • 移除憑證。

需要符合以下條件才能傳送電子郵件

  • 使用者有電子郵件地址。

  • 使用者的電子郵件地址已標記為已驗證。

先決條件
  • 已設定領域的電子郵件設定。

程序

若要啟用電子郵件監聽器

  1. 點擊功能表中的 領域設定

  2. 按一下「事件」索引標籤。

  3. 點擊事件監聽器欄位。

  4. 選取 email

    事件監聽器

    Event listeners

您可以使用 --spi-events-listener-email-exclude-events 引數排除事件。例如

kc.[sh|bat] --spi-events-listener-email-exclude-events=UPDATE_CREDENTIAL,REMOVE_CREDENTIAL

稽核管理員事件

您可以記錄管理員在管理主控台中執行的所有動作。管理主控台透過呼叫 Keycloak REST 介面來執行管理動作,而 Keycloak 會稽核這些 REST 呼叫。您可以在管理主控台中檢視產生的事件。

程序

使用此程序開始稽核管理動作。

  1. 點擊功能表中的 領域設定

  2. 按一下「事件」索引標籤。

  3. 點擊管理員事件設定標籤。

  4. 儲存事件切換為開啟

    Keycloak 會顯示包含表示法切換鈕。

  5. 包含表示法切換為開啟

    包含表示法 切換鈕包含透過管理 REST API 傳送的 JSON 文件,因此您可以檢視管理員的動作。

    管理員事件設定

    Admin events settings

  6. 點擊 儲存

  7. 若要清除資料庫中儲存的動作,請點擊清除管理員事件

程序

您現在可以檢視管理員事件。

  1. 點擊選單中的事件

  2. 點擊管理員事件標籤。

    管理員事件

    Admin events

包含表示法 切換鈕為開啟時,可能會導致在資料庫中儲存大量資訊。您可以使用 --spi-events-store-jpa-max-field-length 引數設定表示法的最大長度。如果您想要遵守基礎儲存限制,此設定很有用。例如

kc.[sh|bat] --spi-events-store-jpa-max-field-length=2500

減輕安全性威脅

任何驗證伺服器都存在安全性漏洞。請參閱網際網路工程任務組 (IETF) 的 OAuth 2.0 威脅模型OAuth 2.0 安全性最佳現行做法以取得更多資訊。

主機

Keycloak 以多種方式使用公用主機名稱,例如在權杖簽發者欄位和密碼重設電子郵件中的 URL 中。

預設情況下,主機名稱來自請求標頭。沒有驗證可確保主機名稱有效。如果您未使用具有 Keycloak 的負載平衡器或 Proxy 來防止無效的主機標頭,請設定可接受的主機名稱。

主機名稱的服務提供者介面 (SPI) 提供了一種為請求設定主機名稱的方法。您可以使用此內建提供者為前端請求設定固定的 URL,同時允許基於請求 URI 的後端請求。如果內建提供者不具備所需的功能,您可以開發自訂提供者。

管理端點和管理主控台

Keycloak 在與非管理用途相同的埠上公開管理 REST API 和 Web 主控台。如果不需要外部存取,請勿在外部公開管理端點。

暴力破解攻擊

暴力破解攻擊嘗試透過多次嘗試登入來猜測使用者的密碼。Keycloak 具有暴力破解偵測功能,如果登入失敗次數超過指定的臨界值,它可以暫時停用使用者帳戶。

Keycloak 預設停用暴力破解偵測。啟用此功能以防範暴力破解攻擊。

程序

若要啟用此保護

  1. 點擊選單中的領域設定

  2. 點擊 安全性防禦 頁籤。

  3. 點擊暴力破解偵測標籤。

    暴力破解偵測

    brute force

當 Keycloak 偵測到攻擊時,可以部署永久鎖定和暫時鎖定動作。永久鎖定會停用使用者帳戶,直到管理員重新啟用它。暫時鎖定會在特定時間段內停用使用者帳戶。隨著攻擊持續進行,並且後續失敗達到 最大登入失敗次數 的倍數,停用帳戶的時間段會增加。

當使用者被暫時鎖定並嘗試登入時,Keycloak 會顯示預設的 無效的使用者名稱或密碼 錯誤訊息。此訊息與針對無效使用者名稱或無效密碼顯示的訊息相同,以確保攻擊者不知道該帳戶已停用。

常用參數

名稱 說明 預設值

最大登入失敗次數

最大登入失敗次數。

30 次失敗。

快速登入檢查毫秒數

登入嘗試之間的最小時間。

1000 毫秒。

最短快速登入等待時間

當登入嘗試速度快於快速登入檢查毫秒數時,使用者被停用的最短時間。

1 分鐘。

暫時鎖定參數

名稱 說明 預設值

等待時間增量

當使用者的登入嘗試次數超過最大登入失敗次數時,會新增至使用者被暫時停用的時間。

1 分鐘。

最大等待時間

使用者被暫時停用的最大時間。

15 分鐘。

失敗重設時間

失敗計數重設的時間。計時器從上次失敗登入開始執行。請確保此數字始終大於 最大等待時間;否則,有效的等待時間將永遠不會達到您設定為 最大等待時間 的值。

12 小時。

暫時鎖定演算法

  1. 成功登入時

    1. 重設 count

  2. 失敗登入時

    1. 如果此失敗與上次失敗之間的時間大於失敗重設時間

      1. 重設 count

    2. 遞增 count

    3. 根據定義的暴力破解策略計算 wait (請參閱下面的設定等待時間策略)。

    4. 如果 wait 小於 0,且此失敗與上次失敗之間的時間小於快速登入檢查毫秒數,則將 wait 設定為最短快速登入等待時間

      1. 將使用者暫時停用,時間為 wait最大等待時間中較小的值 (以秒為單位)

      2. 增加臨時鎖定計數器

當暫時停用的帳戶登入失敗時,count 不會遞增。

設定等待時間的策略

Keycloak 提供兩種策略來計算等待時間:倍數或線性。倍數是 Keycloak 最初引入的策略,因此是預設策略。

採用倍數策略時,當失敗次數(或計數)是 Max Login Failure 的倍數時,等待時間會增加。例如,如果您將 Max Login Failures 設定為 5,並將 Wait Increment 設定為 30 秒,則帳戶在多次驗證失敗嘗試後停用的有效時間將會是

失敗次數

等待時間增量

最大登入失敗次數

有效等待時間

1

30

5

0

2

30

5

0

3

30

5

0

4

30

5

0

5

30

5

30

6

30

5

30

7

30

5

30

8

30

5

30

9

30

5

30

10

30

5

60

在第 5 次驗證失敗嘗試的 Effective Wait Time 時,該帳戶將被停用 30 秒。達到 Max Login Failures 的下一個倍數(在本例中為 10)後,時間會從 30 秒增加到 60 秒。

倍數策略使用以下公式來計算等待時間:Wait Increment * (count / Max Login Failures)。此除法為整數除法,向下捨入為整數。

對於線性策略,當失敗次數(或計數)等於或大於 Max Login Failure 時,等待時間會增加。例如,如果您已將 Max Login Failures 設定為 5,並將 Wait Increment 設定為 30 秒,則帳戶在多次驗證失敗嘗試後停用的有效時間將會是

失敗次數

等待時間增量

最大登入失敗次數

有效等待時間

1

30

5

0

2

30

5

0

3

30

5

0

4

30

5

0

5

30

5

30

6

30

5

60

7

30

5

90

8

30

5

120

9

30

5

150

10

30

5

180

在第 5 次驗證失敗嘗試的 Effective Wait Time 時,該帳戶將被停用 30 秒。每次新的失敗嘗試都會增加等待時間。

線性策略使用以下公式來計算等待時間:Wait Increment * (1 + count - Max Login Failures)。

永久鎖定參數

名稱 說明 預設值

最大臨時鎖定次數

在發生永久鎖定之前允許的最大臨時鎖定次數。

0

永久鎖定流程

  1. 遵循臨時鎖定流程

  2. 如果臨時鎖定計數器超過最大臨時鎖定次數

    1. 永久停用使用者

當 Keycloak 停用使用者時,使用者將無法登入,直到管理員啟用該使用者。啟用帳戶會重置 count

Keycloak 暴力破解偵測的缺點是伺服器容易受到阻斷服務攻擊。在實施阻斷服務攻擊時,攻擊者可以嘗試透過猜測任何已知帳戶的密碼來登入,最終導致 Keycloak 停用這些帳戶。

考慮使用入侵防禦軟體 (IPS)。Keycloak 會記錄每次登入失敗和用戶端 IP 位址失敗。您可以將 IPS 指向 Keycloak 伺服器的記錄檔,而 IPS 可以修改防火牆以封鎖來自這些 IP 位址的連線。

密碼策略

請確保您具有複雜的密碼策略,以強制使用者選擇複雜的密碼。請參閱密碼策略章節以取得更多資訊。透過設定 Keycloak 伺服器使用一次性密碼來防止密碼猜測。

唯讀使用者屬性

儲存在 Keycloak 中的典型使用者具有與其使用者個人資料相關的各種屬性。這些屬性包括電子郵件、firstName 或 lastName。但是,使用者也可能具有非典型個人資料資料,而是中繼資料的屬性。中繼資料屬性通常對使用者而言應該是唯讀的,而且一般使用者絕不應該能夠從 Keycloak 使用者介面或帳戶 REST API 更新這些屬性。某些屬性即使在使用管理 REST API 建立或更新使用者時,也應該對管理員唯讀。

中繼資料屬性通常是來自以下群組的屬性

  • 與使用者儲存提供者相關的各種連結或中繼資料。例如,在 LDAP 整合的情況下,LDAP_ID 屬性包含使用者在 LDAP 伺服器中的 ID。

  • 使用者儲存所提供的中繼資料。例如,由 LDAP 提供的 createdTimestamp 應該永遠對使用者或管理員唯讀。

  • 與各種驗證器相關的中繼資料。例如,KERBEROS_PRINCIPAL 屬性可以包含特定使用者的 Kerberos 主體名稱。同樣地,屬性 usercertificate 可以包含與將使用者與 X.509 憑證中的資料繫結相關的中繼資料,這通常在啟用 X.509 憑證驗證時使用。

  • 與應用程式/用戶端使用者識別碼相關的中繼資料。例如,saml.persistent.name.id.for.my_app 可以包含 SAML NameID,用戶端應用程式 my_app 將使用它作為使用者的識別碼。

  • 與授權策略相關的中繼資料,用於屬性式存取控制 (ABAC)。這些屬性的值可以用於授權決策。因此,這些屬性無法由使用者更新非常重要。

從長遠來看,Keycloak 將具有適當的使用者設定檔 SPI,允許對每個使用者屬性進行細微設定。目前此功能尚未完全可用。因此,Keycloak 具有使用者屬性的內部清單,這些屬性對使用者唯讀,且對在伺服器層級設定的管理員唯讀。

以下是 Keycloak 預設提供者和功能在內部使用的唯讀屬性清單,因此始終是唯讀的

  • 對於使用者:KERBEROS_PRINCIPALLDAP_IDLDAP_ENTRY_DNCREATED_TIMESTAMPcreateTimestampmodifyTimestampuserCertificatesaml.persistent.name.id.for.*ENABLEDEMAIL_VERIFIED

  • 對於管理員:KERBEROS_PRINCIPALLDAP_IDLDAP_ENTRY_DNCREATED_TIMESTAMPcreateTimestampmodifyTimestamp

系統管理員可以將其他屬性新增至此清單。目前組態在伺服器層級可用。

您可以使用 spi-user-profile-declarative-user-profile-read-only-attributes`spi-user-profile-declarative-user-profile-admin-read-only-attributes 選項來新增此組態。例如

kc.[sh|bat] start --spi-user-profile-declarative-user-profile-read-only-attributes=foo,bar*

在此範例中,使用者和管理員將無法更新屬性 foo。使用者將無法編輯任何以 bar 開頭的屬性。例如 barbarrier。組態不區分大小寫,因此在此範例中也會拒絕 FOOBarRier 等屬性。萬用字元 * 僅在屬性名稱的結尾支援,因此管理員可以有效地拒絕所有以指定字元開頭的屬性。屬性中間的 * 會被視為一般字元。

驗證使用者屬性

藉由管理使用者屬性中的功能,管理員可以限制使用者針對屬性輸入的資料,例如,在使用者註冊或帳戶主控台中。

管理員不應允許使用者使用未受管理的屬性,以防止攻擊者新增無限制的屬性。屬性應該具有驗證,限制攻擊者輸入的資料量。

當使用正規表示式驗證使用者屬性時,請避免使用會佔用過多記憶體或 CPU 的正規表示式。請參閱 OWASP 的正規表示式阻斷服務以取得詳細資訊。

點擊劫持

點擊劫持是一種欺騙使用者點擊與使用者感知不同的使用者介面元素的技術。惡意網站會將目標網站載入透明的 iFrame 中,該 iFrame 覆蓋在目標網站上重要按鈕正下方的一組虛擬按鈕之上。當使用者點擊可見的按鈕時,他們會點擊隱藏頁面上的按鈕。攻擊者可以使用此方法竊取使用者的驗證憑證並存取其資源。

根據預設,Keycloak 的每個回應都會設定一些特定的 HTTP 標頭,可以防止這種情況發生。具體來說,它會設定 X-Frame-OptionsContent-Security-Policy。您應該查看這兩個標頭的定義,因為您可以控制大量的細微瀏覽器存取權。

程序

在管理主控台中,您可以指定 X-Frame-Options 和 Content-Security-Policy 標頭的值。

  1. 按一下領域設定功能表項目。

  2. 點擊 安全性防禦 頁籤。

    安全性防禦

    Security Defenses

根據預設,Keycloak 僅針對 iframe 設定相同來源原則。

SSL/HTTPS 需求

OAuth 2.0/OpenID Connect 使用存取權杖來確保安全性。攻擊者可以掃描您的網路以尋找存取權杖,並使用它們來執行該權杖具有許可權的惡意操作。這種攻擊稱為中間人攻擊。請在 Keycloak 認證伺服器和 Keycloak 保護的用戶端之間使用 SSL/HTTPS 進行通訊,以防止中間人攻擊。

Keycloak 有三種 SSL/HTTPS 模式。設定 SSL 較為複雜,因此 Keycloak 允許透過私有 IP 位址(例如 localhost、192.168.x.x 和其他私有 IP 位址)進行非 HTTPS 通訊。在生產環境中,請務必啟用 SSL,並強制所有操作都必須使用 SSL。

在配接器/用戶端方面,您可以停用 SSL 信任管理員。信任管理員可確保與 Keycloak 通訊的用戶端身分有效,並針對伺服器的憑證驗證 DNS 網域名稱。在生產環境中,請確保每個用戶端配接器都使用信任儲存區,以防止 DNS 中間人攻擊。

CSRF 攻擊

跨站請求偽造 (CSRF) 攻擊利用網站已驗證的使用者所發出的 HTTP 請求。任何使用 Cookie 驗證的網站都容易受到 CSRF 攻擊。您可以將狀態 Cookie 與張貼的表單或查詢參數進行比對,來減輕這些攻擊。

OAuth 2.0 登入規格要求狀態 Cookie 必須與傳輸的狀態參數相符。Keycloak 完全實作了此規格,因此所有登入都受到保護。

Keycloak 管理主控台是 JavaScript/HTML5 應用程式,會對後端 Keycloak 管理 REST API 發出 REST 呼叫。這些呼叫都需要持有人權杖驗證,並且包含 JavaScript Ajax 呼叫,因此不可能發生 CSRF。您可以設定管理 REST API 來驗證 CORS 來源。

Keycloak 中的帳戶主控台可能容易受到 CSRF 攻擊。為了防止 CSRF 攻擊,Keycloak 會設定狀態 Cookie,並將此 Cookie 的值嵌入動作連結中的隱藏表單欄位或查詢參數中。Keycloak 會檢查查詢/表單參數與狀態 Cookie 是否相符,以驗證呼叫是否由同一位使用者發出。

不明確的重新導向 URI

請盡可能讓您註冊的重新導向 URI 越明確越好。為授權碼流程註冊模糊的重新導向 URI,可能會允許惡意用戶端偽裝成另一個具有更廣泛存取權的用戶端。例如,如果兩個用戶端位於同一個網域下,則可能會發生偽裝。

您可以為您的領域使用安全重新導向 uri 強制執行器。結果可確保用戶端管理員只能註冊具有特定重新導向 uri 的用戶端,這些 uri 符合各種需求,例如要求 URL 的內容路徑中不能有萬用字元,或者可以限制為指定的允許網域。請參閱用戶端原則,以了解如何使用特定執行器設定用戶端原則的詳細資訊。

FAPI 合規性

為了確保 Keycloak 伺服器會驗證您的用戶端是否更安全且符合 FAPI,您可以為 FAPI 支援設定用戶端原則。FAPI 的詳細資訊在保護應用程式章節中說明。除此之外,這還能確保上述的一些安全性最佳實務,例如用戶端所需的 SSL、使用的安全重新導向 URI,以及更多類似的最佳實務。

OAuth 2.1 合規性

為了確保 Keycloak 伺服器會驗證您的用戶端是否更安全且符合 OAuth 2.1,您可以為 OAuth 2.1 支援設定用戶端原則。OAuth 2.1 的詳細資訊在保護應用程式章節中說明。

遭到入侵的存取權杖和重新整理權杖

Keycloak 包含數個動作,可防止惡意行為者竊取存取權杖和重新整理權杖。最重要的動作是強制執行 Keycloak 與其用戶端和應用程式之間的 SSL/HTTPS 通訊。預設情況下,Keycloak 不會啟用 SSL。

另一項減輕洩露的存取權杖造成的損害的動作,是縮短權杖的存留時間。您可以在逾時頁面中指定權杖的存留時間。存取權杖的存留時間較短,會強制用戶端和應用程式在短時間後重新整理其存取權杖。如果管理員偵測到洩露,管理員可以登出所有使用者工作階段,以使這些重新整理權杖失效,或設定撤銷原則。

確保重新整理權杖始終對用戶端保持私有,且永遠不會傳輸。

您可以將這些權杖發行為持有者金鑰權杖,來減輕洩露的存取權杖和重新整理權杖所造成的損害。如需詳細資訊,請參閱OAuth 2.0 相互 TLS 用戶端憑證繫結存取權杖

如果存取權杖或重新整理權杖遭到入侵,請存取管理主控台,並將 not-before 撤銷原則推送至所有應用程式。推送 not-before 原則可確保在該時間之前發出的任何權杖都會失效。推送新的 not-before 原則可確保應用程式必須從 Keycloak 下載新的公開金鑰,並減輕遭到入侵的領域簽署金鑰造成的損害。如需詳細資訊,請參閱金鑰章節

如果特定應用程式、用戶端或使用者遭到入侵,您可以停用它們。

遭到入侵的授權碼

對於OIDC 授權碼流程,Keycloak 會為其授權碼產生密碼學上強大的隨機值。授權碼僅使用一次,用於取得存取權杖。

在管理主控台的逾時頁面上,您可以指定授權碼有效的時間長度。請確保時間長度少於 10 秒,這足以讓用戶端從該程式碼要求權杖。

您也可以透過將程式碼交換證明金鑰 (PKCE) 套用至用戶端,來防禦洩漏的授權碼。

開放重新導向器

開放重新導向器是一種端點,會使用參數將使用者代理程式自動重新導向至參數值指定的位置,而無需驗證。攻擊者可以使用最終使用者授權端點和重新導向 URI 參數,將授權伺服器當作開放重新導向器使用,並利用使用者對授權伺服器的信任來發動網路釣魚攻擊。

Keycloak 要求所有已註冊的應用程式和用戶端至少註冊一個重新導向 URI 模式。當用戶端要求 Keycloak 執行重新導向時,Keycloak 會根據有效的已註冊 URI 模式清單檢查重新導向 URI。用戶端和應用程式必須註冊盡可能明確的 URI 模式,以減輕開放重新導向器攻擊。

如果應用程式需要非 http(s) 的自訂配置,則它應該是驗證模式的明確部分 (例如 custom:/app/*)。基於安全性考量,像 * 這樣的一般模式不涵蓋非 http(s) 配置。

透過使用用戶端原則,管理員可以確保用戶端無法註冊開放重新導向 URL,例如 *

密碼資料庫遭到入侵

Keycloak 不會以原始文字格式儲存密碼,而是使用 PBKDF2-HMAC-SHA512 訊息摘要演算法以雜湊文字格式儲存。Keycloak 會執行 210,000 次雜湊反覆運算,這是安全社群建議的反覆運算次數。這種數量的雜湊反覆運算可能會對效能產生不利影響,因為 PBKDF2 雜湊會使用大量的 CPU 資源。

限制範圍

預設情況下,新的用戶端應用程式具有不受限制的 角色範圍對應。該用戶端的每個存取權杖都包含使用者擁有的所有權限。如果攻擊者入侵用戶端並取得用戶端的存取權杖,則使用者可以存取的每個系統都會遭到入侵。

請使用每個用戶端的範圍選單來限制存取權杖的角色。或者,您可以在用戶端範圍層級設定角色範圍對應,並使用用戶端範圍選單,將用戶端範圍指派給您的用戶端。

限制權杖對象

在服務之間信任程度較低的環境中,請限制令牌上的目標對象。有關更多資訊,請參閱 OAuth2 威脅模型目標對象支援 章節。

限制身份驗證會話

身份驗證會話追蹤身份驗證的狀態。以下文字適用於任何來源流程。

本節描述使用 Infinispan 提供者進行身份驗證會話的部署。

身份驗證會話在內部儲存為 RootAuthenticationSessionEntity。每個 RootAuthenticationSessionEntity 可以有多個身份驗證子會話,以 AuthenticationSessionEntity 物件集合的形式儲存在 RootAuthenticationSessionEntity 中。Keycloak 將身份驗證會話儲存在專用的 Infinispan 快取中。每個 RootAuthenticationSessionEntityAuthenticationSessionEntity 數量會影響每個快取條目的大小。身份驗證會話快取的總記憶體佔用空間由儲存的 RootAuthenticationSessionEntity 數量以及每個 RootAuthenticationSessionEntity 內的 AuthenticationSessionEntity 數量決定。

維護的 RootAuthenticationSessionEntity 物件數量對應於瀏覽器中未完成的登入流程數量。為了控制 RootAuthenticationSessionEntity 的數量,建議使用進階防火牆控制來限制入口網路流量。

對於具有許多活動 RootAuthenticationSessionEntity 和大量 AuthenticationSessionEntity 的部署,可能會發生更高的記憶體使用率。如果負載平衡器不支援或未設定會話黏性,則叢集中的網路負載可能會顯著增加。此負載的原因是,每個落在不擁有適當身份驗證會話的節點上的請求都需要在擁有者節點中檢索和更新身份驗證會話記錄,這涉及單獨的網路傳輸以進行檢索和儲存。

每個 RootAuthenticationSessionEntityAuthenticationSessionEntity 最大數量可以在 authenticationSessions SPI 中透過設定屬性 authSessionsLimit 來配置。預設值設定為每個 RootAuthenticationSessionEntity 300 個 AuthenticationSessionEntity。當達到此限制時,在新的身份驗證會話請求後,將會移除最舊的身份驗證子會話。

以下範例說明如何將每個 RootAuthenticationSessionEntity 的活動 AuthenticationSessionEntity 數量限制為 100 個。

bin/kc.[sh|bat] start --spi-authentication-sessions-infinispan-auth-sessions-limit=100

新地圖儲存的等效指令

bin/kc.[sh|bat] start --spi-authentication-sessions-map-auth-sessions-limit=100

SQL 注入攻擊

目前,Keycloak 沒有已知的 SQL 注入漏洞。

帳戶控制台

Keycloak 使用者可以透過帳戶控制台管理他們的帳戶。他們可以設定他們的個人資料、新增雙因素驗證、包含身份提供者帳戶,以及監管裝置活動。

其他資源
  • 帳戶控制台可以針對外觀和語言偏好進行設定。一個範例是在「個人資訊」頁面新增其他屬性。如需更多資訊,請參閱 伺服器開發人員指南

存取帳戶控制台

程序
  1. 請記下您的帳戶所在的 Keycloak 伺服器的網域名稱和 IP 位址。

  2. 在網頁瀏覽器中,輸入此格式的 URL:server-root/realms/{realm-name}/account。

  3. 輸入您的登入名稱和密碼。

帳戶控制台

Account Console

設定登入方式

您可以使用基本驗證(登入名稱和密碼)或雙因素驗證登入此控制台。對於雙因素驗證,請使用下列其中一個程序。

使用 OTP 的雙因素驗證

先決條件
  • OTP 是您網域的有效驗證機制。

程序
  1. 在選單中按一下 [帳戶安全性]。

  2. 按一下 [登入]。

  3. 按一下 [設定驗證器應用程式]。

    登入

    Signing in

  4. 依照畫面上顯示的指示,將您的行動裝置用作 OTP 產生器。

  5. 將螢幕截圖中的 QR 碼掃描到行動裝置上的 OTP 產生器中。

  6. 登出並再次登入。

  7. 輸入行動裝置上提供的 OTP 來回應提示。

使用 WebAuthn 的雙因素驗證

先決條件
  • WebAuthn 是您網域的有效雙因素驗證機制。請參閱 WebAuthn 章節以了解更多詳細資訊。

程序
  1. 在選單中按一下 [帳戶安全性]。

  2. 按一下 [登入]。

  3. 按一下 [設定通行金鑰]。

    登入

    Signing in with a Passkey

  4. 準備您的通行金鑰。您如何準備此金鑰取決於您使用的通行金鑰類型。例如,對於基於 USB 的 Yubikey,您可能需要將金鑰插入筆記型電腦上的 USB 連接埠。

  5. 按一下 [註冊] 以註冊您的通行金鑰。

  6. 登出並再次登入。

  7. 假設身份驗證流程已正確設定,則會出現一則訊息,要求您使用您的通行金鑰作為第二個因素進行驗證。

使用 WebAuthn 的無密碼身份驗證

先決條件
  • WebAuthn 是您網域的有效無密碼身份驗證機制。請參閱 無密碼 WebAuthn 章節以了解更多詳細資訊。

程序
  1. 在選單中按一下 [帳戶安全性]。

  2. 按一下 [登入]。

  3. 在 [無密碼] 章節中按一下 [設定通行金鑰]。

    登入

    Signing in with a Passkey

  4. 準備您的通行金鑰。您如何準備此金鑰取決於您使用的通行金鑰類型。例如,對於基於 USB 的 Yubikey,您可能需要將金鑰插入筆記型電腦上的 USB 連接埠。

  5. 按一下 [註冊] 以註冊您的通行金鑰。

  6. 登出並再次登入。

  7. 假設身份驗證流程已正確設定,則會出現一則訊息,要求您使用您的通行金鑰作為第二個因素進行驗證。您不再需要提供密碼即可登入。

檢視裝置活動

您可以檢視已登入您帳戶的裝置。

程序
  1. 在選單中按一下 [帳戶安全性]。

  2. 按一下 [裝置活動]。

  3. 如果裝置看起來可疑,請登出該裝置。

裝置

Devices

新增身份提供者帳戶

您可以將您的帳戶連結到身份代理。此選項通常用於連結社交提供者帳戶。

程序
  1. 登入管理控制台。

  2. 在選單中按一下 [身份提供者]。

  3. 選取提供者並填寫欄位。

  4. 返回帳戶控制台。

  5. 在選單中按一下 [帳戶安全性]。

  6. 按一下 [已連結帳戶]。

您新增的身份提供者會顯示在此頁面中。

已連結帳戶

Linked Accounts

存取其他應用程式

「應用程式」選單項目會顯示使用者可以存取的應用程式。在此案例中,只有帳戶控制台可用。

應用程式

Applications

檢視群組成員資格

您可以透過按一下 [群組] 選單來檢視您所關聯的群組。如果您選取 [直接成員資格] 核取方塊,您將只會看到您直接關聯的群組。

先決條件
  • 您需要擁有 view-groups 帳戶角色,才能檢視 群組 選單。

檢視群組成員資格

View group memberships

管理 CLI

透過 Keycloak,您可以使用管理 CLI 命令列工具從命令列介面 (CLI) 執行管理工作。

安裝管理 CLI

Keycloak 將管理 CLI 伺服器散發套件與 bin 目錄中的執行指令碼封裝在一起。

Linux 指令碼稱為 kcadm.sh,而 Windows 的指令碼稱為 kcadm.bat。將 Keycloak 伺服器目錄新增至您的 PATH,以便從檔案系統上的任何位置使用用戶端。

例如

  • Linux

    $ export PATH=$PATH:$KEYCLOAK_HOME/bin
    $ kcadm.sh
  • Windows

    c:\> set PATH=%PATH%;%KEYCLOAK_HOME%\bin
    c:\> kcadm

您必須將 KEYCLOAK_HOME 環境變數設定為您解壓縮 Keycloak Server 散發套件的路徑。

為了避免重複,本文檔的其餘部分僅在 CLI 差異不僅僅在 kcadm 命令名稱時才使用 Windows 範例。

使用管理 CLI

管理 CLI 向管理 REST 端點發出 HTTP 請求。存取管理 REST 端點需要身份驗證。

請參閱管理 REST API 文件,以了解特定端點的 JSON 屬性詳細資訊。

  1. 透過登入啟動已驗證的會話。您現在可以執行建立、讀取、更新和刪除 (CRUD) 操作。

    例如

    • Linux

      $ kcadm.sh config credentials --server https://127.0.0.1:8080 --realm demo --user admin --client admin
      $ kcadm.sh create realms -s realm=demorealm -s enabled=true -o
      $ CID=$(kcadm.sh create clients -r demorealm -s clientId=my_client -s 'redirectUris=["https://127.0.0.1:8980/myapp/*"]' -i)
      $ kcadm.sh get clients/$CID/installation/providers/keycloak-oidc-keycloak-json
    • Windows

      c:\> kcadm config credentials --server https://127.0.0.1:8080 --realm demo --user admin --client admin
      c:\> kcadm create realms -s realm=demorealm -s enabled=true -o
      c:\> kcadm create clients -r demorealm -s clientId=my_client -s "redirectUris=[\"https://127.0.0.1:8980/myapp/*\"]" -i > clientid.txt
      c:\> set /p CID=<clientid.txt
      c:\> kcadm get clients/%CID%/installation/providers/keycloak-oidc-keycloak-json
  2. 在生產環境中,請使用 https: 來存取 Keycloak,以避免洩露令牌。如果 Java 的預設憑證信任儲存區中未包含受信任的憑證授權單位發出的伺服器憑證,請準備一個 truststore.jks 檔案,並指示管理 CLI 使用它。

    例如

    • Linux

      $ kcadm.sh config truststore --trustpass $PASSWORD ~/.keycloak/truststore.jks
    • Windows

      c:\> kcadm config truststore --trustpass %PASSWORD% %HOMEPATH%\.keycloak\truststore.jks

敏感選項

敏感值,例如密碼,可能會被指定為命令選項。一般來說,不建議這樣做。還有一些機制可以讓您被提示輸入敏感值 - 可以通過省略選項或提供值或 - 來實現。最後,所有選項都會有一個對應的環境變數可以替代使用 - 請查看您正在執行的命令的說明,以查看所有可能的選項。

身份驗證

當您使用 Admin CLI 登入時,您需要指定:

  • 一個伺服器端點 URL

  • 一個領域 (Realm)

  • 一個使用者名稱

另一個選項是僅指定一個客戶端 ID (clientId),這會為您建立一個獨特的服務帳戶以供使用。

當您使用使用者名稱登入時,請使用指定使用者的密碼。當您使用客戶端 ID 登入時,只需要客戶端密鑰,不需要使用者密碼。您也可以使用 Signed JWT 而不是客戶端密鑰。

請確保用於會話的帳戶具有調用 Admin REST API 操作的適當權限。例如,realm-management 客户端的 realm-admin 角色可以管理使用者所屬的領域。

有兩種主要的機制可用於身份驗證。一種機制是使用 kcadm config credentials 來啟動已驗證的會話。

$ kcadm.sh config credentials --server https://127.0.0.1:8080 --realm master --user admin

此機制通過保存獲取的存取令牌及其相關的刷新令牌來維護 kcadm 命令調用之間的已驗證會話。它可以在私有設定檔中維護其他密鑰。請參閱下一章以了解更多資訊。

第二種機制在每次調用期間對每個命令調用進行身份驗證。這種機制增加了伺服器的負載,以及獲取令牌所花費的往返時間。這種方法的好處是不需要在調用之間保存令牌,因此不會將任何內容保存到磁碟。當指定 --no-config 參數時,Keycloak 會使用此模式。

例如,在執行操作時,請指定身份驗證所需的所有資訊。

$ kcadm.sh get realms --no-config --server https://127.0.0.1:8080 --realm master --user admin

執行 kcadm.sh help 命令以了解有關使用 Admin CLI 的更多資訊。

執行 kcadm.sh config credentials --help 命令以了解有關啟動已驗證會話的更多資訊。

如果您未指定 --password 選項(通常建議不要將密碼作為命令的一部分提供),系統將會提示您輸入密碼,除非在環境變數 KC_CLI_PASSWORD 中指定了密碼。

使用替代設定

預設情況下,Admin CLI 會維護一個名為 kcadm.config 的設定檔。Keycloak 將此檔案放在使用者的主目錄中。在基於 Linux 的系統中,完整路徑名稱是 $HOME/.keycloak/kcadm.config。在 Windows 中,完整路徑名稱是 %HOMEPATH%\.keycloak\kcadm.config

您可以使用 --config 選項指向不同的檔案或位置,以便您可以平行維護多個已驗證的會話。

從單一執行緒執行與單一設定檔相關的操作。

請確保其他系統使用者看不到設定檔。它包含必須保密的存取令牌和密鑰。Keycloak 會自動使用適當的存取限制建立 ~/.keycloak 目錄及其內容。如果目錄已存在,Keycloak 不會更新目錄的權限。

可以避免將密鑰儲存在設定檔中,但這樣做很不方便,而且會增加令牌請求的數量。在所有命令中使用 --no-config 選項,並使用每次調用 kcadm 時都需要的 config credentials 命令指定身份驗證資訊。

基本操作和資源 URI

Admin CLI 可以針對 Admin REST API 端點執行通用的 CRUD 操作,並提供額外的命令來簡化特定的任務。

主要的使用模式如下所示

$ kcadm.sh create ENDPOINT [ARGUMENTS]
$ kcadm.sh get ENDPOINT [ARGUMENTS]
$ kcadm.sh update ENDPOINT [ARGUMENTS]
$ kcadm.sh delete ENDPOINT [ARGUMENTS]

creategetupdatedelete 命令分別對應於 HTTP 動詞 POSTGETPUTDELETE。ENDPOINT 是目標資源 URI,可以是絕對的(以 http:https: 開頭)或相對的,Keycloak 使用它來組成以下格式的絕對 URL

SERVER_URI/admin/realms/REALM/ENDPOINT

例如,如果您針對伺服器 https://127.0.0.1:8080 和領域 master 進行身份驗證,使用 users 作為 ENDPOINT 會建立 https://127.0.0.1:8080/admin/realms/master/users 資源 URL。

如果您將 ENDPOINT 設定為 clients,則有效的資源 URI 為 https://127.0.0.1:8080/admin/realms/master/clients

Keycloak 有一個 realms 端點,它是領域的容器。它解析為

SERVER_URI/admin/realms

Keycloak 有一個 serverinfo 端點。此端點獨立於領域。

當您以具有 realm-admin 權限的使用者進行身份驗證時,您可能需要在多個領域上執行命令。如果是這樣,請指定 -r 選項來告訴 CLI 命令要針對哪個領域明確執行。該命令會使用 TARGET_REALM,而不是使用 kcadm.sh config credentials--realm 選項指定的 REALM

SERVER_URI/admin/realms/TARGET_REALM/ENDPOINT

例如

$ kcadm.sh config credentials --server https://127.0.0.1:8080 --realm master --user admin
$ kcadm.sh create users -s username=testuser -s enabled=true -r demorealm

在此範例中,您啟動一個以 master 領域中的 admin 使用者身份驗證的會話。然後,您針對資源 URL https://127.0.0.1:8080/admin/realms/demorealm/users 執行 POST 呼叫。

createupdate 命令會將 JSON 主體傳送至伺服器。您可以使用 -f FILENAME 從檔案讀取預先製作的文件。當您可以使用 -f - 選項時,Keycloak 會從標準輸入讀取訊息主體。您可以指定個別屬性及其值,如 create users 範例所示。Keycloak 會將屬性組成 JSON 主體,並將其傳送至伺服器。

在 --set, -s 選項中使用的 name=value 配對中的值會被假設為 JSON。如果它無法解析為有效的 JSON,則會將其作為文字值傳送至伺服器。

如果該值在 Shell 處理後被引號括起來,但不是有效的 JSON,則會移除引號,並將該值的其餘部分作為文字傳送。此行為已被棄用,請考慮不使用引號指定您的值,或使用雙引號指定有效的 JSON 字串文字。

Keycloak 中有多種方法可以使用 update 命令更新資源。您可以確定資源的目前狀態並將其儲存到檔案中、編輯該檔案,並將其傳送至伺服器進行更新。

例如

$ kcadm.sh get realms/demorealm > demorealm.json
$ vi demorealm.json
$ kcadm.sh update realms/demorealm -f demorealm.json

此方法會使用已傳送 JSON 文件中的屬性更新伺服器上的資源。

另一種方法是使用 -s, --set 選項設定新值,來執行即時更新。

例如

$ kcadm.sh update realms/demorealm -s enabled=false

此方法會將 enabled 屬性設定為 false

預設情況下,update 命令會執行 get,然後將新屬性值與現有值合併。在某些情況下,端點可能支援 put 命令,但不支援 get 命令。您可以使用 -n 選項執行不合併更新,這會執行 put 命令,而不會先執行 get 命令。

領域操作

建立新的領域

realms 端點上使用 create 命令來建立新的已啟用領域。將屬性設定為 realmenabled

$ kcadm.sh create realms -s realm=demorealm -s enabled=true

預設情況下,Keycloak 會停用領域。您可以透過啟用領域來立即將其用於身份驗證。

新物件的描述也可以是 JSON 格式。

$ kcadm.sh create realms -f demorealm.json

您可以直接從檔案傳送具有領域屬性的 JSON 文件,或將文件透過管道傳送到標準輸入。

例如

  • Linux

    $ kcadm.sh create realms -f - << EOF
    { "realm": "demorealm", "enabled": true }
    EOF
  • Windows

    c:\> echo { "realm": "demorealm", "enabled": true } | kcadm create realms -f -

列出現有的領域

此命令會傳回所有領域的清單。

$ kcadm.sh get realms

Keycloak 會篩選伺服器上的領域清單,只傳回使用者可以看到的領域。

所有領域屬性的清單可能會很詳細,而且大多數使用者只對屬性的子集感興趣,例如領域名稱和領域的啟用狀態。您可以使用 --fields 選項指定要傳回的屬性。

$ kcadm.sh get realms --fields realm,enabled

您可以將結果顯示為逗號分隔值。

$ kcadm.sh get realms --fields realm --format csv --noquotes

取得特定的領域

將領域名稱附加到集合 URI 以取得個別的領域。

$ kcadm.sh get realms/master

更新領域

  1. 當您不想變更所有領域的屬性時,請使用 -s 選項設定屬性的新值。

    例如

    $ kcadm.sh update realms/demorealm -s enabled=false
  2. 如果您想將所有可寫入的屬性設定為新值

    1. 執行 get 命令。

    2. 編輯 JSON 檔案中的目前值。

    3. 重新提交。

      例如

      $ kcadm.sh get realms/demorealm > demorealm.json
      $ vi demorealm.json
      $ kcadm.sh update realms/demorealm -f demorealm.json

刪除領域

執行以下命令刪除領域

$ kcadm.sh delete realms/demorealm

開啟領域的所有登入頁面選項

將控制特定功能的屬性設定為 true

例如

$ kcadm.sh update realms/demorealm -s registrationAllowed=true -s registrationEmailAsUsername=true -s rememberMe=true -s verifyEmail=true -s resetPasswordAllowed=true -s editUsernameAllowed=true

列出領域密鑰

在目標領域的 keys 端點上使用 get 操作。

$ kcadm.sh get keys -r demorealm

產生新的領域密鑰

  1. 在新增新的 RSA 產生的金鑰對之前,先取得目標領域的 ID。

    例如

    $ kcadm.sh get realms/demorealm --fields id --format csv --noquotes
  2. 新增優先順序高於現有供應商的金鑰供應商,如 kcadm.sh get keys -r demorealm 所示。

    例如

    • Linux

      $ kcadm.sh create components -r demorealm -s name=rsa-generated -s providerId=rsa-generated -s providerType=org.keycloak.keys.KeyProvider -s parentId=959844c1-d149-41d7-8359-6aa527fca0b0 -s 'config.priority=["101"]' -s 'config.enabled=["true"]' -s 'config.active=["true"]' -s 'config.keySize=["2048"]'
    • Windows

      c:\> kcadm create components -r demorealm -s name=rsa-generated -s providerId=rsa-generated -s providerType=org.keycloak.keys.KeyProvider -s parentId=959844c1-d149-41d7-8359-6aa527fca0b0 -s "config.priority=[\"101\"]" -s "config.enabled=[\"true\"]" -s "config.active=[\"true\"]" -s "config.keySize=[\"2048\"]"
  3. parentId 屬性設定為目標領域 ID 的值。

    新加入的金鑰現在是活動金鑰,如 kcadm.sh get keys -r demorealm 所示。

從 Java 金鑰儲存檔案新增新的領域密鑰

  1. 新增金鑰供應商以新增預先準備為 JKS 檔案的新金鑰對。

    例如,在

    • Linux

      $ kcadm.sh create components -r demorealm -s name=java-keystore -s providerId=java-keystore -s providerType=org.keycloak.keys.KeyProvider -s parentId=959844c1-d149-41d7-8359-6aa527fca0b0 -s 'config.priority=["101"]' -s 'config.enabled=["true"]' -s 'config.active=["true"]' -s 'config.keystore=["/opt/keycloak/keystore.jks"]' -s 'config.keystorePassword=["secret"]' -s 'config.keyPassword=["secret"]' -s 'config.keyAlias=["localhost"]'
    • Windows

      c:\> kcadm create components -r demorealm -s name=java-keystore -s providerId=java-keystore -s providerType=org.keycloak.keys.KeyProvider -s parentId=959844c1-d149-41d7-8359-6aa527fca0b0 -s "config.priority=[\"101\"]" -s "config.enabled=[\"true\"]" -s "config.active=[\"true\"]" -s "config.keystore=[\"/opt/keycloak/keystore.jks\"]" -s "config.keystorePassword=[\"secret\"]" -s "config.keyPassword=[\"secret\"]" -s "config.keyAlias=[\"localhost\"]"
  2. 請務必變更 keystorekeystorePasswordkeyPasswordalias 的屬性值,以符合您的特定金鑰儲存。

  3. parentId 屬性設定為目標領域 ID 的值。

使金鑰變為被動或停用金鑰

  1. 找出您要使其變為被動的金鑰。

    $ kcadm.sh get keys -r demorealm
  2. 使用金鑰的 providerId 屬性來建構端點 URI,例如 components/PROVIDER_ID

  3. 執行 update

    例如

    • Linux

      $ kcadm.sh update components/PROVIDER_ID -r demorealm -s 'config.active=["false"]'
    • Windows

      c:\> kcadm update components/PROVIDER_ID -r demorealm -s "config.active=[\"false\"]"

      您可以更新其他金鑰屬性

    • 設定新的 enabled 值以停用金鑰,例如,config.enabled=["false"]

    • 設定新的 priority 值以變更金鑰的優先順序,例如,config.priority=["110"]

刪除舊金鑰

  1. 請確保您要刪除的金鑰處於非活動狀態,並且您已將其停用。此動作是為了防止應用程式和使用者持有的現有令牌失敗。

  2. 找出要刪除的金鑰。

    $ kcadm.sh get keys -r demorealm
  3. 使用金鑰的 providerId 執行刪除。

    $ kcadm.sh delete components/PROVIDER_ID -r demorealm

設定領域的事件記錄

events/config 端點上使用 update 命令。

eventsListeners 屬性包含 EventListenerProviderFactory ID 的清單,指定接收事件的所有事件監聽器。有些屬性可用於控制內建的事件儲存,因此您可以使用 Admin REST API 查詢過去的事件。Keycloak 可以分別控制服務呼叫的記錄 (eventsEnabled) 和由 Admin Console 或 Admin REST API 觸發的稽核事件 (adminEventsEnabled)。您可以設定 eventsExpiration 事件以使其過期,以防止您的資料庫填滿。Keycloak 將 eventsExpiration 設定為以秒為單位表示的存活時間。

您可以設定一個內建的事件監聽器,接收所有事件並透過 JBoss 記錄來記錄事件。Keycloak 使用 org.keycloak.events 記錄器將錯誤事件記錄為 WARN,並將其他事件記錄為 DEBUG

例如

  • Linux

    $ kcadm.sh update events/config -r demorealm -s 'eventsListeners=["jboss-logging"]'
  • Windows

    c:\> kcadm update events/config -r demorealm -s "eventsListeners=[\"jboss-logging\"]"

例如

您可以開啟所有可用 ERROR 事件(不包括稽核事件)的儲存,為期兩天,以便您可以透過 Admin REST 擷取事件。

  • Linux

    $ kcadm.sh update events/config -r demorealm -s eventsEnabled=true -s 'enabledEventTypes=["LOGIN_ERROR","REGISTER_ERROR","LOGOUT_ERROR","CODE_TO_TOKEN_ERROR","CLIENT_LOGIN_ERROR","FEDERATED_IDENTITY_LINK_ERROR","REMOVE_FEDERATED_IDENTITY_ERROR","UPDATE_EMAIL_ERROR","UPDATE_PROFILE_ERROR","UPDATE_PASSWORD_ERROR","UPDATE_TOTP_ERROR","UPDATE_CREDENTIAL_ERROR","VERIFY_EMAIL_ERROR","REMOVE_TOTP_ERROR","REMOVE_CREDENTIAL_ERROR","SEND_VERIFY_EMAIL_ERROR","SEND_RESET_PASSWORD_ERROR","SEND_IDENTITY_PROVIDER_LINK_ERROR","RESET_PASSWORD_ERROR","IDENTITY_PROVIDER_FIRST_LOGIN_ERROR","IDENTITY_PROVIDER_POST_LOGIN_ERROR","CUSTOM_REQUIRED_ACTION_ERROR","EXECUTE_ACTIONS_ERROR","CLIENT_REGISTER_ERROR","CLIENT_UPDATE_ERROR","CLIENT_DELETE_ERROR"]' -s eventsExpiration=172800
  • Windows

    c:\> kcadm update events/config -r demorealm -s eventsEnabled=true -s "enabledEventTypes=[\"LOGIN_ERROR\",\"REGISTER_ERROR\",\"LOGOUT_ERROR\",\"CODE_TO_TOKEN_ERROR\",\"CLIENT_LOGIN_ERROR\",\"FEDERATED_IDENTITY_LINK_ERROR\",\"REMOVE_FEDERATED_IDENTITY_ERROR\",\"UPDATE_EMAIL_ERROR\",\"UPDATE_PROFILE_ERROR\",\"UPDATE_PASSWORD_ERROR\",\"UPDATE_TOTP_ERROR\",\"UPDATE_CREDENTIAL_ERROR\",\"VERIFY_EMAIL_ERROR\",\"REMOVE_TOTP_ERROR\",\"REMOVE_CREDENTIAL_ERROR\",\"SEND_VERIFY_EMAIL_ERROR\",\"SEND_RESET_PASSWORD_ERROR\",\"SEND_IDENTITY_PROVIDER_LINK_ERROR\",\"RESET_PASSWORD_ERROR\",\"IDENTITY_PROVIDER_FIRST_LOGIN_ERROR\",\"IDENTITY_PROVIDER_POST_LOGIN_ERROR\",\"CUSTOM_REQUIRED_ACTION_ERROR\",\"EXECUTE_ACTIONS_ERROR\",\"CLIENT_REGISTER_ERROR\",\"CLIENT_UPDATE_ERROR\",\"CLIENT_DELETE_ERROR\"]" -s eventsExpiration=172800

您可以將儲存的事件類型重設為所有可用的事件類型。將值設定為空清單與列舉所有事件相同。

$ kcadm.sh update events/config -r demorealm -s enabledEventTypes=[]

您可以啟用稽核事件的儲存。

$ kcadm.sh update events/config -r demorealm -s adminEventsEnabled=true -s adminEventsDetailsEnabled=true

您可以取得最近 100 個事件。事件從最新到最舊排序。

$ kcadm.sh get events --offset 0 --limit 100

您可以刪除所有已儲存的事件。

$ kcadm delete events

清除快取

  1. 使用 create 命令和下列其中一個端點來清除快取

    • clear-realm-cache

    • clear-user-cache

    • clear-keys-cache

  2. realm 設定為與目標領域相同的值。

    例如

    $ kcadm.sh create clear-realm-cache -r demorealm -s realm=demorealm
    $ kcadm.sh create clear-user-cache -r demorealm -s realm=demorealm
    $ kcadm.sh create clear-keys-cache -r demorealm -s realm=demorealm

從匯出的 .json 檔案匯入領域

  1. partialImport 端點上使用 create 命令。

  2. ifResourceExists 設定為 FAILSKIPOVERWRITE

  3. 使用 -f 提交匯出的 realm .json 檔案。

    例如

    $ kcadm.sh create partialImport -r demorealm2 -s ifResourceExists=FAIL -o -f demorealm.json

    如果 realm 尚不存在,請先建立它。

    例如

    $ kcadm.sh create realms -s realm=demorealm2 -s enabled=true

角色操作

建立領域角色

使用 roles 端點建立 realm 角色。

$ kcadm.sh create roles -r demorealm -s name=user -s 'description=Regular user with a limited set of permissions'

建立用戶端角色

  1. 識別用戶端。

  2. 使用 get 命令列出可用的用戶端。

    $ kcadm.sh get clients -r demorealm --fields id,clientId
  3. 使用 clientId 屬性建構端點 URI,例如 clients/ID/roles,來建立新的角色。

    例如

    $ kcadm.sh create clients/a95b6af3-0bdc-4878-ae2e-6d61a4eca9a0/roles -r demorealm -s name=editor -s 'description=Editor can edit, and publish any article'

列出 realm 角色

roles 端點上使用 get 命令以列出現有的 realm 角色。

$ kcadm.sh get roles -r demorealm

您也可以使用 get-roles 命令。

$ kcadm.sh get-roles -r demorealm

列出用戶端角色

Keycloak 有專用的 get-roles 命令,可簡化 realm 和用戶端角色的列出。此命令是 get 命令的延伸,行為與 get 命令相同,但具有額外的語義以用於列出角色。

使用 get-roles 命令,並傳遞 clientId (--cclientid) 選項或 id (--cid) 選項,以識別要列出用戶端角色的用戶端。

例如

$ kcadm.sh get-roles -r demorealm --cclientid realm-management

取得特定的 realm 角色

使用 get 命令和角色 name 來建構特定 realm 角色的端點 URI,roles/ROLE_NAME,其中 user 是現有角色的名稱。

例如

$ kcadm.sh get roles/user -r demorealm

您可以使用 get-roles 命令,並傳遞角色名稱 (--rolename 選項) 或 ID (--roleid 選項)。

例如

$ kcadm.sh get-roles -r demorealm --rolename user

取得特定的用戶端角色

使用 get-roles 命令,並傳遞 clientId 屬性 (--cclientid 選項) 或 ID 屬性 (--cid 選項) 以識別用戶端,並傳遞角色名稱 (--rolename 選項) 或角色 ID 屬性 (--roleid) 以識別特定的用戶端角色。

例如

$ kcadm.sh get-roles -r demorealm --cclientid realm-management --rolename manage-clients

更新 realm 角色

使用 update 命令,以及您用來取得特定 realm 角色的端點 URI。

例如

$ kcadm.sh update roles/user -r demorealm -s 'description=Role representing a regular user'

更新用戶端角色

使用 update 命令,以及您用來取得特定用戶端角色的端點 URI。

例如

$ kcadm.sh update clients/a95b6af3-0bdc-4878-ae2e-6d61a4eca9a0/roles/editor -r demorealm -s 'description=User that can edit, and publish articles'

刪除 realm 角色

使用 delete 命令,以及您用來取得特定 realm 角色的端點 URI。

例如

$ kcadm.sh delete roles/user -r demorealm

刪除用戶端角色

使用 delete 命令,以及您用來取得特定用戶端角色的端點 URI。

例如

$ kcadm.sh delete clients/a95b6af3-0bdc-4878-ae2e-6d61a4eca9a0/roles/editor -r demorealm

列出複合角色的已指派、可用和有效 realm 角色

使用 get-roles 命令列出複合角色的已指派、可用和有效 realm 角色。

  1. 若要列出複合角色的已指派 realm 角色,請按名稱 (--rname 選項) 或 ID (--rid 選項) 指定目標複合角色。

    例如

    $ kcadm.sh get-roles -r demorealm --rname testrole
  2. 使用 --effective 選項以列出有效 realm 角色。

    例如

    $ kcadm.sh get-roles -r demorealm --rname testrole --effective
  3. 使用 --available 選項以列出您可以新增至複合角色的 realm 角色。

    例如

    $ kcadm.sh get-roles -r demorealm --rname testrole --available

列出複合角色的已指派、可用和有效用戶端角色

使用 get-roles 命令列出複合角色的已指派、可用和有效用戶端角色。

  1. 若要列出複合角色的已指派用戶端角色,您可以按名稱 (--rname 選項) 或 ID (--rid 選項) 指定目標複合角色,並按 clientId 屬性 (--cclientid 選項) 或 ID (--cid 選項) 指定用戶端。

    例如

    $ kcadm.sh get-roles -r demorealm --rname testrole --cclientid realm-management
  2. 使用 --effective 選項以列出有效 realm 角色。

    例如

    $ kcadm.sh get-roles -r demorealm --rname testrole --cclientid realm-management --effective
  3. 使用 --available 選項以列出您可以新增至目標複合角色的 realm 角色。

    例如

    $ kcadm.sh get-roles -r demorealm --rname testrole --cclientid realm-management --available

將 realm 角色新增至複合角色

Keycloak 提供 add-roles 命令以新增 realm 角色和用戶端角色。

此範例將 user 角色新增至複合角色 testrole

$ kcadm.sh add-roles --rname testrole --rolename user -r demorealm

從複合角色移除 realm 角色

Keycloak 提供 remove-roles 命令以移除 realm 角色和用戶端角色。

以下範例從目標複合角色 testrole 移除 user 角色。

$ kcadm.sh remove-roles --rname testrole --rolename user -r demorealm

將用戶端角色新增至 realm 角色

Keycloak 提供 add-roles 命令以新增 realm 角色和用戶端角色。

以下範例將在用戶端 realm-management 上定義的 create-clientview-users 角色新增至 testrole 複合角色。

$ kcadm.sh add-roles -r demorealm --rname testrole --cclientid realm-management --rolename create-client --rolename view-users

將用戶端角色新增至用戶端角色

  1. 使用 get-roles 命令判斷複合用戶端角色的 ID。

    例如

    $ kcadm.sh get-roles -r demorealm --cclientid test-client --rolename operations
  2. 假設存在一個用戶端,其具有名為 test-client 的 clientId 屬性、名為 support 的用戶端角色,以及名為 operations 的用戶端角色,其變成 ID 為「fc400897-ef6a-4e8c-872b-1581b7fa8a71」的複合角色。

  3. 使用以下範例將另一個角色新增至複合角色。

    $ kcadm.sh add-roles -r demorealm --cclientid test-client --rid fc400897-ef6a-4e8c-872b-1581b7fa8a71 --rolename support
  4. 使用 get-roles --all 命令列出複合角色的角色。

    例如

    $ kcadm.sh get-roles --rid fc400897-ef6a-4e8c-872b-1581b7fa8a71 --all

從複合角色移除用戶端角色

使用 remove-roles 命令從複合角色移除用戶端角色。

使用以下範例從 testrole 複合角色移除在用戶端 realm-management 上定義的兩個角色,create-client 角色和 view-users 角色。

$ kcadm.sh remove-roles -r demorealm --rname testrole --cclientid realm-management --rolename create-client --rolename view-users

將用戶端角色新增至群組

使用 add-roles 命令新增 realm 角色和用戶端角色。

以下範例將在用戶端 realm-management 上定義的 create-clientview-users 角色新增至 Group 群組 (--gname 選項)。或者,您可以使用 ID (--gid 選項) 指定群組。

如需更多資訊,請參閱 群組操作

$ kcadm.sh add-roles -r demorealm --gname Group --cclientid realm-management --rolename create-client --rolename view-users

從群組移除用戶端角色

使用 remove-roles 命令從群組移除用戶端角色。

以下範例從 Group 群組移除在用戶端 realm management 上定義的兩個角色,create-clientview-users 角色。

如需更多資訊,請參閱 群組操作

$ kcadm.sh remove-roles -r demorealm --gname Group --cclientid realm-management --rolename create-client --rolename view-users

用戶端操作

建立用戶端

  1. clients 端點上執行 create 命令以建立新的用戶端。

    例如

    $ kcadm.sh create clients -r demorealm -s clientId=myapp -s enabled=true
  2. 如果為了設定讓適配器進行驗證的密碼,請指定密碼。

    例如

    $ kcadm.sh create clients -r demorealm -s clientId=myapp -s enabled=true -s clientAuthenticatorType=client-secret -s secret=d0b8122f-8dfb-46b7-b68a-f5cc4e25d000

列出用戶端

clients 端點上使用 get 命令以列出用戶端。

此範例篩選輸出,僅列出 idclientId 屬性

$ kcadm.sh get clients -r demorealm --fields id,clientId

取得特定用戶端

使用用戶端 ID 建構針對特定用戶端的端點 URI,例如 clients/ID

例如

$ kcadm.sh get clients/c7b8547f-e748-4333-95d0-410b76b3f4a3 -r demorealm

取得特定用戶端的目前密碼

使用用戶端 ID 建構端點 URI,例如 clients/ID/client-secret

例如

$ kcadm.sh get clients/$CID/client-secret -r demorealm

為特定用戶端產生新的密碼

使用用戶端 ID 建構端點 URI,例如 clients/ID/client-secret

例如

$ kcadm.sh create clients/$CID/client-secret -r demorealm

更新特定用戶端的目前密碼

使用用戶端 ID 建構端點 URI,例如 clients/ID

例如

$ kcadm.sh update clients/$CID -s "secret=newSecret" -r demorealm

取得特定用戶端的適配器組態檔 (keycloak.json)

使用用戶端 ID 建構針對特定用戶端的端點 URI,例如 clients/ID/installation/providers/keycloak-oidc-keycloak-json

例如

$ kcadm.sh get clients/c7b8547f-e748-4333-95d0-410b76b3f4a3/installation/providers/keycloak-oidc-keycloak-json -r demorealm

取得特定用戶端的 WildFly 子系統適配器組態

使用用戶端 ID 建構針對特定用戶端的端點 URI,例如 clients/ID/installation/providers/keycloak-oidc-jboss-subsystem

例如

$ kcadm.sh get clients/c7b8547f-e748-4333-95d0-410b76b3f4a3/installation/providers/keycloak-oidc-jboss-subsystem -r demorealm

取得特定用戶端的 Docker-v2 範例組態

使用用戶端 ID 建構針對特定用戶端的端點 URI,例如 clients/ID/installation/providers/docker-v2-compose-yaml

回應為 .zip 格式。

例如

$ kcadm.sh get https://127.0.0.1:8080/admin/realms/demorealm/clients/8f271c35-44e3-446f-8953-b0893810ebe7/installation/providers/docker-v2-compose-yaml -r demorealm > keycloak-docker-compose-yaml.zip

更新用戶端

使用 update 命令,以及您用來取得特定用戶端的相同端點 URI。

例如

  • Linux

    $ kcadm.sh update clients/c7b8547f-e748-4333-95d0-410b76b3f4a3 -r demorealm -s enabled=false -s publicClient=true -s 'redirectUris=["https://127.0.0.1:8080/myapp/*"]' -s baseUrl=https://127.0.0.1:8080/myapp -s adminUrl=https://127.0.0.1:8080/myapp
  • Windows

    c:\> kcadm update clients/c7b8547f-e748-4333-95d0-410b76b3f4a3 -r demorealm -s enabled=false -s publicClient=true -s "redirectUris=[\"https://127.0.0.1:8080/myapp/*\"]" -s baseUrl=https://127.0.0.1:8080/myapp -s adminUrl=https://127.0.0.1:8080/myapp

刪除用戶端

使用 delete 命令,以及您用來取得特定用戶端的相同端點 URI。

例如

$ kcadm.sh delete clients/c7b8547f-e748-4333-95d0-410b76b3f4a3 -r demorealm

為用戶端的服務帳戶新增或移除角色

用戶端的服務帳戶是使用者名稱為 service-account-CLIENT_ID 的使用者帳戶。您可以在此帳戶上執行與一般帳戶相同的使用者操作。

使用者操作

建立使用者

users 端點上執行 create 命令以建立新的使用者。

例如

$ kcadm.sh create users -r demorealm -s username=testuser -s enabled=true

列出使用者

使用 users 端點列出使用者。目標使用者下次登入時必須變更密碼。

例如

$ kcadm.sh get users -r demorealm --offset 0 --limit 1000

您可以使用 usernamefirstNamelastNameemail 篩選使用者。

例如

$ kcadm.sh get users -r demorealm -q q=email:google.com
$ kcadm.sh get users -r demorealm -q q=username:testuser

篩選不使用完全比對。此範例將 username 屬性的值與 *testuser* 模式進行比對。

對於用戶端、群組和使用者,您可以透過指定更複雜的 q 查詢參數,跨多個屬性進行篩選。您可以使用類似 -q q="field1:value1 field2:value2" 的語法。Keycloak 只會傳回符合所有屬性條件的使用者。

取得特定使用者

使用使用者 ID 來構成端點 URI,例如 users/USER_ID

例如

$ kcadm.sh get users/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2 -r demorealm

更新使用者

使用 update 命令,以及您用來取得特定使用者的相同端點 URI。

例如

  • Linux

    $ kcadm.sh update users/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2 -r demorealm -s 'requiredActions=["VERIFY_EMAIL","UPDATE_PROFILE","CONFIGURE_TOTP","UPDATE_PASSWORD"]'
  • Windows

    c:\> kcadm update users/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2 -r demorealm -s "requiredActions=[\"VERIFY_EMAIL\",\"UPDATE_PROFILE\",\"CONFIGURE_TOTP\",\"UPDATE_PASSWORD\"]"

刪除使用者

使用 delete 命令,以及您用來取得特定使用者的相同端點 URI。

例如

$ kcadm.sh delete users/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2 -r demorealm

重設使用者密碼

使用專用的 set-password 命令重設使用者密碼。

例如

$ kcadm.sh set-password -r demorealm --username testuser --new-password NEWPASSWORD --temporary

此命令會為使用者設定臨時密碼。目標使用者下次登入時必須變更密碼。

您可以使用 --userid 透過 id 屬性指定使用者。

您可以使用在您用來取得特定使用者的端點所建構的端點上使用 update 命令,例如 users/USER_ID/reset-password,來達成相同的結果。

例如

$ kcadm.sh update users/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2/reset-password -r demorealm -s type=password -s value=NEWPASSWORD -s temporary=true -n

-n 參數確保 Keycloak 在執行 PUT 命令之前不會執行 GET 命令。這是必要的,因為 reset-password 端點不支援 GET

列出使用者的已指派、可用和有效 realm 角色

您可以使用 get-roles 命令列出使用者的已指派、可用和有效 realm 角色。

  1. 按使用者名稱或 ID 指定目標使用者,以列出使用者的已指派 realm 角色。

    例如

    $ kcadm.sh get-roles -r demorealm --uusername testuser
  2. 使用 --effective 選項以列出有效 realm 角色。

    例如

    $ kcadm.sh get-roles -r demorealm --uusername testuser --effective
  3. 使用 --available 選項以列出您可以新增至使用者的 realm 角色。

    例如

    $ kcadm.sh get-roles -r demorealm --uusername testuser --available

列出使用者的已指派、可用和有效用戶端角色

使用 get-roles 命令列出使用者的已指派、可用和有效用戶端角色。

  1. 按使用者名稱 (--uusername 選項) 或 ID (--uid 選項) 和按 clientId 屬性 (--cclientid 選項) 或 ID (--cid 選項) 指定目標使用者和用戶端,以列出使用者的已指派用戶端角色。

    例如

    $ kcadm.sh get-roles -r demorealm --uusername testuser --cclientid realm-management
  2. 使用 --effective 選項以列出有效 realm 角色。

    例如

    $ kcadm.sh get-roles -r demorealm --uusername testuser --cclientid realm-management --effective
  3. 使用 --available 選項以列出您可以新增至使用者的 realm 角色。

    例如

    $ kcadm.sh get-roles -r demorealm --uusername testuser --cclientid realm-management --available

將 realm 角色新增至使用者

使用 add-roles 命令將 realm 角色新增至使用者。

使用以下範例將 user 角色新增至使用者 testuser

$ kcadm.sh add-roles --uusername testuser --rolename user -r demorealm

從使用者移除 realm 角色

使用 remove-roles 命令從使用者移除 realm 角色。

使用以下範例從使用者 testuser 移除 user 角色

$ kcadm.sh remove-roles --uusername testuser --rolename user -r demorealm

將用戶端角色新增至使用者

使用 add-roles 命令將用戶端角色新增至使用者。

使用以下範例將在用戶端 realm management 上定義的兩個角色,create-client 角色和 view-users 角色,新增至使用者 testuser

$ kcadm.sh add-roles -r demorealm --uusername testuser --cclientid realm-management --rolename create-client --rolename view-users

從使用者移除用戶端角色

使用 remove-roles 命令從使用者移除用戶端角色。

使用以下範例移除在 realm management 用戶端上定義的兩個角色

$ kcadm.sh remove-roles -r demorealm --uusername testuser --cclientid realm-management --rolename create-client --rolename view-users

列出使用者的工作階段

  1. 識別使用者的 ID,

  2. 使用 ID 來構成端點 URI,例如 users/ID/sessions

  3. 使用 get 命令擷取使用者的工作階段清單。

    例如

    $ kcadm.sh get users/6da5ab89-3397-4205-afaa-e201ff638f9e/sessions -r demorealm

從特定工作階段登出使用者

  1. 如前所述,判斷工作階段的 ID。

  2. 使用工作階段的 ID 來組成端點 URI,例如 sessions/ID

  3. 使用 delete 命令來使工作階段失效。

    例如

    $ kcadm.sh delete sessions/d0eaa7cc-8c5d-489d-811a-69d3c4ec84d1 -r demorealm

將使用者從所有工作階段登出

使用使用者的 ID 來建構端點 URI,例如 users/ID/logout

使用 create 命令在該端點 URI 上執行 POST

例如

$ kcadm.sh create users/6da5ab89-3397-4205-afaa-e201ff638f9e/logout -r demorealm -s realm=demorealm -s user=6da5ab89-3397-4205-afaa-e201ff638f9e

群組操作

建立群組

groups 端點上使用 create 命令來建立新的群組。

例如

$ kcadm.sh create groups -r demorealm -s name=Group

列出群組

groups 端點上使用 get 命令來列出群組。

例如

$ kcadm.sh get groups -r demorealm

取得特定群組

使用群組的 ID 來建構端點 URI,例如 groups/GROUP_ID

例如

$ kcadm.sh get groups/51204821-0580-46db-8f2d-27106c6b5ded -r demorealm

更新群組

使用您用來取得特定群組的相同端點 URI 來使用 update 命令。

例如

$ kcadm.sh update groups/51204821-0580-46db-8f2d-27106c6b5ded -s 'attributes.email=["group@example.com"]' -r demorealm

刪除群組

使用您用來取得特定群組的相同端點 URI 來使用 delete 命令。

例如

$ kcadm.sh delete groups/51204821-0580-46db-8f2d-27106c6b5ded -r demorealm

建立子群組

透過列出群組來找到父群組的 ID。 使用該 ID 來建構端點 URI,例如 groups/GROUP_ID/children

例如

$ kcadm.sh create groups/51204821-0580-46db-8f2d-27106c6b5ded/children -r demorealm -s name=SubGroup

將群組移動到另一個群組下

  1. 找到現有父群組的 ID 和現有子群組的 ID。

  2. 使用父群組的 ID 來建構端點 URI,例如 groups/PARENT_GROUP_ID/children

  3. 在此端點上執行 create 命令,並將子群組的 ID 作為 JSON 內文傳遞。

例如

$ kcadm.sh create groups/51204821-0580-46db-8f2d-27106c6b5ded/children -r demorealm -s id=08d410c6-d585-4059-bb07-54dcb92c5094 -s name=SubGroup

取得特定使用者的群組

使用使用者的 ID 來判斷使用者在群組中的成員資格,以組成端點 URI,例如 users/USER_ID/groups

例如

$ kcadm.sh get users/b544f379-5fc4-49e5-8a8d-5cfb71f46f53/groups -r demorealm

將使用者新增至群組

使用 update 命令,並搭配由使用者 ID 和群組 ID 組成的端點 URI,例如 users/USER_ID/groups/GROUP_ID,以將使用者新增至群組。

例如

$ kcadm.sh update users/b544f379-5fc4-49e5-8a8d-5cfb71f46f53/groups/ce01117a-7426-4670-a29a-5c118056fe20 -r demorealm -s realm=demorealm -s userId=b544f379-5fc4-49e5-8a8d-5cfb71f46f53 -s groupId=ce01117a-7426-4670-a29a-5c118056fe20 -n

將使用者從群組中移除

在您用來將使用者新增至群組的相同端點 URI 上使用 delete 命令,例如 users/USER_ID/groups/GROUP_ID,以將使用者從群組中移除。

例如

$ kcadm.sh delete users/b544f379-5fc4-49e5-8a8d-5cfb71f46f53/groups/ce01117a-7426-4670-a29a-5c118056fe20 -r demorealm

列出群組的已指派、可用和有效領域角色

使用專用的 get-roles 命令來列出群組的已指派、可用和有效領域角色。

  1. 依名稱 (--gname 選項)、路徑 (--gpath 選項) 或 ID (--gid 選項) 指定目標群組,以列出群組的已指派領域角色。

    例如

    $ kcadm.sh get-roles -r demorealm --gname Group
  2. 使用 --effective 選項以列出有效 realm 角色。

    例如

    $ kcadm.sh get-roles -r demorealm --gname Group --effective
  3. 使用 --available 選項來列出您可以新增至群組的領域角色。

    例如

    $ kcadm.sh get-roles -r demorealm --gname Group --available

列出群組的已指派、可用和有效用戶端角色

使用 get-roles 命令來列出群組的已指派、可用和有效用戶端角色。

  1. 依名稱 (--gname 選項) 或 ID (--gid 選項) 指定目標群組,

  2. 依 clientId 屬性 (--cclientid 選項) 或 ID (--id 選項) 指定用戶端,以列出使用者的已指派用戶端角色。

    例如

    $ kcadm.sh get-roles -r demorealm --gname Group --cclientid realm-management
  3. 使用 --effective 選項以列出有效 realm 角色。

    例如

    $ kcadm.sh get-roles -r demorealm --gname Group --cclientid realm-management --effective
  4. 使用 --available 選項來列出您仍然可以新增至群組的領域角色。

    例如

    $ kcadm.sh get-roles -r demorealm --gname Group --cclientid realm-management --available

身分提供者操作

列出可用的身分提供者

使用 serverinfo 端點來列出可用的身分提供者。

例如

$ kcadm.sh get serverinfo -r demorealm --fields 'identityProviders(*)'

Keycloak 處理 serverinfo 端點的方式與 realms 端點類似。 Keycloak 不會解析相對於目標領域的端點,因為它存在於任何特定領域之外。

列出已設定的身分提供者

使用 identity-provider/instances 端點。

例如

$ kcadm.sh get identity-provider/instances -r demorealm --fields alias,providerId,enabled

取得特定已設定的身分提供者

使用身分提供者的 alias 屬性來建構端點 URI,例如 identity-provider/instances/ALIAS,以取得特定身分提供者。

例如

$ kcadm.sh get identity-provider/instances/facebook -r demorealm

移除特定已設定的身分提供者

使用您用來取得特定已設定身分提供者的相同端點 URI 來使用 delete 命令,以移除特定已設定的身分提供者。

例如

$ kcadm.sh delete identity-provider/instances/facebook -r demorealm

設定 Keycloak OpenID Connect 身分提供者

  1. 當您建立新的身分提供者執行個體時,請使用 keycloak-oidc 作為 providerId

  2. 提供 config 屬性:authorizationUrltokenUrlclientIdclientSecret

    例如

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=keycloak-oidc -s providerId=keycloak-oidc -s enabled=true -s 'config.useJwksUrl="true"' -s config.authorizationUrl=https://127.0.0.1:8180/realms/demorealm/protocol/openid-connect/auth -s config.tokenUrl=https://127.0.0.1:8180/realms/demorealm/protocol/openid-connect/token -s config.clientId=demo-oidc-provider -s config.clientSecret=secret

設定 OpenID Connect 身分提供者

設定一般 OpenID Connect 提供者的方式與設定 Keycloak OpenID Connect 提供者的方式相同,只是您將 providerId 屬性值設定為 oidc

設定 SAML 2 身分提供者

  1. 使用 saml 作為 providerId

  2. 提供 config 屬性:singleSignOnServiceUrlnameIDPolicyFormatsignatureAlgorithm

例如

$ kcadm.sh create identity-provider/instances -r demorealm -s alias=saml -s providerId=saml -s enabled=true -s 'config.useJwksUrl="true"' -s config.singleSignOnServiceUrl=https://127.0.0.1:8180/realms/saml-broker-realm/protocol/saml -s config.nameIDPolicyFormat=urn:oasis:names:tc:SAML:2.0:nameid-format:persistent -s config.signatureAlgorithm=RSA_SHA256

設定 Facebook 身分提供者

  1. 使用 facebook 作為 providerId

  2. 提供 config 屬性:clientIdclientSecret。 您可以在 Facebook 開發人員應用程式的應用程式設定頁面中找到這些屬性。 如需詳細資訊,請參閱 Facebook 身分代理人頁面。

    例如

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=facebook -s providerId=facebook -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=FACEBOOK_CLIENT_ID -s config.clientSecret=FACEBOOK_CLIENT_SECRET

設定 Google 身分提供者

  1. 使用 google 作為 providerId

  2. 提供 config 屬性:clientIdclientSecret。 您可以在 Google 開發人員應用程式的應用程式設定頁面中找到這些屬性。 如需詳細資訊,請參閱 Google 身分代理人頁面。

    例如

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=google -s providerId=google -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=GOOGLE_CLIENT_ID -s config.clientSecret=GOOGLE_CLIENT_SECRET

設定 Twitter 身分提供者

  1. 使用 twitter 作為 providerId

  2. 提供 config 屬性 clientIdclientSecret。 您可以在 Twitter 應用程式管理應用程式的應用程式設定頁面中找到這些屬性。 如需詳細資訊,請參閱 Twitter 身分代理人頁面。

    例如

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=google -s providerId=google -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=TWITTER_API_KEY -s config.clientSecret=TWITTER_API_SECRET

設定 GitHub 身分提供者

  1. 使用 github 作為 providerId

  2. 提供 config 屬性 clientIdclientSecret。 您可以在 GitHub 開發人員應用程式設定頁面中找到您應用程式的這些屬性。 如需詳細資訊,請參閱 GitHub 身分代理人頁面。

    例如

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=github -s providerId=github -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=GITHUB_CLIENT_ID -s config.clientSecret=GITHUB_CLIENT_SECRET

設定 LinkedIn 身分提供者

  1. 使用 linkedin 作為 providerId

  2. 提供 config 屬性 clientIdclientSecret。 您可以在 LinkedIn 開發人員主控台的應用程式頁面中找到您應用程式的這些屬性。 如需詳細資訊,請參閱 LinkedIn 身分代理人頁面。

    例如

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=linkedin -s providerId=linkedin -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=LINKEDIN_CLIENT_ID -s config.clientSecret=LINKEDIN_CLIENT_SECRET

設定 Microsoft Live 身分提供者

  1. 使用 microsoft 作為 providerId

  2. 提供 config 屬性 clientIdclientSecret。 您可以在 Microsoft 應用程式註冊入口網站頁面中找到您應用程式的這些屬性。 如需詳細資訊,請參閱 Microsoft 身分代理人頁面。

    例如

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=microsoft -s providerId=microsoft -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=MICROSOFT_APP_ID -s config.clientSecret=MICROSOFT_PASSWORD

設定 Stack Overflow 身分提供者

  1. 使用 stackoverflow 命令作為 providerId

  2. 提供 config 屬性 clientIdclientSecretkey。 您可以在 Stack Apps OAuth 頁面中找到您應用程式的這些屬性。 如需詳細資訊,請參閱 Stack Overflow 身分代理人頁面。

    例如

    $ kcadm.sh create identity-provider/instances -r demorealm -s alias=stackoverflow -s providerId=stackoverflow -s enabled=true  -s 'config.useJwksUrl="true"' -s config.clientId=STACKAPPS_CLIENT_ID -s config.clientSecret=STACKAPPS_CLIENT_SECRET -s config.key=STACKAPPS_KEY

儲存提供者操作

設定 Kerberos 儲存提供者

  1. 針對 components 端點使用 create 命令。

  2. 將領域 ID 指定為 parentId 屬性的值。

  3. kerberos 指定為 providerId 屬性的值,並將 org.keycloak.storage.UserStorageProvider 指定為 providerType 屬性的值。

  4. 例如

    $ kcadm.sh create components -r demorealm -s parentId=demorealmId -s id=demokerberos -s name=demokerberos -s providerId=kerberos -s providerType=org.keycloak.storage.UserStorageProvider -s 'config.priority=["0"]' -s 'config.debug=["false"]' -s 'config.allowPasswordAuthentication=["true"]' -s 'config.editMode=["UNSYNCED"]' -s 'config.updateProfileFirstLogin=["true"]' -s 'config.allowKerberosAuthentication=["true"]' -s 'config.kerberosRealm=["KEYCLOAK.ORG"]' -s 'config.keyTab=["http.keytab"]' -s 'config.serverPrincipal=["HTTP/localhost@KEYCLOAK.ORG"]' -s 'config.cachePolicy=["DEFAULT"]'

設定 LDAP 使用者儲存提供者

  1. 針對 components 端點使用 create 命令。

  2. ldap 指定為 providerId 屬性的值,並將 org.keycloak.storage.UserStorageProvider 指定為 providerType 屬性的值。

  3. 提供領域 ID 作為 parentId 屬性的值。

  4. 使用下列範例來建立 Kerberos 整合的 LDAP 提供者。

    $ kcadm.sh create components -r demorealm -s name=kerberos-ldap-provider -s providerId=ldap -s providerType=org.keycloak.storage.UserStorageProvider -s parentId=3d9c572b-8f33-483f-98a6-8bb421667867  -s 'config.priority=["1"]' -s 'config.fullSyncPeriod=["-1"]' -s 'config.changedSyncPeriod=["-1"]' -s 'config.cachePolicy=["DEFAULT"]' -s config.evictionDay=[] -s config.evictionHour=[] -s config.evictionMinute=[] -s config.maxLifespan=[] -s 'config.batchSizeForSync=["1000"]' -s 'config.editMode=["WRITABLE"]' -s 'config.syncRegistrations=["false"]' -s 'config.vendor=["other"]' -s 'config.usernameLDAPAttribute=["uid"]' -s 'config.rdnLDAPAttribute=["uid"]' -s 'config.uuidLDAPAttribute=["entryUUID"]' -s 'config.userObjectClasses=["inetOrgPerson, organizationalPerson"]' -s 'config.connectionUrl=["ldap://127.0.0.1:10389"]'  -s 'config.usersDn=["ou=People,dc=keycloak,dc=org"]' -s 'config.authType=["simple"]' -s 'config.bindDn=["uid=admin,ou=system"]' -s 'config.bindCredential=["secret"]' -s 'config.searchScope=["1"]' -s 'config.useTruststoreSpi=["always"]' -s 'config.connectionPooling=["true"]' -s 'config.pagination=["true"]' -s 'config.allowKerberosAuthentication=["true"]' -s 'config.serverPrincipal=["HTTP/localhost@KEYCLOAK.ORG"]' -s 'config.keyTab=["http.keytab"]' -s 'config.kerberosRealm=["KEYCLOAK.ORG"]' -s 'config.debug=["true"]' -s 'config.useKerberosForPasswordAuthentication=["true"]'

移除使用者儲存提供者執行個體

  1. 使用儲存提供者執行個體的 id 屬性來組成端點 URI,例如 components/ID

  2. 針對此端點執行 delete 命令。

    例如

    $ kcadm.sh delete components/3d9c572b-8f33-483f-98a6-8bb421667867 -r demorealm

觸發特定使用者儲存提供者的所有使用者同步

  1. 使用儲存提供者的 id 屬性來組成端點 URI,例如 user-storage/ID_OF_USER_STORAGE_INSTANCE/sync

  2. 新增 action=triggerFullSync 查詢參數。

  3. 執行 create 命令。

    例如

    $ kcadm.sh create user-storage/b7c63d02-b62a-4fc1-977c-947d6a09e1ea/sync?action=triggerFullSync

觸發特定使用者儲存提供者的已變更使用者同步

  1. 使用儲存提供者的 id 屬性來組成端點 URI,例如 user-storage/ID_OF_USER_STORAGE_INSTANCE/sync

  2. 新增 action=triggerChangedUsersSync 查詢參數。

  3. 執行 create 命令。

    例如

    $ kcadm.sh create user-storage/b7c63d02-b62a-4fc1-977c-947d6a09e1ea/sync?action=triggerChangedUsersSync

測試 LDAP 使用者儲存連線能力

  1. testLDAPConnection 端點上執行 get 命令。

  2. 提供查詢參數 bindCredentialbindDnconnectionUrluseTruststoreSpi

  3. action 查詢參數設定為 testConnection

    例如

    $ kcadm.sh create testLDAPConnection -s action=testConnection -s bindCredential=secret -s bindDn=uid=admin,ou=system -s connectionUrl=ldap://127.0.0.1:10389 -s useTruststoreSpi=always

測試 LDAP 使用者儲存驗證

  1. testLDAPConnection 端點上執行 get 命令。

  2. 提供查詢參數 bindCredentialbindDnconnectionUrluseTruststoreSpi

  3. action 查詢參數設定為 testAuthentication

    例如

    $ kcadm.sh create testLDAPConnection -s action=testAuthentication -s bindCredential=secret -s bindDn=uid=admin,ou=system -s connectionUrl=ldap://127.0.0.1:10389 -s useTruststoreSpi=always

新增對應程式

新增硬式編碼角色 LDAP 對應程式

  1. components 端點上執行 create 命令。

  2. providerType 屬性設定為 org.keycloak.storage.ldap.mappers.LDAPStorageMapper

  3. parentId 屬性設定為 LDAP 提供者執行個體的 ID。

  4. providerId 屬性設定為 hardcoded-ldap-role-mapper。 請確保您提供 role 設定參數的值。

    例如

    $ kcadm.sh create components -r demorealm -s name=hardcoded-ldap-role-mapper -s providerId=hardcoded-ldap-role-mapper -s providerType=org.keycloak.storage.ldap.mappers.LDAPStorageMapper -s parentId=b7c63d02-b62a-4fc1-977c-947d6a09e1ea -s 'config.role=["realm-management.create-client"]'

新增 MS Active Directory 對應程式

  1. components 端點上執行 create 命令。

  2. providerType 屬性設定為 org.keycloak.storage.ldap.mappers.LDAPStorageMapper

  3. parentId 屬性設定為 LDAP 提供者執行個體的 ID。

  4. providerId 屬性設定為 msad-user-account-control-mapper

    例如

    $ kcadm.sh create components -r demorealm -s name=msad-user-account-control-mapper -s providerId=msad-user-account-control-mapper -s providerType=org.keycloak.storage.ldap.mappers.LDAPStorageMapper -s parentId=b7c63d02-b62a-4fc1-977c-947d6a09e1ea

新增使用者屬性 LDAP 對應程式

  1. components 端點上執行 create 命令。

  2. providerType 屬性設定為 org.keycloak.storage.ldap.mappers.LDAPStorageMapper

  3. parentId 屬性設定為 LDAP 提供者執行個體的 ID。

  4. providerId 屬性設定為 user-attribute-ldap-mapper

    例如

    $ kcadm.sh create components -r demorealm -s name=user-attribute-ldap-mapper -s providerId=user-attribute-ldap-mapper -s providerType=org.keycloak.storage.ldap.mappers.LDAPStorageMapper -s parentId=b7c63d02-b62a-4fc1-977c-947d6a09e1ea -s 'config."user.model.attribute"=["email"]' -s 'config."ldap.attribute"=["mail"]' -s 'config."read.only"=["false"]' -s 'config."always.read.value.from.ldap"=["false"]' -s 'config."is.mandatory.in.ldap"=["false"]'

新增群組 LDAP 對應程式

  1. components 端點上執行 create 命令。

  2. providerType 屬性設定為 org.keycloak.storage.ldap.mappers.LDAPStorageMapper

  3. parentId 屬性設定為 LDAP 提供者執行個體的 ID。

  4. providerId 屬性設定為 group-ldap-mapper

    例如

    $ kcadm.sh create components -r demorealm -s name=group-ldap-mapper -s providerId=group-ldap-mapper -s providerType=org.keycloak.storage.ldap.mappers.LDAPStorageMapper -s parentId=b7c63d02-b62a-4fc1-977c-947d6a09e1ea -s 'config."groups.dn"=[]' -s 'config."group.name.ldap.attribute"=["cn"]' -s 'config."group.object.classes"=["groupOfNames"]' -s 'config."preserve.group.inheritance"=["true"]' -s 'config."membership.ldap.attribute"=["member"]' -s 'config."membership.attribute.type"=["DN"]' -s 'config."groups.ldap.filter"=[]' -s 'config.mode=["LDAP_ONLY"]' -s 'config."user.roles.retrieve.strategy"=["LOAD_GROUPS_BY_MEMBER_ATTRIBUTE"]' -s 'config."mapped.group.attributes"=["admins-group"]' -s 'config."drop.non.existing.groups.during.sync"=["false"]' -s 'config.roles=["admins"]' -s 'config.groups=["admins-group"]' -s 'config.group=[]' -s 'config.preserve=["true"]' -s 'config.membership=["member"]'

新增完整名稱 LDAP 對應程式

  1. components 端點上執行 create 命令。

  2. providerType 屬性設定為 org.keycloak.storage.ldap.mappers.LDAPStorageMapper

  3. parentId 屬性設定為 LDAP 提供者執行個體的 ID。

  4. providerId 屬性設定為 full-name-ldap-mapper

    例如

    $ kcadm.sh create components -r demorealm -s name=full-name-ldap-mapper -s providerId=full-name-ldap-mapper -s providerType=org.keycloak.storage.ldap.mappers.LDAPStorageMapper -s parentId=b7c63d02-b62a-4fc1-977c-947d6a09e1ea -s 'config."ldap.full.name.attribute"=["cn"]' -s 'config."read.only"=["false"]' -s 'config."write.only"=["true"]'

驗證操作

設定密碼原則

  1. 將領域的 passwordPolicy 屬性設定為包含特定原則提供者 ID 和選用設定的列舉運算式。

  2. 使用下列範例將密碼原則設定為預設值。 預設值包括

    • 210,000 次雜湊反覆運算

    • 至少一個特殊字元

    • 至少一個大寫字元

    • 至少一個數字字元

    • 不得等於使用者的 username

    • 長度至少為八個字元

      $ kcadm.sh update realms/demorealm -s 'passwordPolicy="hashIterations and specialChars and upperCase and digits and notUsername and length"'
  3. 若要使用與預設值不同的值,請在方括號中傳遞設定。

  4. 使用下列範例將密碼原則設定為

    • 300,000 次雜湊反覆運算

    • 至少兩個特殊字元

    • 至少兩個大寫字元

    • 至少兩個小寫字元

    • 至少兩個數字

    • 長度至少為九個字元

    • 不得等於使用者的 username

    • 至少四次變更後不要重複

      $ kcadm.sh update realms/demorealm -s 'passwordPolicy="hashIterations(300000) and specialChars(2) and upperCase(2) and lowerCase(2) and digits(2) and length(9) and notUsername and passwordHistory(4)"'

取得目前的密碼原則

您可以透過篩選除 passwordPolicy 屬性之外的所有輸出來取得目前的領域設定。

例如,顯示 demorealmpasswordPolicy

$ kcadm.sh get realms/demorealm --fields passwordPolicy

列出驗證流程

authentication/flows 端點上執行 get 命令。

例如

$ kcadm.sh get authentication/flows -r demorealm

取得特定驗證流程

authentication/flows/FLOW_ID 端點上執行 get 命令。

例如

$ kcadm.sh get authentication/flows/febfd772-e1a1-42fb-b8ae-00c0566fafb8 -r demorealm

列出流程的執行

authentication/flows/FLOW_ALIAS/executions 端點上執行 get 命令。

例如

$ kcadm.sh get authentication/flows/Copy%20of%20browser/executions -r demorealm

將設定新增至執行

  1. 取得流程的執行。

  2. 記下流程的 ID。

  3. authentication/executions/{executionId}/config 端點上執行 create 命令。

例如

$ kcadm.sh create "authentication/executions/a3147129-c402-4760-86d9-3f2345e401c7/config" -r demorealm -b '{"config":{"x509-cert-auth.mapping-source-selection":"Match SubjectDN using regular expression","x509-cert-auth.regular-expression":"(.*?)(?:$)","x509-cert-auth.mapper-selection":"Custom Attribute Mapper","x509-cert-auth.mapper-selection.user-attribute-name":"usercertificate","x509-cert-auth.crl-checking-enabled":"","x509-cert-auth.crldp-checking-enabled":false,"x509-cert-auth.crl-relative-path":"crl.pem","x509-cert-auth.ocsp-checking-enabled":"","x509-cert-auth.ocsp-responder-uri":"","x509-cert-auth.keyusage":"","x509-cert-auth.extendedkeyusage":"","x509-cert-auth.confirmation-page-disallowed":""},"alias":"my_otp_config"}'

取得執行的設定

  1. 取得流程的執行。

  2. 記下其 authenticationConfig 屬性,其中包含設定 ID。

  3. authentication/config/ID 端點上執行 get 命令。

例如

$ kcadm get "authentication/config/dd91611a-d25c-421a-87e2-227c18421833" -r demorealm

更新執行的設定

  1. 取得流程的執行。

  2. 取得流程的 authenticationConfig 屬性。

  3. 記下屬性中的設定 ID。

  4. authentication/config/ID 端點上執行 update 命令。

例如

$ kcadm update "authentication/config/dd91611a-d25c-421a-87e2-227c18421833" -r demorealm -b '{"id":"dd91611a-d25c-421a-87e2-227c18421833","alias":"my_otp_config","config":{"x509-cert-auth.extendedkeyusage":"","x509-cert-auth.mapper-selection.user-attribute-name":"usercertificate","x509-cert-auth.ocsp-responder-uri":"","x509-cert-auth.regular-expression":"(.*?)(?:$)","x509-cert-auth.crl-checking-enabled":"true","x509-cert-auth.confirmation-page-disallowed":"","x509-cert-auth.keyusage":"","x509-cert-auth.mapper-selection":"Custom Attribute Mapper","x509-cert-auth.crl-relative-path":"crl.pem","x509-cert-auth.crldp-checking-enabled":"false","x509-cert-auth.mapping-source-selection":"Match SubjectDN using regular expression","x509-cert-auth.ocsp-checking-enabled":""}}'

刪除執行的設定

  1. 取得流程的執行。

  2. 取得流程的 authenticationConfig 屬性。

  3. 記下屬性中的設定 ID。

  4. authentication/config/ID 端點上執行 delete 命令。

例如

$ kcadm delete "authentication/config/dd91611a-d25c-421a-87e2-227c18421833" -r demorealm