Compartir a través de

Microsoft 标识平台应用类型和身份验证流

Microsoft 标识平台支持对不同类型的新式应用程序体系结构进行身份验证。 所有这些体系结构基于行业标准协议 OAuth 2.0 和 OpenID Connect。 通过使用 Microsoft 身份标识平台的身份验证库,应用程序对标识进行身份验证并获取令牌以访问受保护的 API。

本文介绍身份验证流及其应用方案。

应用程序类别

安全令牌可以从几种类型的应用程序中获取,包括:

  • Web 应用
  • 移动应用
  • 桌面应用
  • Web API接口

还可以通过设备上运行的应用获取令牌,这些设备没有浏览器或在物联网 (IoT) 上运行。

以下部分介绍应用程序的类别。

受保护的资源与客户端应用程序

身份验证方案涉及两个活动:

  • 获取受保护 Web API 的安全令牌:我们建议使用由 Microsoft 开发和支持的 Microsoft 身份验证库(MSAL)
  • 保护 Web API 或 Web 应用:保护这些资源的一大难题是验证安全令牌。 在某些平台上,Microsoft提供 middleware 库

有用户或没有用户

大多数身份验证方案代表已登录的用户获取令牌。

涉及用户的场景

但是,也有守护程序应用。 在这些情境中,应用程序自身获取令牌,而不涉及到用户。

涉及守护程序应用的场景

单页、公共客户端和机密客户端应用程序

可通过多种类型的应用程序获取安全令牌。 这些应用程序往往划分为以下三种类别。 每种应用程序配合不同的库和对象使用。

  • 单页应用程序:简称为 SPA。它们是一些 Web 应用,其中的令牌是通过浏览器中运行的 JavaScript 或 TypeScript 应用获取的。 许多新式应用的前端都有一个单页应用程序(主要用 JavaScript 编写)。 该应用程序通常使用 Angular、React 或 Vue 等框架。 MSAL.js 是唯一支持单页应用程序的Microsoft 身份验证库。

  • 公共客户端应用程序:此类别中的应用(例如以下类型)始终以用户身份登录:

    • 以登录的用户身份调用 Web API 的桌面应用
    • 移动应用
    • 在没有浏览器的设备上运行的应用,例如,在 IoT 上运行的应用
  • 机密客户端应用程序:此类别中的应用包括:

    • 调用 Web API 的 Web 应用
    • 调用 Web API 的 Web API
    • 守护程序应用,即使作为控制台服务(如 Linux 守护程序或Windows服务)实现

登录受众

可用的身份验证流因登录受众而异。

有关详细信息,请参阅支持的帐户类型

应用程序类型

Microsoft 标识平台支持对这些应用体系结构进行身份验证:

  • 单页应用
  • Web 应用
  • Web API接口
  • 移动应用
  • 本机应用
  • 守护程序应用
  • 服务器端应用

应用程序使用不同的身份验证流将用户登录和获取令牌,以调用受保护的 API。

单页应用程序

许多新式 Web 应用都是作为客户端单页应用程序构建的。 这些应用程序使用 JavaScript 或框架(例如 Angular、Vue 和 React)。 这些应用程序在 Web 浏览器中运行。

单页应用程序在身份验证特征方面与传统的服务器端 Web 应用不同。 通过使用Microsoft 标识平台,单页应用程序可以登录用户并获取令牌来访问后端服务或 Web API。 Microsoft 标识平台为 JavaScript 应用程序提供两种授予类型:

MSAL.js (2.x) MSAL.js (1.x)
单页应用程序身份验证 隐式单页应用程序

以用户身份登录的 Web 应用

一个用于用户登录的 Web 应用

为了帮助保护以用户身份登录的 Web 应用:

  • 如果在 .NET 中开发,请将 ASP.NET 或 ASP.NET Core与 ASP.NET OpenID Connect 中间件配合使用。 保护资源涉及验证安全令牌,该令牌的验证是由针对 .NET 的 IdentityModel 扩展 完成的,而不是由 MSAL 库完成。

  • 如果在 Node.js 中进行开发,将使用 MSAL Node

有关详细信息,请参阅 在示例 Web 应用中登录用户

以用户身份登录并以用户身份调用 Web API 的 Web 应用

调用 Web API 的 Web 应用

