令牌和声明概述

对于用户遍布全球且用户不一定从企业网络登录的应用而言,集中式标识提供者尤其有用。 Microsoft 标识平台会对用户进行身份验证,并提供安全令牌,如访问令牌、刷新令牌和 ID 令牌。 使用安全令牌,客户端应用程序可以访问资源服务器上受保护的资源。

  • 访问令牌 - 访问令牌是由授权服务器作为 OAuth 2.0 流的一部分颁发的安全令牌。 它包含有关令牌所针对的用户和资源的信息。 这些信息可用于访问 Web API 和其他受保护的资源。 资源会验证访问令牌,以授予对客户端应用程序的访问权限。 有关详细信息,请参阅 Microsoft 标识平台中的访问令牌
  • 刷新令牌 - 由于访问令牌只在短时间内有效,因此授权服务器有时会在颁发访问令牌的同时颁发“刷新令牌”。 然后,客户端应用程序可以在需要时使用此刷新令牌交换新的访问令牌。 有关详细信息,请参阅 Microsoft 标识平台中的刷新令牌
  • ID 令牌:ID 令牌作为 OpenID Connect 流的一部分发送到客户端应用程序。 它们可以与访问令牌一起发送,也可以代替访问令牌发送。 客户端使用 ID 令牌对用户进行身份验证。 若要详细了解 Microsoft 标识平台如何颁发 ID 令牌,请参阅 Microsoft 标识平台中的 ID 令牌

许多企业应用程序使用 SAML 对用户进行身份验证。

验证令牌

由为其生成了令牌的应用程序、已让用户登录的 Web 应用或所调用的 Web API 负责验证令牌。 授权服务器使用私钥对令牌进行签名。 授权服务器发布相应的公钥。 若要验证令牌,应用需使用授权服务器公钥验证签名,以验证签名是使用私钥创建的。 有关更多信息,请参阅通过验证声明保护应用程序和 API 一文。

我们建议尽可能使用受支持的 Microsoft 身份验证库 (MSAL)。 这会实现对令牌的获取、刷新和验证。 其还使用租户的 OpenID 已知发现文档来实现符合标准的租户设置和密钥发现。 MSAL 支持许多不同的应用程序体系结构和平台,包括 .NET、JavaScript、Java、Python、Android 和 iOS。

令牌只在有限的时间内有效,因此授权服务器经常提供一对令牌。 其中一个是访问令牌,用于访问应用程序或受保护资源。 另外一个是刷新令牌,用于在访问令牌即将过期时刷新访问令牌。

访问令牌作为 Authorization 标头中的持有者令牌传递给 Web API。 应用可以向授权服务器提供刷新令牌。 如果未撤消用户对应用的访问权限,它将收到一个新的访问令牌和一个新的刷新令牌。 当授权服务器收到刷新令牌时,仅在用户仍获得授权的情况下,授权服务器才会颁发另一个访问令牌。

JSON Web 令牌和声明

Microsoft 标识平台将安全令牌实现为包含声明的 JSON Web 令牌 (JWT)。 由于 JWT 用作安全令牌,这种形式的身份验证有时称为“JWT 身份验证”。

声明将有关某个实体(例如客户端应用程序或资源所有者)的断言提供给另一个实体(例如资源服务器)。 声明也可以称为 JWT 声明或 JSON Web 令牌声明。

声明是对令牌主体相关事实进行中继的名称或值对。 例如,声明可能包含由授权服务器进行身份验证的安全主体的相关事实。 特定令牌中提供的声明取决于许多事项,例如令牌类型、用于对使用者进行身份验证的凭据类型,以及应用程序配置。

应用程序可以使用声明来完成以下各种任务:

  • 验证令牌
  • 标识令牌使用者的租户
  • 显示用户信息
  • 确定使用者的授权

声明由提供以下类型信息的键值对组成:

  • 生成令牌的安全令牌服务器
  • 令牌生成日期
  • 使用者(类似于用户,但不是守护程序)
  • 受众,即,为其生成了令牌的应用
  • 请求了令牌的应用(客户端)

授权流和验证码

根据客户端的构建方式,它可以使用一个或多个 Microsoft 标识平台支持的身份验证流。 这些支持的流可以生成各种令牌以及授权代码,并需要不同的令牌使其正常工作。 下表提供了概述。

流向 需要 ID 令牌 访问令牌 刷新令牌 授权代码
授权代码流 x x x x
隐式流 x x
混合 OIDC 流 x x
刷新令牌兑换 刷新令牌 x x x
代理流 访问令牌 x x x
客户端凭据 x(仅限应用)

另请参阅

后续步骤