驗證流程和應用程式情節

Microsoft 身分識別平台 (v2.0) 支援各種新式應用程式架構的驗證。 所有架構都是以業界標準通訊協定 OAuth 2.0 和 OpenID Connect 為基礎。 使用 Microsoft 身分識別平台的驗證程式庫,應用程式可對身分識別進行驗證並取得權杖,以存取受保護的 API。

此文章說明驗證流程,以及使用這些驗證流程的應用程式案例。

應用程式類別

您可以從數種類型的應用程式取得權杖,包括:

  • Web 應用程式
  • 行動應用程式
  • 傳統型應用程式
  • Web API

在無瀏覽器裝置上執行的應用程式,或在物聯網 (IoT) 上執行的應用程式,也可以取得權杖。

下列各節將描述應用程式的類別。

受保護的資源與用戶端應用程式

驗證情節牽涉到兩個活動:

  • 取得受保護 Web API 的安全性權杖:建議您使用由 Microsoft 開發及支援的 Microsoft 驗證程式庫 (MSAL)
  • 保護 Web API 或 Web 應用程式:保護這些資源的一大挑戰,就是驗證安全性權杖。 在某些平台上,Microsoft 提供會中介軟體程式庫

有使用者或沒有使用者

大部分的驗證案例都會代表登入的使用者取得權杖。

Scenarios with users

不過,也有精靈應用程式。 在這些案例中,應用程式會自行取得權杖,而非代表使用者。

Scenarios with daemon apps

單頁、公用用戶端和機密用戶端應用程式

您可以從多種應用程式類型取得安全性權杖。 這些應用程式通常分成下列三種類別: 每種都會搭配不同的程式庫和物件使用。

  • 單頁應用程式:也稱為 SPA,這些 Web 應用程式中的權杖是從在瀏覽器中執行的 JavaScript 或 TypeScript 應用程式取得。 許多新式應用程式的前端都有一個單頁應用程式,主要是以 JavaScript 撰寫。 此應用程式通常使用 Angular、React 或 Vue 之類的架構。 MSAL.js 是唯一支援單頁應用程式的 Microsoft 驗證程式庫。

  • 公開用戶端應用程式:此類別目錄中的應用程式 (例如下列類型) 一律會登入使用者:

    • 代表已登入使用者呼叫 Web API 的桌面應用程式
    • 行動應用程式
    • 在無瀏覽器裝置上執行的應用程式,例如在 IoT 上執行的應用程式
  • 機密用戶端應用程式:此類別中的應用程式包括:

    • 呼叫 Web API 的 Web 應用程式
    • 呼叫 Web API 的 Web API
    • 精靈應用程式 (即使以 Linux 精靈或 Windows 服務之類的主控台服務形式實作也是如此)

登入對象

可用的驗證流程會根據登入對象而有所不同。 有些流程僅適用於公司或學校帳戶。 其他類型則同時適用於公司或學校帳戶以及個人 Microsoft 帳戶。

如需詳細資訊,請參閱支援的帳戶類型

應用程式案例

Microsoft 身分識別平台支援下列應用程式架構的驗證:

  • 單一頁面應用程式
  • Web 應用程式
  • Web API
  • 行動應用程式
  • 原生應用程式
  • 精靈應用程式
  • 伺服器端應用程式

應用程式會使用不同驗證流程來登入使用者,並取得權杖以呼叫受保護的 API。

單一頁面應用程式

許多新式 Web 應用程式都是以用戶端單頁應用程式的形式建立。 這些應用程式使用 JavaScript 或架構,例如 Angular、Vue 和 React。 這些應用程式會在網頁瀏覽器中執行。

單一頁面應用程式與傳統伺服器端 Web 應用程式不同之處在於驗證特性。 使用 Microsoft 身分識別平台,單頁應用程式即可登入使用者,並取得權杖來存取後端服務或 Web API。 Microsoft 身分識別平台為 JavaScript 應用程式提供兩種授與類型:

MSAL.js (2.x) MSAL.js (1.x)
A single-page application auth A single-page application implicit

登入使用者的 Web 應用程式

A web app that signs in a user

若要協助保護登入使用者的 Web 應用程式:

  • 如果您在 .NET 中開發,則可以使用 ASP.NET 或 ASP.NET Core 搭配 ASP.NET Open ID Connect 中介軟體。 保護資源牽涉到驗證安全性權杖,這是由適用於 .NET 的 IdentityModel 延伸程式庫 (而非 MSAL 程式庫) 所完成。

  • 如果您以 Node.js 進行開發,您會使用 MSAL Node

如需詳細資訊,請參閱登入使用者的 Web 應用程式

登入使用者並代表使用者呼叫 Web API 的 Web 應用程式

A web app calling web APIs

若要代表使用者從 Web 應用程式呼叫 Web API,請使用授權碼流程,並將取得的權杖儲存在權杖快取中。 如有需要,MSAL 會重新整理權杖,而控制器會以無訊息方式從快取中取得權杖。

如需詳細資訊,請參閱呼叫 Web API 的 Web 應用程式

代表已登入使用者呼叫 Web API 的桌面應用程式

若要讓桌面應用程式呼叫登入使用者的 Web API,請使用 MSAL 的 interactive token-acquisition 方法。 您可以使用這些互動式方法來控制登入 UI 體驗。 MSAL 會在此互動中使用網頁瀏覽器。

A desktop app calling a web API

在加入 Windows 網域或 Azure Active Directory (Azure AD) 的電腦上,Windows 裝載應用程式還有另一種可能性。 這些應用程式可透過使用整合式 Windows 驗證,以無訊息方式取得權杖。

在沒有瀏覽器的裝置上執行的應用程式,仍然可以代表使用者呼叫 API。 若要進行驗證,使用者必須登入具有網頁瀏覽器的其他裝置。 此案例需要您使用裝置程式碼流程

Device code flow

雖然我們不建議您使用該流程,但是在公開用戶端應用程式中可以使用使用者名稱/密碼流程。 在某些案例 (例如 DevOps) 中,仍然需要此流程。

使用使用者名稱/密碼流程會限制您的應用程式。 比方說,應用程式無法登入需要使用多重要素驗證或 Azure AD 中條件式存取工具的使用者。 您的應用程式也不會受益於單一登入。 以使用者名稱/密碼流程進行驗證違反了新式驗證的原則,而僅針對舊版原因而提供。

在傳統型應用程式中,如果您希望權杖快取是持續性的,則可以自訂權杖快取序列化。 藉由執行 雙重權杖快取序列化,您可以使用與舊版相容和正向相容的權杖快取。 這些權杖支援先前的驗證程式庫產生。 特定程式庫包括適用於 .NET 的 Azure AD 驗證程式庫 (ADAL.NET) 第 3 版和第 4 版。

如需詳細資訊,請參閱呼叫 Web API 的傳統型應用程式

代表互動式使用者呼叫 Web API 的行動應用程式

類似於傳統型應用程式,行動應用程式會呼叫 MSAL 類別的互動式權杖取得方法,以取得用於呼叫 Web API 的權杖。

A mobile app calling a web API

MSAL iOS 和 MSAL Android 預設會使用系統網頁瀏覽器。 不過,您也可以指示其使用內嵌的 Web 檢視。 有一些相依於行動平台的特例:通用 Windows 平台 (UWP)、iOS 或 Android。

某些案例 (像是涉及與裝置識別碼或裝置註冊相關之條件式存取的案例) 會要求您在裝置上安裝訊息代理程式。 訊息代理程式的範例包括 Android 上的 Microsoft 公司入口網站以及 Android 與 iOS 上的 Microsoft Authenticator。 此外,MSAL 現在可以與訊息代理程式互動。 如需關於訊息代理程式的詳細資訊,請參閱在 Android 和 iOS 上利用訊息代理程式

