适用于 Active Directory 联合身份验证服务 (AD FS) 2016 及更高版本
新式身份验证参与者
演员 | DESCRIPTION |
---|---|
最终用户 | 需要访问资源的安全主体(用户、应用程序、服务和组)。 |
客户 | 你的 Web 应用程序,由其客户端 ID 标识。 客户端通常是最终用户与之交互的一方,客户端从授权服务器请求令牌。 |
授权服务器/身份提供者(IdP) | 您的 AD FS 服务器。 它负责验证组织目录中存在的安全主体的身份。 成功对这些安全主体进行身份验证后,它会颁发安全令牌(持有者访问令牌、ID 令牌和刷新令牌)。 |
资源服务器/资源提供程序/信赖方 | 资源或数据所在的位置。 它信任授权服务器安全地对客户端进行身份验证和授权,并使用持有者访问令牌来确保可以授予对资源的访问权限。 |
下图提供了执行组件之间的最基本关系:
应用程序类型
应用程序类型 | DESCRIPTION | 角色 |
---|---|---|
本机应用程序 | 有时称为 公共客户端。 它旨在成为在电脑或设备上运行以及用户与之交互的客户端应用。 | 从授权服务器(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 适用
SsoLifetime
和DeviceUsageWindowInDays
。 第一个刷新令牌具有lifetime=DeviceUsageWindowInDays
或SsoLifetime
,具体取决于哪个字段的值较低,但不发布进一步的刷新令牌。 - KMSI 登录、在 AD FS 配置文件中为
EnableKmsi=true
、kmsi=true
作为参数传递:AD FS 应用 和KmsiLifetimeMins
DeviceUsageWindowInDays
。 第一个刷新令牌具有lifetime=DeviceUsageWindowInDays
,每个后续grant_type=refresh_token
请求都会获得新的刷新令牌。 此过程仅适用于本机客户端或机密客户端和设备身份验证。 - 已注册的设备、设备身份验证:AD FS 使用
PersistentSsoLifetimeMins
和DeviceUsageWindowInDays
类似于 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 身份验证流
下图显示了大致流程。
AD FS 从客户端接收身份验证请求。
AD FS 验证身份验证请求中的客户端 ID,并与在 AD FS 中进行的客户端和资源注册期间获取的客户端 ID 进行比较。 如果使用机密客户端,则 AD FS 还会验证身份验证请求中提供的客户端密码。 AD FS 还会验证客户端的重定向 URI。
AD FS 标识客户端希望通过身份验证请求中传递的资源参数访问的资源。 如果使用 MSAL 客户端库,则不会发送资源参数。 而是将资源 URL 作为范围参数的一部分发送: scope = [resource url]/[scope values,例如 openid]。
如果未使用资源或范围参数传递资源,AD FS 将使用默认资源
urn:microsoft:userinfo
,其策略(如 MFA、颁发或授权策略)无法配置。下一个 AD FS 验证客户端是否有权访问资源。 AD FS 还会验证在身份验证请求中传递的范围是否与注册资源时配置的作用域匹配。 如果客户端没有权限,或者未在身份验证请求中发送正确的范围,身份验证流将终止。
权限和范围验证后,AD FS 将使用配置的 身份验证方法对用户进行身份验证。
如果根据资源策略或全局身份验证策略需要 其他身份验证方法 ,AD FS 将触发额外的身份验证。
AD FS 使用 Microsoft Entra 多重身份验证 或 第三方多重身份验证 来执行身份验证。
用户进行身份验证后,AD FS 将应用 声明规则。 声明规则确定作为安全令牌的一部分发送到资源的声明。 AD FS 还应用 访问控制策略 ,确认用户满足访问资源所需的条件。
接下来,AD FS 将生成访问权限并刷新令牌。 AD FS 还会生成 ID 令牌。
AD FS 接收身份验证请求。
如果身份验证请求中包含
scope = allatclaims
,则会自定义 ID 令牌,以根据定义的声明规则将声明包含在访问令牌中。生成和自定义所需的令牌后,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 标识符)与客户端标识符相同
选项 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"
若要更好地了解如何在 AD FS 中配置 Web 应用以获取自定义 ID 令牌,请参阅 AD FS 2016 或更高版本中的自定义 ID 令牌。
单一注销
单一注销将结束使用该会话 ID 的所有客户端会话。 AD FS 2016 及更高版本支持 OpenID Connect/OAuth 的单一注销。 有关详细信息,请参阅 使用 AD FS 进行 OpenID Connect 的单一注销。
AD FS 终结点
AD FS 终结点 | DESCRIPTION |
---|---|
/授权 | AD FS 返回可用于获取访问令牌的授权代码。 |
/token | AD FS 返回可用于访问资源的访问令牌,就像在 Web API 中一样。 |
/userinfo | AD FS 返回使用者声明。 |
/devicecode | AD FS 返回设备代码和用户代码。 |
/logout | AD FS 注销用户。 |
/钥匙 | 用于对响应进行签名的 AD FS 公钥。 |
/.well-known/openid-configuration | AD FS 返回 OAuth/OpenID Connect 元数据。 |