使用 AD FS 微調 SQL 並解決延遲問題

AD FS 2016 的更新中,我們引進了下列改進項目,以減少跨資料庫延遲。 AD FS 2019 即將推出的更新將包含這些改進項目。

背景執行緒中的記憶體內部快取更新

在先前的 Always on 可用性 (AoA) 部署中,由於主要節點可能位於個別的資料中心,因此任何「讀取」作業都存在延遲。 兩個不同資料中心間的呼叫會導致延遲。

在 AD FS 的最新更新中,透過新增背景執行緒來重新整理 AD FS 組態快取,以及設定重新整理時間週期的設定,藉此減少延遲。 由於資料庫快取更新已移至背景執行緒,因此在要求執行緒中資料庫查閱所花費的時間會大幅減少。

backgroundCacheRefreshEnabled 設定為 true 時,AD FS 會啟用背景執行緒來執行快取更新。 藉由設定 cacheRefreshIntervalSecs,即可將從快取擷取資料的頻率自訂為時間值。 當 backgroundCacheRefreshEnabled 設為 true 時,預設值會設定為 300 秒。 設定值持續時間之後,AD FS 會開始重新整理其快取,而當更新在進行中時,將會繼續使用舊的快取資料。

當 AD FS 收到應用程式的要求時,AD FS 會從 SQL 擷取應用程式,並將其新增至快取。 達到 cacheRefreshIntervalSecs 值時,快取中的應用程式便會使用背景執行緒重新整理。 當快取中有項目時,傳入要求會在背景重新整理進行時使用快取。 如果未針對 5 * cacheRefreshIntervalSecs 存取項目,則會從快取卸除。 達到可設定 maxRelyingPartyEntries 值之後,也可以從快取卸除最舊的項目。

注意

如果 AD FS 收到來自 SQL 的通知,表示資料庫中發生變更,則快取的資料將會在 cacheRefreshIntervalSecs 值之外重新整理。 此通知會觸發快取重新整理。

設定快取重新整理的建議

快取重新整理間隔的預設值為 5 分鐘。 建議將該值設定為 1 小時,以減少不必要的 AD FS 資料重新整理,因為快取資料會在發生任何 SQL 變更時重新整理。

AD FS 會註冊 SQL 變更的回呼,並在變更時收到通知。 透過此方法,AD FS 會在發生變更時立即從 SQL 收到每個新的變更。

當網路故障導致 AD FS 遺失 SQL 通知時,AD FS 會按快取重新整理值所指定的間隔重新整理。 如果您懷疑在 AD FS 與 SQL 之間有任何連線問題,建議將快取重新整理值設定為小於 1 小時。

設定指示

組態檔支援多個快取項目。 以下所列項目皆可根據貴組織的需求來設定。

下列範例會啟用背景快取重新整理,並將快取重新整理期間設定為 1800 秒或 30 分鐘。 此操作必須在每個 AD FS 節點上完成,而且之後必須重新啟動 AD FS 服務。 這些變更不會影響其他節點,並會在對所有節點進行變更前先測試第一個節點。

  1. 瀏覽至 AD FS 設定檔 (預設位置 C:\Windows\ADFS\Microsoft.IdentityServer.ServiceHost.exe.config),並在「Microsoft.IdentityServer.Service」區段下,新增下列項目:
  • backgroundCacheRefreshEnabled - 指定是否啟用背景快取功能。 「true/false」值。
  • cacheRefreshIntervalSecs - AD FS 將重新整理快取的秒數。 如果 SQL 中有任何變更,AD FS 將會重新整理快取。 AD FS 會收到 SQL 通知並重新整理快取。

注意

組態檔中的所有項目皆區分大小寫。 <cache cacheRefreshIntervalSecs="1800" > backgroundCacheRefreshEnabled="true" />

其他支援的可設定值:

  • maxRelyingPartyEntries - AD FS 將保留在記憶體中的信賴憑證者項目數目上限。 oAuth 應用程式權限快取也會使用此值。 如果應用程式權限比信賴憑證者多,且這些權限都儲存在記憶體中,則此值應該是應用程式權限的數目。 預設值為 1000。
  • maxIdentityProviderEntries - 這是 AD FS 將保留在記憶體中的宣告提供者項目數目上限。 預設值為 200。
  • maxClientEntries - 這是 AD FS 將保留在記憶體中的 OAuth 用戶端項目數目上限。 預設值為 500。
  • maxClaimDescriptorEntries - 這是 AD FS 將保留在記憶體中的宣告描述元項目數目上限。 預設值為 500。
  • maxNullEntries - 這會做為負快取使用。 當 AD FS 尋找資料庫中的項目但找不到時,AD FS 會在負快取中新增。 這是該快取的大小上限。 每個類型的物件都有其負快取,而不是所有物件共用單一快取。 預設值是 50,0000。

跨資料中心的多個成品資料庫支援

針對多個資料中心的先前組態,AD FS 只支援單一成品資料庫,導致擷取呼叫期間發生跨中心資料中心延遲。

為了減少跨資料中心延遲,AD FS 系統管理員現在可以部署多個成品資料庫執行個體,然後修改 AD FS 節點的組態檔,以指向不同的成品資料庫執行個體。 成品資料庫連接字串可以在允許個別節點成品資料庫的組態檔中提供。 如果組態檔中沒有連接字串,節點會回復到先前的設計,以使用組態資料庫中存在的成品資料庫。 此組態也支援混合式環境。

