AD FS OpenID Connect/OAuth 概念
適用於 Active Directory 同盟服務 (AD FS) 2016 和更新版本
新式驗證執行者
演員 | 描述 |
---|---|
終端使用者 | 存取資源的安全性主體 (使用者、應用程式、服務和群組)。 |
Client | 您的 Web 應用程式,依據其用戶端識別碼進行識別。 用戶端通常是使用者與其互動的一方,用戶端會向授權伺服器要求權杖。 |
授權伺服器/識別提供者 (IdP) | 您的 AD FS 伺服器。 負責驗證組織目錄中存在的安全性主體身分識別。 在成功驗證這些安全性主體時,伺服器會發出安全性權杖 (持有人存取權杖、識別碼權杖和重新整理權杖)。 |
資源伺服器/資源提供者/信賴憑證者 | 資源或資料所在的位置。 該位置會信任授權伺服器以安全地驗證和授權用戶端,並使用持有人存取權杖來確保可授與資源的存取權。 |
下圖介紹動作專案之間最基本的關聯性:
應用程式類型
應用程式類型 | 描述 | 角色 |
---|---|---|
原生應用程式 | 有時稱為「公用用戶端」。 其功能是成為在電腦或裝置上執行的用戶端應用程式,以及使用者互動的用戶端應用程式。 | 向授權伺服器 (AD FS) 要求權杖,以便讓使用者存取資源。 使用權杖做為 HTTP 標頭,將 HTTP 要求傳送至受保護的資源。 |
伺服器應用程式 (Web 應用程式) | 在伺服器上執行的 Web 應用程式,使用者可透過瀏覽器存取。 因為此應用程式能夠維護自己的用戶端密碼或認證,所以有時稱為「機密用戶端」。 | 向授權伺服器 (AD FS) 要求權杖,以便讓使用者存取資源。 在要求權杖之前,用戶端 (Web 應用程式) 必須使用其秘密進行驗證。 |
Web API | 使用者存取的最終資源。 可將其想像成信賴憑證者的新表示方式。 | 取用用戶端取得的持有人存取權杖。 |
應用程式群組
您必須將應用程式群組關聯至使用 AD FS 設定的每個原生或 Web 應用程式 OAuth 用戶端或 Web API 資源。 設定應用程式群組中的用戶端以存取相同群組中的資源。 應用程式群組可以有多個用戶端和資源。
安全性權杖
新式驗證會使用下列權杖類型:
- id_token:由授權伺服器 (AD FS) 發行的 JWT 權杖,並由用戶端取用。 識別碼權杖中的宣告包含使用者相關資訊,以供用戶端使用。
- access_token:由授權伺服器 (AD FS) 發出的 JWT 權杖,並預計由資源取用。 此權杖的「aud」或 audience 宣告必須符合資源或 Web API 的識別碼。
- refresh_token:當用戶端需要重新整理 id_token 和access_token 時,由 AD FS 發行供用戶端使用。 該權杖不會向用戶端顯示,而且只能由 AD FS 取用。
重新整理權杖存留期
- 簡單登入、沒有 KMSI、裝置「未」註冊:AD FS 會套用
SsoLifetime
和DeviceUsageWindowInDays
。 第一個重新整理權杖具有lifetime=DeviceUsageWindowInDays
或SsoLifetime
(取決於較低的欄位),但「不會」再發出任何重新整理權杖。 - KMSI 登入、AD FS conf 中的
EnableKmsi=true
,且kmsi=true
作為參數傳遞:AD FS 會套用KmsiLifetimeMins
搭配DeviceUsageWindowInDays
。 第一個重新整理權杖具有lifetime=DeviceUsageWindowInDays
,且每個後續grant_type=refresh_token
要求都會取得新的重新整理權杖。 此流程只適用於原生用戶端,或是機密用戶端加上裝置驗證。 - 已註冊的裝置、裝置驗證:AD FS 會使用
PersistentSsoLifetimeMins
與DeviceUsageWindowInDays
,類似於 KMSI。 原生和機密用戶端都應該根據裝置驗證取得新的重新整理權杖。
若要深入了解,請參閱 AD FS 單一登入文件。
範圍
在 AD FS 中註冊資源時,您可以設定 AD FS 執行特定動作的範圍。 除了設定範圍之外,您必須在 AD FS 要求中傳送範圍值才能執行動作。 例如,系統管理員在資源註冊期間將範圍設定為 openid
,而應用程式 (用戶端) 必須在 AD FS 的驗證要求中傳送 scope = openid
以發出識別碼權杖。 以下是 AD FS 中可用範圍的詳細資料:
aza
- 如果您使用 Broker 用戶端的 OAuth 2.0 通訊協定延伸模組,且範圍參數包含aza
範圍,則伺服器會發出新的主要重新整理權杖。 如果強制執行,它會設定回應中refresh_token
欄位的權杖,並將refresh_token_expires_in field
設定為新主要重新整理權杖的生命週期。openid
- 讓應用程式要求使用openid
連線驗證通訊協定。logon_cert
- 讓應用程式要求可用以透過互動方式登入已驗證使用者的登入憑證。 AD FS 伺服器會省略回應中的access_token
參數,並改為提供 base64 編碼的 CMS 憑證鏈或 CMC 完整 PKI 回應。 如需詳細資訊,請參閱 MS-OAPX:OAuth 2.0 通訊協定延伸模組。user_impersonation
- 要求來自 AD FS 的代理存取權杖。 如需此範圍使用方式的詳細資訊,請參閱使用 OAuth 搭配 AD FS 2016 的代理者 (OBO) 組建多層式應用程式。allatclaims
- 讓應用程式要求將存取權杖中的宣告一併新增至識別碼權杖。vpn_cert
- 讓應用程式要求 VPN 憑證,該憑證會使用 EAP-TLS 驗證建立 VPN 連線。 此功能已不再支援。email
- 讓應用程式要求登入使用者的電子郵件宣告。profile
- 讓應用程式要求已登入使用者的設定檔相關宣告。
宣告
AD FS 所發行的安全性權杖 (存取和識別碼權杖) 包含宣告,或是已驗證主體相關資訊的判斷提示。 應用程式可使用宣告來執行各種工作,包括:
- 驗證權杖
- 識別主體的目錄租用戶
- 顯示使用者資訊
- 判斷主體的授權
任何指定安全性權杖中存在的宣告取決於權杖類型、驗證使用者所使用的認證類型,以及應用程式組態。
高階 AD FS 驗證流程
高階流程如下圖所示。
AD FS 會從用戶端接收驗證要求。
AD FS 會在驗證要求中驗證用戶端識別碼,並在 AD FS 中的用戶端和資源註冊期間取得用戶端識別碼。 如果使用機密用戶端,AD FS 也會對驗證要求中提供的用戶端密碼進行驗證。 AD FS 也會驗證用戶端的重新導向 URI。
AD FS 會識別用戶端要透過驗證要求所傳遞資源參數存取的資源。 如果您使用 MSAL 用戶端程式庫,則不會傳送資源參數。 相反地,資源 URL 會當做範圍參數的一部分傳送:scope = [資源 URL]/[範圍值,例如 openid]。
如果未使用資源或範圍參數傳遞資源,AD FS 會使用預設資源
urn:microsoft:userinfo
,其原則 (例如 MFA、發行或授權原則) 無法設定。下一個 AD FS 會驗證用戶端是否具有存取資源的權限。 AD FS 也會驗證傳入驗證要求的範圍是否符合註冊資源時所設定的範圍。 如果用戶端沒有權限,或驗證要求中未傳送正確的範圍,則會終止驗證流程。
驗證完權限和範圍後,AD FS 就會使用已設定的驗證方法來驗證使用者。
如果個別資源原則或全域驗證原則需要其他驗證方法,AD FS 會觸發額外的驗證。
AD FS 使用 Microsoft Entra 多重要素驗證或第三方多重要素驗證來進行驗證。
使用者通過驗證後,AD FS 就會套用宣告規則。 宣告規則會將傳送至資源的宣告判斷為安全性權杖的一部分。 AD FS 也會套用存取控制原則,以確認使用者符合存取資源的必要條件。
接下來,AD FS 會產生存取權並重新整理權杖。 AD FS 也會產生識別碼權杖。
AD FS 接收驗證要求。
如果您在驗證要求中包含
scope = allatclaims
,該參數會自訂識別碼權杖,以根據定義的宣告規則在存取權杖中包含宣告。產生並自訂必要的權杖之後,AD FS 會回應用戶端並包含權杖。 只有當驗證要求包含
scope = openid
時,回應中才會包含識別碼權杖回應。 用戶端在使用權杖端點進行驗證之後一律可取得識別碼權杖。
程式庫類型
AD FS 可搭配兩種類型的程式庫使用:
用戶端程式庫:原生用戶端和伺服器應用程式會使用用戶端程式庫來取得存取權杖,藉此呼叫 Web API 等資源。 當您使用 AD FS 2019 時,Microsoft 驗證程式庫 (MSAL) 是最新版的建議用戶端程式庫。
伺服器中介軟體程式庫:Web 應用程式會使用伺服器中介軟體程式庫進行使用者登入。 Web API 會使用伺服器中介軟體程式庫來驗證原生用戶端或其他伺服器所傳送的權杖。 建議的中介軟體程式庫為 Open Web Interface for .NET (OWIN)。
自訂識別碼權杖 (識別碼權杖中的額外宣告)
在某些情況下,Web 應用程式用戶端可能需要識別碼權杖中的額外宣告以協助實現功能。 在識別碼權杖中設定額外宣告的選項如下:
選項 1:如果您有公用用戶端,且 Web 應用程式沒有嘗試存取的資源時,請使用此選項。 此選項需要:
- 將
response_mode
設定為form_post
- 信賴憑證者識別碼 (Web API 識別碼) 與用戶端識別碼相同
選項 2:當 Web 應用程式有嘗試存取的資源,且需要透過識別碼權杖傳遞額外的宣告時,請使用此選項。 公用和機密用戶端都可以使用。 此選項需要:
將
response_mode
設定為form_post
AD FS 伺服器上已安裝 KB4019472
範圍
allatclaims
會指派給用戶端 – RP 配對。 您可以使用Grant-ADFSApplicationPermission
來指派範圍。 如果已授與一次,請使用Set-AdfsApplicationPermission
。 PowerShell Cmdlet 的範例如下:Grant-AdfsApplicationPermission -ClientRoleIdentifier "https://my/privateclient" -ServerRoleIdentifier "https://rp/fedpassive" -ScopeNames "allatclaims","openid"
若要深入了解如何在 AD FS 中設定 Web 應用程式以取得自訂識別碼權杖,請參閱 AD FS 2016 或更新版本中的自訂識別碼權杖。
單一登出
單一登出會結束所有使用該工作階段識別碼的用戶端工作階段。 AD FS 2016 和更新版本支援 OpenID Connect/OAuth 的單一登出。 如需詳細資訊,請參閱使用 AD FS 的 OpenID Connect 單一登出。
AD FS 端點
AD FS 端點 | 描述 |
---|---|
/authorize | AD FS 會傳回可用來取得存取權杖的授權碼。 |
/token | AD FS 會傳回可用來存取資源的存取權杖,就像在 Web API 中一樣。 |
/userinfo | AD FS 會傳回主體宣告。 |
/devicecode | AD FS 會傳回裝置程式碼和使用者程式碼。 |
/logout | AD FS 會登出使用者。 |
/keys | 用來簽署回應的 AD FS 公開金鑰。 |
/.well-known/openid-configuration | AD FS 會傳回 OAuth/OpenID Connect 中繼資料。 |