如需詳細資訊,請參閱呼叫 Web API 的行動裝置應用程式

注意

在 Xamarin 上使用 MSAL.iOS、MSAL.Android 或 MSAL.NET 的行動應用程式,可以套用應用程式保護原則。 比方說,這些原則可能讓使用者無法複製受保護的文字。 此行動應用程式是由 Intune 所管理,並由 intune 辨識為受控應用程式。 如需詳細資訊,請參閱 Microsoft Intune App SDK 概觀

Intune 應用程式 SDK 獨立於 MSAL 程式庫之外,而且會自行與 AAD 互動。

受保護的 Web API

您可以使用 Microsoft 身分識別平台端點來保護 Web 服務,例如應用程式的 RESTful API。 透過存取權杖呼叫受保護的 Web API。 此權杖可協助保護 API 的資料,並驗證傳入的要求。 Web API 的呼叫者會在 HTTP 要求的授權標頭尾部附加存取權杖。

如果您要保護 ASP.NET 或 ASP.NET Core Web API,請驗證存取權杖。 在此驗證中,您會使用 ASP.NET JWT 中介軟體。 驗證是由適用於 .NET 的 IdentityModel 擴充功能程式庫 (而不是 MSAL.NET) 完成。

如需詳細資訊,請參閱受保護的 Web API

代表使用者呼叫另一個 Web API 的 Web API

若要讓受保護的 Web API 代表使用者呼叫另一個 Web API,您的應用程式需要取得下游 Web API 的權杖。 此類呼叫有時也稱為 Service-to-Service 呼叫。 呼叫其他 Web API 的 Web API 需要提供自訂快取序列化。

A web API calling another web API

如需詳細資訊,請參閱呼叫 Web API 的 Web API

以精靈的名稱呼叫 Web API 的精靈應用程式

應用程式如果具有長時間執行的程序,或其運作方式不需要使用者互動,就也需要一個存取受保護的 Web API 的方法。 此類應用程式可以使用應用程式的身分識別來驗證和取得權杖。 應用程式會使用用戶端秘密或憑證來證明其身分識別。

您可以使用 MSAL 中的用戶端認證取得方法,撰寫此類精靈應用程式,以取得用於呼叫應用程式的權杖。 這些方法需要您在 Azure AD 中新增至應用程式註冊的用戶端密碼。 然後應用程式會與所呼叫的精靈共用此秘密。 此類密碼的範例包括應用程式密碼、憑證判斷提示或用戶端判斷提示。

A daemon app called by other apps and APIs

如需詳細資訊,請參閱呼叫 Web API 的精靈應用程式

情節與支援的驗證流程

您可以使用驗證流程來實作要求權杖的應用程式案例。 應用程式案例與驗證流程之間不會有一對一的對應。

涉及取得權杖的案例也會對應至 OAuth 2.0 驗證流程。 如需詳細資訊,請參閱 Microsoft 身分識別平台上的 OAuth 2.0 和 OpenID Connect 通訊協定