若要以用户身份通过 Web 应用调用 Web API,请使用授权代码流,并在令牌缓存中存储获取的令牌。 必要时,MSAL 可刷新令牌,而控制器可从缓存中以无提示方式获取令牌。

有关详细信息,请参阅调用 Web API 的 Web 应用

以登录用户身份调用 Web API 的桌面应用

要使桌面应用能够以登录用户身份调用 Web API,请使用 MSAL 的交互式令牌获取方法。 使用这些交互方法可以控制登录 UI 体验。 MSAL 使用 Web 浏览器进行这种交互。

调用 Web API 的桌面应用

在加入Windows域或Microsoft Entra ID的计算机上,Windows托管的应用程序还有另一种可能性。 这些应用程序可以使用 Windows 集成身份验证以无提示方式获取令牌。

在无浏览器的设备上运行的应用程序仍可代表用户调用 API。 若要进行身份验证,用户必须登录到有 Web 浏览器的另一台设备。 此方案要求使用设备代码流

设备代码流

可以在公共客户端应用程序中使用用户名/密码流,不过我们并不建议使用。 在某些方案(例如 DevOps)中仍需要此流。

使用用户名/密码流会限制应用程序,不再被视为安全。 例如,应用程序无法为需要在Microsoft Entra ID中使用多重身份验证或条件访问工具的用户登录。 应用程序也无法受益于单一登录。 使用用户名/密码流进行身份验证的方式违反新式身份验证的原则,仅仅是出于遗留原因而提供的。

在桌面应用中,如果希望令牌缓存持久,请自定义令牌缓存序列化。 通过实施双重令牌缓存序列化,可以使用后向兼容和前向兼容的令牌缓存。

有关详细信息,请参阅调用 Web API 的桌面应用

以交互式用户身份调用 Web API 的移动应用

类似于桌面应用,移动应用调用 MSAL 的交互式令牌获取方法来获取用于调用 Web API 的令牌。

调用 Web API 的移动应用

MSAL iOS 和 MSAL Android 默认使用系统 Web 浏览器。 但是,你可以指示它们改用嵌入式 Web 视图。 有一些具体之处取决于移动平台:iOS 或 Android。

某些方案(例如,涉及到与设备 ID 或设备注册相关的条件访问的方案)要求在设备上安装一个中介。 在 Android 上的 Microsoft 公司门户 和在 Android 及 iOS 上的 Microsoft Authenticator 是身份验证代理的示例。

有关详细信息,请参阅调用 Web API 的移动应用

注意

使用 MSAL iOS 或 MSAL Android 的移动应用可以套用应用保护策略。 例如,策略可以阻止用户复制受保护的文本。 移动应用由 Intune 托管,由 Intune 识别为托管应用。 有关详细信息,请参阅 Microsoft Intune App SDK 概述

Intune App SDK独立于 MSAL 库,并单独与Microsoft Entra ID进行交互。

受保护的 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 的令牌。 此类调用有时称为服务到服务调用。 调用其他 Web API 的 Web API 需要提供自定义缓存序列化。

调用另一个 Web API 的 Web API

有关详细信息,请参阅调用 Web API 的 Web API

以守护程序的名义调用 Web API 的守护程序应用

包含长时运行进程或无需用户交互即可运行的应用还需要通过某种方式访问安全的 Web API。 此类应用可以使用应用的标识进行身份验证和获取令牌。 应用将使用客户端机密或证书来证明其身份。

可以编写此类使用 MSAL 中的客户端凭据获取方法获取调用应用令牌的守护程序应用。 这些方法需要在 Microsoft Entra ID 的应用注册中添加客户端机密。 然后,该应用将与被调用守护程序共享机密。 此类机密的示例包括应用程序密码、证书断言和客户端断言。

由其他应用和 API 调用的守护程序应用

有关详细信息,请参阅调用 Web API 的守护程序应用程序

场景及受支持的身份验证流程

您可以使用身份验证流来实现请求令牌的应用场景。 应用程序方案和身份验证流之间不存在一对一的映射。

涉及到获取令牌的方案还会映射到 OAuth 2.0 身份验证流。 有关详细信息,请参阅 Microsoft 身份平台上的 OAuth 2.0 和 OpenID Connect 协议

