提高你开发的客户端应用程序中身份验证和授权的复原能力

学习在使用 Microsoft 标识平台和 Microsoft Entra ID 将用户登录并代表这些用户执行操作的客户端应用程序中构建复原能力。

使用 Microsoft 身份验证库 (MSAL)

Microsoft 身份验证库 (MSAL) 是 Microsoft 标识平台的一部分。 MSAL 获取、管理、缓存和刷新令牌;它使用复原最佳做法。 MSAL 可帮助开发人员创建安全的解决方案。

了解详细信息:

MSAL 缓存令牌并使用无提示令牌获取模式。 MSAL 在本机提供安全存储的操作系统(如通用 Windows 平台 (UWP)、iOS 和 Android)上序列化令牌缓存。 使用以下项时,请自定义序列化行为:

  • Microsoft.Identity.Web
  • MSAL.NET
  • 适用于 Java 的 MSAL
  • 适用于 Python 的 MSAL

了解详细信息:

在使用 MSAL 时,支持令牌缓存、刷新和无提示获取。 使用简单模式来获取身份验证所需的令牌。 支持多种语言。 在 Microsoft 标识平台代码示例上查找代码示例。

try
{
    result = await app.AcquireTokenSilent(scopes, account).ExecuteAsync();
}
catch(MsalUiRequiredException ex)
{
    result = await app.AcquireToken(scopes).WithClaims(ex.Claims).ExecuteAsync()
}

MSAL 能够刷新令牌。 当 Microsoft 标识平台颁发生存期较长的令牌时,它可以向客户端发送信息来刷新令牌 (refresh_in)。 应用在旧令牌有效时运行,但另一个令牌获取需要更长的时间。

MSAL 版本

我们建议开发人员构建一个使用最新 MSAL 版本的流程,因为身份验证是应用安全的一部分。 将这种做法用于正在开发的库,提高应用复原能力。

查找最新版本和发行说明:

用于令牌处理的复原模式

如果未使用 MSAL,请使用复原模式进行令牌处理。 MSAL 库实施最佳做法。

通常,使用新式身份验证的应用程序会调用一个终结点来检索对用户进行身份验证或授权应用程序调用受保护 API 的令牌。 MSAL 会处理身份验证并实施各种模式来提高复原能力。 如果不使用 MSAL,请通过本部分中的指南了解最佳做法。 否则,MSAL 会自动实施最佳做法。

缓存令牌

确保应用准确地缓存来自 Microsoft 标识平台的令牌。 应用收到令牌后,包含令牌的 HTTP 响应具有一个 expires_in 属性,该属性指示缓存持续时间以及何时重复使用。 确认应用程序不会尝试解码 API 访问令牌。

示意图显示应用通过运行应用程序的设备上的令牌缓存调用 Microsoft 标识平台。

缓存的令牌可防止应用与 Microsoft 标识平台之间发生不必要的流量。 此方案通过减少令牌获取调用,使应用不容易遭受令牌获取失败的影响。 缓存令牌可提高应用程序性能,因为应用不会那么频繁地阻止获取令牌。 用户在令牌的生存期内保持登录到应用程序。

将令牌序列化和持久化

确保应用安全地序列化其令牌缓存,以在应用实例之间保留令牌。 在令牌的生存期内重复使用令牌。 刷新令牌和访问令牌已颁发了很多个小时。 在此期间,用户可能会多次启动应用程序。 当应用启动时,确认它可查找有效的访问令牌或刷新令牌。 这可以提高应用的复原能力和性能。

了解详细信息:

确保永久性令牌存储具有与用户所有者或进程标识相关的访问控制和加密。 各种操作系统都有凭据存储功能。

以无提示方式获取令牌

对用户进行身份验证或检索授权以调用 API 需要在 Microsoft 标识平台中执行多个步骤。 例如,首次登录的用户要输入凭据并执行多重身份验证。 每个步骤都会影响提供服务的资源。 依赖项最少的最佳用户体验是无提示令牌获取。

示意图为帮助完成用户身份验证或授权的 Microsoft 标识平台服务。

无提示令牌获取从应用程序令牌缓存的有效令牌开始。 如果没有有效令牌,则应用会尝试使用可用的刷新令牌和令牌终结点来获取令牌。 如果两个选项都不可用,则应用使用 prompt=none 参数获取令牌。 此操作使用授权终结点,但不会为用户显示 UI。 如果可能,Microsoft 标识平台会在无用户交互的情况下向应用提供令牌。 如果没有方法产生令牌,则用户手动重新进行身份验证。

注意

一般情况下,请确保应用不使用“登录”和“同意”等提示。 这些提示会在需要无交互操作时,强制用户交互。

响应代码处理

通过以下部分了解响应代码。

HTTP 429 响应代码

有些错误响应会影响复原能力。 如果应用程序收到 HTTP 429 响应代码(请求过多),则 Microsoft 标识平台会限制你的请求。 如果应用发出的请求过多,则会受到限制,以阻止应用接收令牌。 在“重试间隔”响应字段时间完成之前,不允许应用尝试获取令牌。 通常,429 响应指示应用程序未正确缓存和重用令牌。 确认令牌在应用程序中是如何缓存并重复使用的。

HTTP 5x 响应代码

如果应用程序收到 HTTP 5x 响应代码,则应用不得进入快速重试循环。 对 429 响应使用相同的处理。 如果没有出现“Retry-After”标头,请在响应后至少 5 秒将指数回退重试用于首次重试。

请求超时时,不建议立即重试。 应实施指数退避重试,第一次重试至少应比该响应晚 5 秒。

许多应用程序和 API 都需要用户信息来授权。 可用的方法各有优缺点。

令牌

标识 (ID) 令牌和访问令牌具有提供信息的标准声明。 如果需要的信息位于令牌中,最有效的方法是令牌声明,因为这会阻止另一个网络调用。 网络调用越少,复原能力越好。

了解详细信息:

注意

某些应用程序调用 UserInfo 终结点来检索关于已进行身份验证的用户的声明。 ID 令牌中的信息是 UserInfo 终结点中的信息超集。 允许应用使用 ID 令牌,而不是调用 UserInfo 终结点。

使用可选声明(如组)来补充标准令牌声明。 “应用程序组”选项包括分配给应用程序的组。 “全部”或“安全组”选项包括同一租户的应用中的组,这些选项可用来向令牌添加组。 评估效果,因为它可以通过引起令牌膨胀并要求使用更多的调用获取组,来否定令牌中请求组的效率。

了解详细信息:

建议使用并添加应用角色,客户使用门户或 API 管理这些角色。 向用户和组分配角色以控制访问权限。 颁发令牌时,分配的角色位于令牌角色声明中。 从令牌派生的信息会阻止更多 API 调用。

请参阅将应用角色添加到应用程序中并在令牌中接收它们

根据租户信息添加声明。 例如,扩展具有特定于企业的用户 ID。

将信息从目录添加到令牌非常高效,并通过减少依赖项来提高复原能力。 由于无法获取令牌,因此无法解决复原问题。 为应用程序的主要方案添加可选声明。 如果该应用需要管理功能方面的信息,则应用程序可以根据需要获取该信息。

Microsoft Graph

Microsoft Graph 具有统一的 API 终结点,用于访问有关生产力模式、标识和安全性的 Microsoft 365 数据。 使用 Microsoft Graph 的应用程序可以使用 Microsoft 365 信息进行授权。

应用访问 Microsoft 365 需要一个令牌,比以前的 Microsoft 365 组件(如 Microsoft Exchange 或 Microsoft SharePoint)的 API 更具有复原能力,后者需要多个令牌。

使用 Microsoft Graph API 时,请使用 Microsoft Graph SDK,以简化构建访问 Microsoft Graph 的可复原应用程序。

请参阅 Microsoft Graph SDK 概述

对于授权,请考虑使用令牌声明而不是某些 Microsoft Graph 调用。 请求令牌中的组、应用角色和可选声明。 Microsoft Graph 进行授权需要更多依赖于 Microsoft 标识平台和 Microsoft Graph 的网络调用。 但是,如果应用程序依赖 Microsoft Graph 作为其数据层,则 Microsoft Graph 进行授权的风险并不大。

在移动设备上使用代理身份验证

在移动设备上,身份验证代理(如 Microsoft Authenticator)可提高复原能力。 身份验证代理使用包含用户和设备相关声明的主刷新令牌 (PRT)。 将 PRT 用于身份验证令牌,从设备访问其他应用程序。 当 PRT 请求应用程序访问权限时,Microsoft Entra ID 信任其设备和 MFA 声明。 这样就会减少对该设备进行身份验证的步骤,从而提升复原能力。 用户不会在同一设备上收到多个 MFA 提示。

请参阅什么是主刷新令牌?

示意图显示应用通过运行应用程序的设备上的令牌缓存、令牌存储和身份验证代理调用 Microsoft 标识平台。

MSAL 支持代理身份验证。 了解详细信息:

后续步骤