需求

在設定多個成品資料庫支援之前,請在所有節點上執行更新,並更新二進位檔,因為多節點呼叫需透過這項功能進行。

  1. 產生部署指令碼以建立成品資料庫:若要部署多個成品資料庫執行個體,系統管理員必須產生成品資料庫的 SQL 部署指令碼。 在此更新中,現有的 Export-AdfsDeploymentSQLScriptCmdlet 已更新為選擇性接受參數,以指定要為其產生 SQL 部署指令碼的 AD FS 資料庫。

例如,若要只產生成品資料庫的部署指令碼,請指定 -DatabaseType 參數,並傳入值「成品」。 選擇性 -DatabaseType 參數會指定 AD FS 資料庫類型,並可設定為:「全部」(預設)、「成品」或「組態」。 如果未指定任何 -DatabaseType 參數,指令碼會同時設定「成品」和「組態」指令碼。

PS C:\> Export-AdfsDeploymentSQLScript -DestinationFolder <script folder where scripts will be created> -ServiceAccountName <domain\serviceaccount> -DatabaseType "Artifact"

產生的指令碼應該在 SQL 電腦上執行,以建立必要的資料庫,並將 AD FS 服務帳戶 SQL SA 權限提供給這些資料庫。

  1. 使用部署指令碼建立成品資料庫。 將新產生的 CreateDB.sql 和 SetPermissions.sql 部署指令碼複製到 SQL 伺服器機器,然後執行這些指令碼以建立本機成品資料庫。

  2. 修改組態檔以新增成品資料庫連線。 瀏覽至 AD FS 節點的組態檔,然後在「Microsoft.IdentityServer.Service」區段下,將進入點新增至新設定的成品資料庫。

注意

artifactStore 和 connectionString 是區分大小寫的值。 請確定這些值已正確設定。 <artifactStore connectionString="Data Source=.\SQLInstance;Integrated Security=True;Initial Catalog=AdfsArtifactStore" />

使用符合 SQL 連線的資料來源值。

  1. 重新啟動 AD FS 服務,讓變更生效。

注意

不建議在成品資料庫之間使用 SQL 複寫或同步處理。 建議作法是為每個資料中心設定一個成品資料庫。

跨資料中心容錯移轉和資料庫復原

建議在與主要成品資料庫相同的資料中心上建立容錯移轉成品資料庫。 如果發生容錯移轉,則不會增加延遲。 不建議跨資料中心容錯移轉成品資料庫。 下列詳細說明如何使用多個成品資料庫呼叫 OAuth、SAML、ESL 和權杖重新執行偵測函式。

  • OAuth 和 SAML

    針對 OAuth 和 SAML 成品要求,節點會在組態檔中存在的成品資料庫建立成品。 如果組態檔未包含成品資料庫連線,則會使用一般成品資料庫。 當下一個擷取成品的要求移至另一個節點時,另一個節點會將 rest API 設為第 1 個節點,以從成品資料庫擷取成品。 由於不同的節點可能有不同的成品資料庫,且節點並不知道這一點,因此這是必要的動作。 如果第 1 個節點關閉,成品解析將會失敗。 由於這項設計,不需要跨不同的資料中心複寫成品資料庫。 如果整個資料中心已關閉,則很有可能建立成品的節點也會關閉,這表示無法再解析成品。

  • 外部網路鎖定

    組態檔中參考的成品資料庫將用於外部網路鎖定資料。 不過,針對 ESL 功能,AD FS 會選擇主要節點,以在成品資料庫中寫入資料。 所有節點都會對主要節點進行 REST API 呼叫,以取得並設定每個使用者的最新資訊。 如果有多個成品資料庫正在使用中,系統管理員必須為每個成品資料庫或資料中心選取主要節點。

    若要選取一個節點做為 ESL 主要節點,請瀏覽至 AD FS 節點的組態檔,然後在「Microsoft.IdentityServer.Service」區段下,新增下列內容:

    在主要節點上,新增下列項目。 這三個索引鍵皆區分大小寫。

    <useractivityfarmrole masterFQDN=[所選主要物件的 FQDN] isMaster="true"/>

    在其他節點上新增下列項目:

    <useractivityfarmrole masterFQDN=[所選主要物件的 FQDN] isMaster="false"/>

    注意

    由於多個成品資料庫不會同步處理資料,因此不會在成品資料庫之間同步處理 ESL 值。 使用者可能會針對要求叫用不同的資料中心,因此讓 ExtranetLockoutThreshold 相依於成品資料庫數目 (ExtranetLockoutThreshold * 成品資料庫數目)。

    • 權杖重新執行偵測

      權杖重新執行偵測資料一律會從中央成品資料庫呼叫。 AD FS 會儲存來自宣告提供者信任的權杖,以確保無法重新執行相同的權杖。 如果攻擊者嘗試重新執行相同的權杖,AD FS 會驗證權杖是否存在於成品資料庫中。 如果權杖存在,將會拒絕要求。 中央成品資料庫用於確保安全性,由於成品資料庫資料不會複寫,攻擊者便可以將要求傳送至另一個資料中心並重新執行權杖。 在此案例中建立成品資料庫的其他唯讀複本不會防止跨資料中心延遲,因為只會使用中央成品資料庫。