AD FS OpenID Connect/OAuth 概念

适用于 Active Directory 联合身份验证服务 (AD FS) 2016 及更高版本

新式身份验证参与者

Actor 说明
最终用户 需要访问资源的安全主体(用户、应用程序、服务和组)。
客户端 Web 应用程序,由其客户端 ID 标识。 客户端通常是与最终用户交互的对象,并向授权服务器请求令牌。
授权服务器/标识提供者 (IdP) AD FS 服务器。 它负责验证组织目录中存在的安全主体的标识。 在成功对这些安全主体进行身份验证后,它会发出安全令牌(持有者访问令牌、ID 令牌、刷新令牌)。
资源服务器/资源提供程序/信赖方 资源或数据所在的位置。 它信任授权服务器来安全验证和授权客户端,并使用持有者访问令牌来确保可以授予对资源的访问权限。

下图提供了参与者之间最基本的关系:

Diagram of the modern authentication actors.

应用程序类型

应用程序类型 说明 角色
本机应用程序 有时称为“公共客户端”。 它将成为在电脑或设备上运行并与用户交互的客户端应用。 从授权服务器 (AD FS) 请求令牌,使用户能够访问资源。 使用令牌作为 HTTP 标头,将 HTTP 请求发送到受保护的资源。
服务器应用程序(Web 应用) 在服务器上运行的 Web 应用程序,用户可以通过浏览器访问它。 由于它能够维护自身的客户端机密或凭据,因此有时也被称为“机密客户端”。 从授权服务器 (AD FS) 请求令牌,使用户能够访问资源。 在请求令牌之前,客户端(Web 应用)需要使用其机密进行身份验证。
Web API 用户访问的最终资源。 将其视为信赖方的新表示形式。 使用客户端获取的持有者访问令牌。

应用程序组

必须将应用程序组与配置了 AD FS 的每个原生或 Web 应用 OAuth 客户端或 Web API 资源相关联。 可将应用程序组中的客户端配置为访问同一个组中的资源。 一个应用程序组可以包含多个客户端和资源。

安全令牌

新式身份验证使用以下令牌类型:

  • id_token:由授权服务器 (AD FS) 颁发并由客户端使用的 JWT 令牌。 ID 令牌中的声明包含有关用户的信息,以便客户端可以使用它。
  • access_token:由授权服务器 (AD FS) 颁发并旨在由资源使用的 JWT 令牌。 此令牌的“aud”或受众声明必须与资源或 Web API 的标识符相匹配。
  • refresh_token:由 AD FS 颁发,供客户端在需要刷新 id_token 和 access_token 时使用。 该令牌对客户端是不透明的,只能由 AD FS 使用。

刷新令牌生存期

  • 简单登录、无 KMSI、设备未注册:AD FS 应用 SsoLifetimeDeviceUsageWindowInDays。 第一个刷新令牌具有 lifetime=DeviceUsageWindowInDaysSsoLifetime,具体取决于哪个字段的值较低,但不发布进一步的刷新令牌。
  • KMSI 登录、在 AD FS 配置文件中为 EnableKmsi=truekmsi=true 作为参数传递:AD FS 应用 KmsiLifetimeMinsDeviceUsageWindowInDays。 第一个刷新令牌具有 lifetime=DeviceUsageWindowInDays,每个后续 grant_type=refresh_token 请求都会获得一个新的刷新令牌。 此过程仅在进行原生客户端或机密客户端加设备身份验证时发生。
  • 已注册设备、设备身份验证:AD FS 使用 PersistentSsoLifetimeMinsDeviceUsageWindowInDays,与 KMSI 类似。 原生客户端和机密客户端都应获取新的刷新令牌(基于设备身份验证)。

若要了解详细信息,请参阅 AD FS 单一登录文档

作用域

在 AD FS 中注册资源时,可以配置范围以允许 AD FS 执行特定操作。 除了配置范围外,还必须在请求中发送范围值,以便 AD FS 执行操作。 例如,管理员在资源注册期间将范围配置为 openid,应用程序(客户端)必须在身份验证请求中发送 scope = openid,以便 AD FS 发出 ID 令牌。 以下是有关 AD FS 中可用范围的详细信息:

  • aza - 如果对代理客户端使用 OAuth 2.0 协议扩展,并且范围参数包含范围 aza,那么服务器将发出新的主刷新令牌。 它在响应的 refresh_token 字段中设置令牌,并将 refresh_token_expires_in field 设置为新主刷新令牌的生存期(如果强制执行)。
  • openid - 允许应用程序请求使用 openid 连接身份验证协议。
  • logon_cert - 允许应用程序请求登录证书,以便用于以交互方式登录经过身份验证的用户。 AD FS 服务器忽略响应中的 access_token 参数,改为提供 base64 编码的 CMS 证书链或 CMC 完整 PKI 响应。 有关详细信息,请参阅 MS-OAPX:OAuth 2.0 协议扩展
  • user_impersonation - 从 AD FS 请求代表访问令牌。 有关如何使用此范围的详细信息,请参阅结合使用 OAuth 与 AD FS 2016 通过 On-Behalf-Of (OBO) 构建多层应用程序
  • allatclaims - 允许应用程序请求将访问令牌中的声明也添加到 ID 令牌中。
  • vpn_cert - 允许应用程序请求 VPN 证书,用于使用 EAP-TLS 身份验证建立 VPN 连接。 此功能不再受支持。
  • email - 允许应用程序请求登录用户的电子邮件声明。
  • profile - 允许应用程序请求登录用户的个人资料相关声明。

声明

AD FS 颁发的安全令牌(访问令牌和 ID 令牌)包含与经过身份验证的使用者有关的信息的声明或断言。 应用程序可以使用各种任务的声明,包括:

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

任何给定安全令牌中存在的声明都依赖于令牌的类型、用于验证用户身份的凭据的类型和应用程序配置。

大致的 AD FS 身份验证流

下图显示了大致流程。

Diagram of the AD FS authentication flow.

  1. AD FS 从客户端接收身份验证请求。

  2. AD FS 使用在 AD FS 中注册客户端和资源期间获取的客户端 ID 验证身份验证请求中的客户端 ID。 如果使用的是机密客户端,则 AD FS 还会验证身份验证请求中提供的客户端机密。 AD FS 还会验证客户端的重定向 URI。

  3. AD FS 通过身份验证请求中传递的资源参数来识别客户端要访问的资源。 如果使用的是 MSAL 客户端库,则不会发送资源参数。 取而代之的是,资源 URL 将作为范围参数的一部分发送:scope = [资源 URL]/[范围值,例如 openid]。

    如果未使用资源或范围参数传递资源,AD FS 将使用默认资源 urn:microsoft:userinfo,其策略(例如 MFA、发出或授权策略)不可配置。

  4. 接下来,AD FS 将验证客户端是否有权访问资源。 AD FS 还会验证身份验证请求中传递的范围是否与注册资源时配置的范围匹配。 如果客户端没有权限,或者未在身份验证请求中发送正确的范围,则身份验证流程会终止。

  5. 验证权限和范围后,AD FS 将使用配置的身份验证方法对用户进行身份验证。

  6. 如果根据资源策略或全局身份验证策略需要额外的身份验证方法,AD FS 会触发额外的身份验证。

  7. AD FS 使用 Microsoft Entra 多重身份验证第三方多重身份验证来执行身份验证。

  8. 对用户进行身份验证后,AD FS 将应用声明规则。 声明规则确定作为安全令牌的一部分发送到资源的声明。 AD FS 还应用访问控制策略,用于确认用户满足访问资源所需的条件。

  9. 接下来,AD FS 生成访问令牌和刷新令牌。 AD FS 还会生成 ID 令牌。

  10. AD FS 接收身份验证请求。

  11. 如果身份验证请求中包含 scope = allatclaims,则会自定义 ID 令牌,以根据定义的声明规则将声明包含在访问令牌中。

  12. 生成并自定义所需的令牌后,AD FS 将响应客户端并在响应中包含令牌。 仅当身份验证请求包含 scope = openid 时,ID 令牌响应才会包含在响应中。 客户端始终可以使用令牌终结点在身份验证后获取 ID 令牌。

库的类型

将两种类型的库与 AD FS 配合使用:

  • 客户端库:原生客户端和服务器应用使用客户端库来获取用于调用资源(如 Web API)的访问令牌。 使用 AD FS 2019 时,Microsoft 身份验证库 (MSAL) 是最新且推荐的客户端库。

  • 服务器中间件库:Web 应用使用服务器中间件库进行用户登录。 Web API 使用服务器中间件库验证原生客户端或其他服务器发送的令牌。 适用于 .NET 的开放式 Web 接口 OWIN (OWIN) 是推荐的中间件库。

自定义 ID 令牌(ID 令牌中的额外声明)

在某些情况下,Web 应用客户端可能需要 ID 令牌中的额外声明来帮助实现功能。 可使用以下任一选项在 ID 令牌中设置额外的声明:

选项 1:当有公共客户端并且 Web 应用没有它尝试访问的资源时,可使用此选项。 此选项需要:

  • response_mode 设置为 form_post
  • 信赖方标识符(Web API 标识符)应与客户端标识符相同

Diagram of AD FS customize token option one.

选项 2:当 Web 应用具有它尝试访问的资源并且需要通过 ID 令牌传递额外声明时,可使用此选项。 可以使用公共客户端和机密客户端。 此选项需要:

  • response_mode 设置为 form_post

  • KB4019472 已安装在 AD FS 服务器上

  • 已将范围 allatclaims 分配到客户端 - RP 对。 可以使用 Grant-ADFSApplicationPermission 分配范围。 如果已授予一次,请使用 Set-AdfsApplicationPermission。 PowerShell cmdlet 在以下示例中指示:

    Grant-AdfsApplicationPermission -ClientRoleIdentifier "https://my/privateclient" -ServerRoleIdentifier "https://rp/fedpassive" -ScopeNames "allatclaims","openid"
    

Diagram of AD FS customize token option two.

若要更好地了解如何在 AD FS 中配置 Web 应用以获取自定义 ID 令牌,请参阅 AD FS 2016 或更高版本中的自定义 ID 令牌

单一注销

单一注销将结束使用该会话 ID 的所有客户端会话。 AD FS 2016 及更高版本支持 OpenID Connect/OAuth 的单一注销。 有关详细信息,请参阅使用 AD FS 的 OpenID Connect 单一注销

AD FS 终结点

AD FS 终结点 说明
/authorize AD FS 返回可用于获取访问令牌的授权代码。
/token AD FS 返回可用于访问资源(如 Web API)的访问令牌。
/userinfo AD FS 返回使用者声明。
/devicecode AD FS 返回设备代码和用户代码。
/logout AD FS 注销用户。
/keys 用于对响应进行签名的 AD FS 公钥。
/.well-known/openid-configuration AD FS 返回 OAuth/OpenID Connect 元数据。