案例 詳細案例逐步解說 OAuth 2.0 流程和授與 適用對象
Single-Page App with Auth code 單一頁面應用程式 授權碼搭配 PKCE 公司或學校帳戶、個人帳戶和 Azure Active Directory B2C (Azure AD B2C)
Single-Page App with Implicit 單一頁面應用程式 隱含 公司或學校帳戶、個人帳戶和 Azure Active Directory B2C (Azure AD B2C)
Web app that signs in users 登入使用者的 Web 應用程式 授權碼 公司或學校帳戶、個人帳戶和 Azure AD B2C
Web app that calls web APIs 呼叫 Web API 的 Web 應用程式 授權碼 公司或學校帳戶、個人帳戶和 Azure AD B2C
Desktop app that calls web APIs 呼叫 Web API 的傳統型應用程式 互動式 (使用授權碼搭配 PKCE) 公司或學校帳戶、個人帳戶和 Azure AD B2C
整合式 Windows 驗證 工作或學校帳戶
資源擁有者密碼 公司或學校帳戶及 Azure AD B2C
Browserless application 裝置代碼 公司或學校帳戶、個人帳戶 (但非 Azure AD B2C)
Mobile app that calls web APIs 呼叫 Web API 的行動應用程式 互動式 (使用授權碼搭配 PKCE) 公司或學校帳戶、個人帳戶和 Azure AD B2C
資源擁有者密碼 公司或學校帳戶及 Azure AD B2C
Daemon app that calls web APIs 呼叫 Web API 的精靈應用程式 用戶端認證 僅限應用程式的權限 (不含使用者且只能在 Azure AD 組織中使用)
Web API that calls web APIs 呼叫 Web API 的 Web API 代理者 公司或學校帳戶與個人帳戶

情節與支援的平台與語言

Microsoft 驗證程式庫支援多個平台:

  • .NET Core
  • .NET Framework
  • Java
  • JavaScript
  • macOS
  • 原生 Android
  • 原生 iOS
  • Node.js
  • Python
  • Windows 10/UWP
  • Xamarin.iOS
  • Xamarin.Android

您也可以使用各種語言來建置應用程式。

在下表的 Windows 欄中,每次提及 .NET Core 時,也可能是 .NET Framework。 省略後者可避免表格雜亂。

案例 Windows Linux Mac iOS Android
單一頁面應用程式
Single-Page App Auth
MSAL.js
MSAL.js
MSAL.js
MSAL.js
MSAL.js
MSAL.js
MSAL.js MSAL.js MSAL.js
MSAL.js
單一頁面應用程式
Single-Page App Implicit
MSAL.js
MSAL.js
MSAL.js
MSAL.js
MSAL.js
MSAL.js
MSAL.js MSAL.js MSAL.js
MSAL.js
登入使用者的 Web 應用程式
Web app that signs-in users
ASP.NET Core
ASP.NET Core MSAL Node
MSAL Node
ASP.NET Core
ASP.NET Core MSAL Node
MSAL Node
ASP.NET Core
ASP.NET Core MSAL Node
MSAL Node
呼叫 Web API 的 Web 應用程式

Web app that calls web APIs
ASP.NET Core
ASP.NET Core + MSAL.NET MSAL Java
MSAL Java
MSAL Python
Flask + MSAL Python MSAL Node
MSAL Node
ASP.NET Core
ASP.NET Core + MSAL.NET MSAL Java
MSAL Java
MSAL Python
Flask + MSAL Python MSAL Node
MSAL Node
ASP.NET Core
ASP.NET Core + MSAL.NET MSAL Java
MSAL Java
MSAL Python
Flask + MSAL Python MSAL Node
MSAL Node
呼叫 Web API 的傳統型應用程式

Desktop app that calls web APIsDevice code flow
.NET CoreMSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL Node
.NET CoreMSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL Node
.NET CoreMSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python
MSAL Node
MSAL Node
iOS / Objective C or swift MSAL.objc
呼叫 Web API 的行動應用程式
Mobile app that calls web APIs
UWP MSAL.NET Xamarin MSAL.NET iOS / Objective C or swift MSAL.objc Android MSAL.Android
精靈應用程式
Daemon app
.NET CoreMSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL Node
.NET Core MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL Node
.NET CoreMSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL Node
呼叫 Web API 的 Web API

Web API that calls web APIs
ASP.NET Core
ASP.NET Core + MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL Node
.NET Core
ASP.NET Core + MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL Node
.NET Core
ASP.NET Core + MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL Node

如需詳細資訊,請參閱 Microsoft 身分識別平台驗證程式庫

後續步驟

如需關於驗證的詳細資訊,請參閱: