MSAL 中支持的驗證流程
Microsoft 驗證連結庫 (MSAL) 支援數個授權授與和相關聯的令牌流程,以供不同的應用程式類型和案例使用。
驗證流程 | 使 | 支援的應用程式類型 |
---|---|---|
授權碼 | 使用者代表使用者登入和存取 Web API。 | * Desktop (電腦) * 行動 * 單頁應用程式 (SPA) (需要 PKCE) * Web |
用戶端認證 | 使用應用程式本身的身分識別來存取 Web API。 通常用於伺服器對伺服器通訊,以及不需要用戶互動的自動化腳本。 | 精靈 |
裝置代碼 | 使用者代表輸入限制裝置上的使用者登入及存取 Web API,例如智慧型手機電視與物聯網 (IoT) 裝置。 命令行介面 (CLI) 應用程式也使用。 | 桌面電腦、行動裝置版 |
隱含授與 | 使用者代表使用者登入和存取 Web API。 不再建議使用隱含授與流程 - 請改用授權碼搭配 Code Exchange 證明金鑰 (PKCE)。 | * 單頁應用程式 (SPA) * Web |
代表 (OBO) | 代表使用者從「上游」Web API 存取「下游」Web API。 使用者的身分識別和委派許可權會從上游 API 傳遞至下游 API。 | Web API |
使用者名稱/密碼 (ROPC) | 允許應用程式直接處理其密碼來登入使用者。 不建議使用 ROPC 流程。 | 桌面電腦、行動裝置版 |
綜合 Windows 驗證(IWA) | 允許已加入網域或 Microsoft Entra ID 的電腦上的應用程式以無訊息方式取得令牌(不需要使用者的任何 UI 互動)。 | 桌面電腦、行動裝置版 |
語彙基元
您的應用程式可以使用一或多個驗證流程。 每個流程都會使用特定令牌類型來進行驗證、授權和令牌重新整理,有些也會使用授權碼。
驗證流程或動作 | 需要 | 標識元令牌 | 存取權杖 | 重新整理令牌 | 授權碼 |
---|---|---|---|---|---|
授權碼流程 | ✅ | ✅ | ✅ | ✅ | |
用戶端認證 | ✅ (僅限 app) | ||||
裝置程式代碼流程 | ✅ | ✅ | ✅ | ||
隱含流程 | ✅ | ✅ | |||
代理者流程 | 存取權杖 | ✅ | ✅ | ✅ | |
使用者名稱/密碼 (ROPC) | 使用者名稱、密碼 | ✅ | ✅ | ✅ | |
混合式 OIDC 流程 | ✅ | ✅ | |||
重新整理權杖兌換 | 重新整理令牌 | ✅ | ✅ | ✅ |
互動式和非互動式驗證
其中數個流程同時支援互動式和非互動式令牌擷取。
- 互動式 - 授權伺服器可能會提示使用者輸入。 例如,若要登入、執行多重要素驗證 (MFA),或授與同意更多資源訪問許可權。
- 非互動式 - 使用者可能不會提示輸入。 也稱為無訊息令牌擷取,應用程式會嘗試使用授權伺服器可能無法提示使用者輸入的方法取得令牌。
您的 MSAL 型應用程式應該先嘗試以無訊息方式取得令牌,只有在非互動式嘗試失敗時,才回到互動式方法。 如需此模式的詳細資訊,請參閱 使用 Microsoft 驗證連結庫 (MSAL) 取得和快取令牌。
授權碼
Web 應用程式、單頁應用程式 (SPA) 和原生 (行動裝置和桌面) 應用程式可以使用 OAuth 2.0 授權碼授與,以存取受保護的資源,例如 Web API。
當使用者登入 Web 應用程式時,應用程式會收到可兌換存取令牌以呼叫 Web API 的授權碼。
在上圖中,應用程式:
- 要求兌換存取令牌的授權碼。
- 使用存取令牌來呼叫 Web API,例如 Microsoft Graph。
授權碼的條件約束
使用授權碼授與流程時,單頁應用程式需要 Code Exchange 的證明金鑰(PKCE )。 MSAL 支援 PKCE。
OAuth 2.0 規格要求您只 使用授權碼來兌換存取令牌一次。
如果您嘗試使用相同的授權碼多次取得存取令牌,Microsoft 身分識別平台 會傳回類似下列的錯誤。 請記住,某些連結庫和架構會自動為您要求授權碼,而且在這種情況下手動要求程式代碼也會導致此錯誤。
AADSTS70002: Error validating credentials. AADSTS54005: OAuth2 Authorization code was already redeemed, please retry with a new valid code or use an existing refresh token.
用戶端認證
OAuth 2 用戶端認證流程可讓您使用應用程式的身分識別來存取 Web 裝載的資源。 這種類型的授與通常用於必須在背景中執行的伺服器對伺服器 (S2S) 互動,而不需要使用者立即互動。 這些類型的應用程式通常稱為精靈或服務。
客戶端認證授與流程允許 Web 服務(機密用戶端)使用自己的認證,而不是模擬使用者,以在呼叫另一個 Web 服務時進行驗證。 在此案例中,用戶端通常是仲介層 Web 服務、精靈服務或網站。 為了獲得較高層級的保證,Microsoft 身分識別平台 也允許呼叫服務使用憑證(而不是共用密碼)作為認證。
應用程式祕密
在上圖中,應用程式:
- 使用應用程式密碼或密碼認證來取得令牌。
- 使用令牌來提出資源要求。
憑證
在上圖中,應用程式:
- 使用憑證認證取得令牌。
- 使用令牌來提出資源要求。
這種類型的用戶端認證必須是:
- 向 Azure AD 註冊。
- 在程式代碼中建構機密用戶端應用程式物件時傳入。
用戶端認證的條件約束
Android、iOS 或 通用 Windows 平台 (UWP) 等行動平臺不支援機密用戶端流程。 行動應用程式被視為無法保證驗證秘密機密性的公用用戶端應用程式。
裝置代碼
OAuth 2 裝置程式碼流程可讓使用者登入輸入限制的裝置,例如智慧型手機電視、物聯網 (IoT) 裝置和印表機。 使用 Microsoft Entra ID 進行互動式驗證需要網頁瀏覽器。 當裝置或作業系統未提供網頁瀏覽器時,裝置程式代碼流程可讓您使用其他裝置,例如電腦或行動電話,以互動方式登入。
透過使用裝置程式代碼流程,應用程式會透過針對這些裝置和作業系統設計的雙步驟程式來取得令牌。
在上圖中:
- 每當需要使用者驗證時,應用程式會提供程式碼,並要求使用者使用另一部裝置,例如因特網連線的智慧型手機來瀏覽 URL(例如)。
https://microsoft.com/devicelogin
然後,系統會提示使用者輸入程序代碼,並視需要繼續進行一般驗證體驗,包括同意提示和多重要素驗證。 - 成功驗證后,要求的應用程式會從 Microsoft 身分識別平台 接收必要的令牌,並使用它們來執行所需的 Web API 呼叫。
裝置程式代碼的條件約束
- 裝置程式代碼流程僅適用於公用用戶端應用程式。
- 當您以 MSAL 初始化公用用戶端應用程式時,請使用下列其中一種授權單位格式:
- 租使用者型:
https://login.microsoftonline.com/{tenant}/,
其中{tenant}
是代表租用戶標識碼的 GUID 或與租使用者相關聯的功能變數名稱。 - 公司與學校帳戶:
https://login.microsoftonline.com/organizations/
。
- 租使用者型:
隱含授與
隱含授與已由 授權碼流程取代為 PKCE ,作為用戶端單頁應用程式 (SPA) 慣用且更安全的令牌授與流程。 如果您要建置 SPA,請改用授權碼流程搭配 PKCE。
以 JavaScript 撰寫的單頁 Web 應用程式(包括 Angular、Vue.js 或 React.js 等架構)會從伺服器下載,而且其程式代碼會直接在瀏覽器中執行。 由於其用戶端程式代碼會在瀏覽器中執行,而不是在網頁伺服器上執行,因此其安全性特性與傳統伺服器端 Web 應用程式不同。 在授權碼流程的 Proof Key for Code Exchange (PKCE) 可用性之前,SPA 會使用隱含授與流程來改善存取令牌的回應性和效率。
OAuth 2 隱含授與流程可讓應用程式從 Microsoft 身分識別平台 取得存取令牌,而不需要執行後端伺服器認證交換。 隱含授與流程可讓應用程式登入使用者、維護會話,並從使用者代理程式下載和執行的 JavaScript 程式代碼中取得其他 Web API 的令牌(通常是網頁瀏覽器)。
隱含授與的條件約束
隱含授與流程不包含使用電子或 React Native 等跨平臺 JavaScript 架構的應用程式案例。 這類跨平台架構需要額外的功能,才能與其執行所在的原生桌面和行動平台互動。
透過隱含流程模式發出的令牌有 長度限制 ,因為它們會傳回URL中的瀏覽器(其中 response_mode
為 query
或 fragment
)。 有些瀏覽器會限制瀏覽器列中 URL 的長度,而且當 URL 太長時就會失敗。 因此,這些隱含流程令牌不包含 groups
或 wids
宣告。
代表 (OBO)
當應用程式叫用服務或 Web API 時,會使用 OAuth 2 代理驗證流程流程,而應用程式接著需要使用委派的使用者身分識別呼叫另一個服務或 Web API,以及需要透過要求鏈結傳播的許可權。 若要讓仲介層服務向下游服務提出已驗證的要求,它必須代表要求使用者保護來自 Microsoft 身分識別平台的存取令牌。
在上圖中:
- 應用程式會取得 Web API 的存取令牌。
- 用戶端(Web、桌面、行動裝置或單頁應用程式)會呼叫受保護的 Web API,並將存取令牌新增為 HTTP 要求的驗證標頭中的持有人令牌。 Web API 會驗證使用者。
- 當用戶端呼叫 Web API 時,Web API 會代表使用者要求另一個令牌。
- 受保護的 Web API 會使用此令牌代表使用者呼叫下游 Web API。 Web API 也可以稍後要求其他下游 API 的令牌(但仍代表相同的使用者)。
使用者名稱/密碼 (ROPC)
警告
不再建議使用資源擁有者密碼認證 (ROPC) 流程。 ROPC 需要高度的信任和認證暴露。 只有在無法使用更安全的流程時,才使用 ROPC。 如需詳細資訊,請參閱 如何解決日益嚴重的密碼問題?。
OAuth 2 資源擁有者密碼認證 (ROPC) 授與可讓應用程式直接處理其密碼來登入使用者。 在您的傳統型應用程式中,您可以使用使用者名稱/密碼流程以無訊息方式取得令牌。 使用應用程式時不需要UI。
某些應用程式案例,例如 DevOps,可能會發現 ROPC 很有用,但您應該避免在提供互動式 UI 供使用者登入的任何應用程式中使用。
在上圖中,應用程式:
- 藉由將使用者名稱和密碼傳送至識別提供者,以取得令牌。
- 使用令牌呼叫 Web API。
若要在已加入網域的 Windows 計算機上以無訊息方式取得令牌,建議您 使用 Web 帳戶管理員 (WAM) 而不是 ROPC。 在其他案例中,請使用裝置程序 代碼流程。
ROPC 的條件約束
下列條件約束適用於使用 ROPC 流程的應用程式:
- 不支援單一登錄。
- 不支援多重要素驗證 (MFA)。
- 使用此流程之前,請先洽詢租用戶系統管理員 - MFA 是常用的功能。
- 不支援條件式存取。
- ROPC 僅適用於 工作和學校帳戶。
- ROPC 不支援個人 Microsoft 帳戶 (MSA)。
- .NET 桌面和 .NET 應用程式中支援 ROPC。
- 通用 Windows 平台 (UWP) 應用程式中不支援 ROPC。
- Microsoft Entra 外部 ID 中的 ROPC 僅支援本機帳戶。
- 如需 MSAL.NET 和 Microsoft Entra 外部 ID 中 ROPC 的相關信息,請參閱使用 B2C 的資源擁有者密碼認證 (ROPC)。
綜合 Windows 驗證(IWA)
注意
整合式 Windows 驗證已取代為以更可靠的方式以無訊息方式取得令牌 - WAM。 WAM 可以以無訊息方式登入目前的 Windows 使用者。 此工作流程不需要複雜的設定,甚至適用於個人 (Microsoft) 帳戶。 在內部,Windows Broker (WAM) 會嘗試數種策略來取得目前 Windows 使用者的令牌,包括 IWA 和兌換 PRT。 這可消除 IWA 的大部分限制。
MSAL 支援在已加入網域或加入 Microsoft Entra ID 的 Windows 電腦上執行的桌面和行動應用程式整合式 Windows 驗證 (IWA)。 藉由使用 IWA,這些應用程式會以無訊息方式取得令牌,而不需要使用者進行 UI 互動。
在上圖中,應用程式:
- 使用整合式 Windows 驗證取得令牌。
- 使用令牌來提出資源要求。
IWA 的條件約束
- 相容性。 已針對 .NET 桌面、.NET 和 通用 Windows 平台 (UWP) 應用程式啟用整合式 Windows 驗證 (IWA)。 IWA 僅支援 ADFS 同盟使用者 - 在 Active Directory 中建立並由 Microsoft Entra 識別碼支援的使用者。 在沒有 Active Directory 備份的 Microsoft Entra 識別碼中直接建立的使用者(受控使用者)無法使用此驗證流程。
- 多重要素驗證 (MFA) 。 如果 Microsoft Entra ID 租使用者中啟用 MFA,且 Microsoft Entra ID 發出 MFA 挑戰,IWA 非互動式(無訊息)驗證可能會失敗。 如果 IWA 失敗,您應該回復為 如先前所述的互動式驗證 方法。 Microsoft Entra ID 會使用 AI 來判斷何時需要雙因素驗證。 當使用者從不同的國家/地區登入、連線到公司網路而不使用 VPN 時,有時透過 VPN 連線時,通常需要雙因素驗證。 因為 MFA 的組態和挑戰頻率可能不是開發人員,因此您的應用程式應該正常處理 IWA 無訊息令牌擷取失敗。
- 授權單位 URI 限制。 建構公用用戶端應用程式時傳入的授權單位必須是下列其中一項:
https://login.microsoftonline.com/{tenant}/
- 此授權單位指出單一租使用者應用程式,其登入物件僅限於指定 Microsoft Entra ID 租使用者中的使用者。 此值{tenant}
可以是 GUID 格式的租使用者標識碼或與租使用者相關聯的功能變數名稱。https://login.microsoftonline.com/organizations/
- 此授權單位指出多租使用者應用程式,其登入物件是任何 Microsoft Entra ID 租使用者中的使用者。
- 個人帳戶。 授權單位值 不得 包含
/common
或/consumers
,因為 IWA 不支援個人 Microsoft 帳戶 (MSA)。 - 同意需求。 由於 IWA 是無訊息流程,因此應用程式的使用者先前必須已同意使用應用程式,或租用戶系統管理員先前必須已同意租使用者中的所有使用者使用應用程式。 若要滿足任一需求,下列其中一項作業必須已完成:
- 身為應用程式開發人員,已自行在 Azure 入口網站中選取 [ 授與 ]。
- 租用戶系統管理員已在 Azure 入口網站 中應用程式註冊的 [API 許可權] 索引標籤中選取 [授與/撤銷 {tenant domain} 的管理員同意],請參閱新增存取 Web API 的許可權。
- 您已為使用者提供同意應用程式的方式;請參閱 Microsoft 身分識別平台 中的許可權和同意概觀。
- 您已為租用戶系統管理員提供應用程式同意的方式;請參閱 Microsoft 身分識別平台 中的許可權和同意概觀。
下一步
既然您已檢閱 MSAL 支援的驗證流程,請瞭解 取得和快取這些流程中使用的令牌。