对零信任的用户进行身份验证

本文有助于开发人员了解在零信任应用程序开发中,对应用程序用户进行身份验证的最佳做法。 始终使用“最低特权”零信任原则增强应用程序安全性并进行显式验证。

用户身份验证中的 ID 令牌

当需要用户向应用进行身份验证,而不是收集用户名和密码时,应用程序可以请求标识 (ID) 令牌。 通过 Microsoft 标识平台对用户进行身份验证,可避免应用程序保留用户凭据时出现的安全风险。 在请求 ID 令牌时,如果恶意参与者破坏或泄露应用程序,则应用中没有用户名和相应的密码。

Microsoft 标识平台 ID 令牌是 OpenID Connect (OIDC) 标准的一部分,该标准将 ID 令牌指定为“JSON Web 令牌”(JWT)。 JWT 长字符串包含三个组件:

  1. 标头声明。 ID 令牌中存在的标头声明包括 typ(类型声明)、alg(用于给令牌签名的算法)和 kid(用于验证令牌签名的公钥指纹)。
  2. 有效负载声明。 有效负载或正文(JSON Web 令牌的中间部分)包含一系列名称属性对。 标准要求有一个带有 iss(颁发者名称)的声明,该声明指向被颁发令牌的应用程序(aud 或受众声明)。
  3. Signature. Microsoft Entra ID 生成令牌签名,应用可使用该签名来验证令牌是否未经修改,是否值得信任。

以下 ID 令牌示例显示有关用户的信息,并确认使用该应用程序的身份验证。

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "1LTMzakihiRla_8z2BEJVXeWMqo"
}.
{
  "ver": "2.0",
  "iss": "https://login.microsoftonline.com/3338040d-6c67-4c5b-b112-36a304b66dad/v2.0",
  "aud": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "exp": 1536361411,
  "iat": 1536274711,
  "nbf": 1536274711,
  "sub": "AAAAAAAAAAAAAAAAAAAAAIkzqFVrSaSaFHy782bbtaQ",
  "name": "Abe Lincoln",
  "preferred_username": "AbeLi@microsoft.com",
  "oid": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
  "tid": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
}.
.[Signature]

访问管理中的 ID 令牌

若要接收应用程序(客户端)ID,请将在 Microsoft 标识平台注册应用。 在收到包含与应用客户端 ID 匹配的受众声明 (aud) 的令牌时,令牌中标识的用户会向应用进行身份验证。 IT 管理员可能允许租户中的所有用户使用你的应用。 他们可能允许用户所属的组使用你的应用。

如果收到受众声明不同于你的应用的客户端 ID 的令牌,请立即拒绝该令牌。 用户不会向应用进行身份验证,因为他们登录到了另一个应用。 始终确保用户拥有权限使用你的应用。

这些声明详细信息在用户身份验证中很重要:

  • JSON Web 令牌在过期之前一直有效。 exp(过期)声明会告诉你令牌的过期时间。 如果当前时间在 exp 声明中的时间之前,则令牌有效。
  • nbf 声明中指定的时间(非之前的时间)之前,不要认为用户已通过身份验证。 令牌的 nbfexp 时间定义令牌的有效生存期。 当到期时间即将到来,请确保获得新的 ID 令牌。
  • sub(使用者声明)是应用程序用户的唯一标识符。 同一用户对其他应用拥有不同的 sub 声明。 如果要存储数据以关联回用户,并阻止攻击者进行该关联,请使用使用者声明。 由于不公开用户的 Microsoft Entra 标识,因此它是将数据关联到用户的最私密方式。 sub 声明是不可变的。
  • 如果要跨多个应用程序共享信息,请使用租户 ID (tid) 和对象 ID (oid) 声明的组合,这些声明对用户是唯一的。 合并的租户 ID 和对象 ID 是不可变的。
  • 无论个人的标识如何,suboidtid 声明都是不可变的。 有关用户的任何内容都可以更改,并且你仍然可以根据使用者或合并的 tidoid 声明输入你的数据,以标识用户。

使用 OIDC 进行身份验证

为了演示用户身份验证,让我们看看使用 OIDC 来验证用户身份的应用程序。 相同的原则也适用于使用安全断言标记语言 (SAML) 或 WS 联合身份验证的应用。

当应用程序从 Microsoft 标识平台请求 ID 令牌时,应用对用户进行身份验证。 工作负载(没有用户存在,而是作为服务、后台进程、守护程序运行的应用程序)跳过此步骤。

应始终以无提示的方式请求此令牌。 若要在 Microsoft 身份验证库 (MSAL) 中以无提示的方式获取令牌,应用可以从 AcquireTokenSilent 方法开始。 如果你的应用可以在不干扰用户的情况下进行身份验证,将收到请求的 ID 令牌。

如果 Microsoft 标识平台在未与用户交互的情况下无法完成请求,则你的应用需要回退到 MSAL AcquireTokenInteractive 方法。 要以交互方式获取令牌,请通过向 https://login.microsoftonline.com 域下的地址打开 Web 界面来执行请求。

用户可以通过该 Web 界面与 Microsoft 标识平台进行私人对话。 你的应用无法查看对话内容,也无法控制对话。 Microsoft 标识平台可以请求用户 ID 和密码、多重身份验证 (MFA)、无密码身份验证或其他 IT 管理员或用户配置的身份验证交互。

用户执行所需的身份验证步骤后,应用程序将收到 ID 令牌。 当应用收到令牌时,可以放心地让 Microsoft 标识平台对用户进行身份验证。 如果应用未收到 ID 令牌,则 Microsoft 标识平台不会对用户进行身份验证。 不允许未经身份验证的用户继续进入应用的安全区域。

最佳做法是应用程序从 Microsoft Entra ID 收到 ID 令牌后,为用户创建会话。 在应用收到的 ID 令牌中,具有 Unix 时间戳的过期 (exp) 声明。 该时间戳指定了过期时间,在此时间或之后不得接受 JWT 进行处理。 使用此令牌过期时间来推动用户会话的生存期。 exp 声明的关键作用是让经过显式验证的用户在适当的时间内,以适当的特权使用应用程序。

单一登录支持

单一登录 (SSO) 身份验证允许用户使用一组凭证登录到多个独立的软件系统。 借助 SSO,应用程序开发人员让用户无需分别、重复地登录每个应用程序。 SSO 的核心是开发人员确保用户设备上的所有应用程序共享验证用户身份的 Web 界面。 身份验证成功后,Web 界面上的项目(例如会话状态和 Cookie)将驱动 SSO。

如下图所示,共享 Web 界面的最简单用例是在 Web 浏览器中运行的应用(如 Microsoft Edge、Google Chrome、Firefox、Safari)。 浏览器选项卡共享 SSO 状态。

示意图演示了应用在浏览器中运行的共享 Web 图面方案。

除非用户在同一设备上打开了不同的浏览器,否则 Microsoft 标识平台管理任何特定浏览器中的 SSO 状态。 在 Windows 10 及更新版本上,Microsoft 标识平台本身支持浏览器 SSO Microsoft Edge。 当用户登录到 Windows 时,Google Chrome(通过 Windows 10 帐户扩展)和 Mozilla Firefox v91+(通过浏览器设置)中的便利功能允许每个浏览器共享 Windows 本身的 SSO 状态。

如下图所示,本机应用程序用例更加复杂。

示意图演示了不使用 SSO 的嵌入式浏览器的复杂本机应用程序用例。

身份验证代理方法

一种常见模式是,每个本机应用都有其自己的嵌入式 WebView,用来防止其参与 SSO。 为应对此场景,Microsoft Entra ID 对本机应用程序使用“身份验证代理”(auth broker) 方法,如下图所示。

示意图演示了对本机应用程序使用身份验证代理。

借助身份验证代理,应用程序会将身份验证请求发送到代理,而不是直接发送到 Microsoft 标识平台。 这样,代理将成为设备上所有身份验证的共享界面。

除了提供共享界面之外,身份验证代理还提供其他优势。 采用零信任时,企业可能只希望让应用程序从企业托管设备运行。 企业设备管理的示例包括完整的移动设备管理 (MDM),以及用户自带设备参与移动应用管理 (MAM) 的场景。

根据设计,基础操作系统 (OS) 隔离浏览器。 开发人员需要与 OS 建立更紧密的连接才能拥有设备详细信息的完全访问权限。 在 Windows 中,身份验证代理是 Windows Web 帐户管理器 (WAM)。 在其他设备上,身份验证代理是 Microsoft Authenticator 应用(适用于运行 iOS 或 Android 的设备)或 公司门户应用(适用于运行 Android 的设备)。 应用程序通过 MSAL 访问身份验证代理。 在 Windows 中,应用无需 MSAL 即可访问 WAM。 但是,MSAL 是应用访问身份验证代理(尤其是非通用 Windows 平台应用的应用)的最简单方法。

身份验证代理与 Microsoft Entra ID 结合使用,以利用主刷新令牌 (PRT),从而减少用户多次进行身份验证的需求。 PRT 可以确定用户是否位于受管理设备上。 Microsoft Entra ID 需要身份验证代理,因为它引入了所有权证明令牌,这是比当今流行的持有者令牌更安全的选项。

后续步骤