场景 详细情景演示 OAuth 2.0 流和授权 目标受众
带有授权代码的单页应用 单页应用 采用 PKCE 的授权代码 工作或学校帐户和Azure Active Directory B2C (Azure AD B2C)
采用隐式的单页应用 单页应用 隐式 工作或学校帐户和Azure Active Directory B2C (Azure AD B2C)
用于登录用户的 Web 应用 用于登录用户的 Web 应用 授权代码 工作或学校帐户和Azure AD B2C
用于调用 Web API 的 Web 应用 用于调用 Web API 的 Web 应用 授权代码 工作或学校帐户和Azure AD B2C
用于调用 Web API 的 桌面应用 用于调用 Web API 的 桌面应用 使用授权代码和 PKCE 的交互方式 工作或学校帐户和Azure AD B2C
集成Windows身份验证 工作或学校账户
资源所有者密码 工作或学校帐户和Azure AD B2C
无浏览器应用程序 无浏览器应用程序 设备代码 工作或学校账户,但不适用于 Azure AD B2C
用于调用 Web API 的移动应用 用于调用 Web API 的移动应用 使用授权代码和 PKCE 的交互式方法 工作或学校帐户和Azure AD B2C
资源所有者密码 工作或学校帐户和Azure AD B2C
调用 Web API 的守护程序应用 调用 Web API 的守护程序应用 客户端凭据 仅用于 Microsoft Entra 组织、没有用户的应用专用权限
用于调用 Web API 的 Web API 用于调用 Web API 的 Web API 代理 工作或学校账户

方案和受支持的平台和语言

Microsoft身份验证库支持多个平台:

  • .NET
  • .NET Framework
  • Java
  • JavaScript
  • macOS
  • 原生 Android
  • 本机 iOS
  • Node.js
  • Python

你还可以使用多种语言来构建你的应用程序。

在下表的Windows列中,每次提及.NET时,也可能涉及.NET Framework。 为了避免表格混乱,后者被省略。

场景 Windows Linux Mac iOS Android
单页应用
单页应用身份验证
MSAL.js
MSAL.js
MSAL.js
MSAL.js
MSAL.js
MSAL.js
MSAL.js MSAL.js MSAL.js
MSAL.js
单页应用
隐式单页应用
MSAL.js
MSAL.js
MSAL.js
MSAL.js
MSAL.js
MSAL.js
MSAL.js MSAL.js MSAL.js
MSAL.js
用于登录用户的 Web 应用
可将用户登录的 Web 应用
ASP.NET Core
ASP.NET Core MSAL Node
MSAL 节点
ASP.NET Core
ASP.NET Core MSAL Node
MSAL 节点
ASP.NET Core
ASP.NET Core MSAL Node
MSAL 节点
用于调用 Web API 的 Web 应用

用于调用 Web API 的 Web 应用
ASP.NET Core
ASP.NET Core + MSAL.NET MSAL Java
MSAL Java
MSAL Python
Flask + MSAL Python MSAL Node
MSAL 节点
ASP.NET Core
ASP.NET Core + MSAL.NET MSAL Java
MSAL Java
MSAL Python
Flask + MSAL Python MSAL Node
MSAL 节点
ASP.NET Core
ASP.NET Core + MSAL.NET MSAL Java
MSAL Java
MSAL Python
Flask + MSAL Python MSAL Node
MSAL 节点
用于调用 Web API 的 桌面应用

用于调用 Web API 的桌面应用 设备代码流
.NET MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL 节点
.NET MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL 节点
.NET MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python
MSAL 节点
MSAL 节点
iOS / Objective C 或 swift MSAL.objc
用于调用 Web API 的移动应用
用于调用 Web API 的移动应用
UWP MSAL.NET iOS / Objective C 或 swift MSAL.objc 安卓 MSAL.安卓
守护程序应用
守护程序应用
.NET MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL 节点
.NET MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL 节点
.NET MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL 节点
用于调用 Web API 的 Web API

用于调用 Web API 的 Web API
ASP.NET Core
ASP.NET Core + MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL 节点
.NET
ASP.NET Core + MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL 节点
.NET
ASP.NET Core + MSAL.NET MSAL Java
MSAL Java
MSAL Python
MSAL Python MSAL Node
MSAL 节点

有关详细信息,请参阅 Microsoft 标识平台 身份验证库

后续步骤

有关身份验证的详细信息,请参阅: