API 授权类型的访问策略
访问策略可以应用于 OpenID Connect 和 OAuth 2.0 的 API 驱动使用。 此 API 使用通常称为资源所有者密码凭证授权类型 (ROPC) ,但还包含基于 JWT 断言的授权类型。 这些授权类型与授权代码和隐式授权类型不同,在操作方式方面具有根本区别。 不存在浏览器用户代理,并且不向 /authorize 端点发出任何请求。 由于未使用此浏览器端点,因此必须以不同方式评估应用程序的访问策略。
应用访问策略后,解决了以下基本业务需求:
- 用户是否已充分认证以访问此应用程序?
- 是否允许已认证的用户访问此应用程序?
- 是否允许用于访问此应用程序的设备或客户机上下文?
在传统浏览器流程中,将应用这些需求。 如果未满足,那么浏览器将提示 MFA ,或者它会向用户返回一个错误页面,该页面将使访问停止。 在 API 授权类型中,这些功能并非全部可用。 因此,必须解决以下问题。
- 接收来自客户机设备的上下文。
- 返回 MFA 质询,包括
- 实现 MFA 所需的 API。
- 如何访问 API。
Policyauth 授权类型
为了将访问策略有效地应用于仅限 API 的 OAuth 2.0 流,引入了新的授权类型。 此授权类型允许客户机在任何认证之前向访问策略提供一些上下文。 这种能力可以实现增强的用户体验。 例如,当用户按登录按钮时,在系统提示其输入任何凭证前,根据相关策略对其进行评估。 如果它们不满足策略需求,那么用户将接收到错误消息,指示由于策略需求,他们无法认证或访问资源。
policyauth 授权类型时,将返回其中一个响应。- 拒绝
- 指示由于策略无法授予访问权的错误。
- 质询
- 返回可用来访问认证 API 的令牌,其中包含可接受的认证因子的列表。
来自 /token 的 MFA 质询响应
当访问策略应用于 API OAuth 2.0 流时,MFA 的质询必须成为 API 合同的一部分。 在请求 /authorize 的过程中执行 MFA 步骤的 OP 的传统方法是不可能的。
当 MFA 质询由 /token返回时,
- 作用域为
mfa_challenge,并且不会返回其他作用域。 - 发出访问令牌。
- 访问令牌有权访问必需的认证 API。 使用此访问令牌,而不是常规 API 客户机访问令牌非常重要。 此令牌用于在授予中跟踪已执行的认证因子和过去的操作。
- 访问令牌从
/introspect请求返回active: true。 任何保护资源服务器的 API 都必须在使用 MFA 质询时,实现从/introspect返回的scope不等于mfa_challenge的检查。
- (可选)列出了可以执行以满足此质询
allowedFactors的因子数组。
向 /token 提供上下文
向 /token 执行请求的 API 客户机可以向 /token 提供明确定义的任意上下文信息,以便在访问策略评估中使用。
必须包含三个必需的上下文信息。
sessionId- OAuth 客户机发出的和维护的任意会话标识。ipAddress- 因为 OAuth 客户机负责与用户代理的交互,所以必须明确提供用户 IP 地址。userAgent- 与 IP 地址类似,必须明确提供用户的用户代理。
可以包含更多参数,并且可以在这些值上创建上下文属性条件。
/token注意: 如果向 发送的请求中未包含 参数 context ,则不会调用访问策略。上下文以 base64 编码的 JSON 格式提供给 /token。 上下文的 JSON 有效内容示例为:
{
"sessionId":"MDNjZmQ3NDM2NjFmMDc5NzVmYTJmMT",
"ipAddress":"129.42.38.10",
"userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
}
上下文信息被认为是可信的,因为它由发出了一组安全客户机凭证的 API 客户机提供。 该 API 客户机必须确保它不允许由消耗性的用户代理任意提供上下文,该用户代理可用于绕过业务控制。
在调用所有 API 授权类型(包括 policyAuth JWT Bearer、、 ROPC 和 refresh
token)的访问策略时,必须提供上下文。
满足 mfa_challenge
为满足由 /token 端点返回的 MFA 质询,可以使用认证因子 API。 这些 API 用于满足第一和第二因子需求。 在 mfa_challenge 响应中返回的访问令牌用于请求相应的因子。 因子成功完成后,将返回 JWT。 此 JWT 包含一些关键信息。
- 派生自用于请求因子 API 的访问令牌的
grant_id。 此标识在/token的不同请求中维持相关性。 - 已执行的操作
factor以及之前执行过的任何因素。
此 JWT 作为 jwtBearer 授权类型流的一部分提供给 /token。 将重新评估访问策略,并发出完全授权的令牌或其他质询。
returnJwt=true。- 以下第一因子认证 API 支持此标志:
- 以下 MFA API 支持此标志:
- https://securitypoc.ice.ibmcloud.com/developer/explorer/#!/Email_One-time_Password_2.0/attemptEmailotpVerification_2_0
瞬态验证 API 也支持此标志。 但是,要使用它发出的 JWT,必须配置主题声明的映射。
- https://securitypoc.ice.ibmcloud.com/developer/explorer/#!/SMS_One-time_Password_2.0/attemptSmsotpVerification_2_0
瞬态验证 API 也支持此标志。 但是,要使用它发出的 JWT,必须配置主题声明的映射。
- https://securitypoc.ice.ibmcloud.com/developer/explorer/#!/FIDO/assertionResult
通行密钥既可作为第一验证因素,也可作为第二验证因素。
- https://securitypoc.ice.ibmcloud.com/developer/explorer/#!/Voice_One-time_Password_2.0/attemptVoiceotpVerification_2_0
瞬态验证 API 也支持此标志。 但是,要使用它发出的 JWT,必须配置主题声明的映射。
- https://securitypoc.ice.ibmcloud.com/developer/explorer/#!/One-time_Password/attemptOtpVerification_2_0
- https://securitypoc.ice.ibmcloud.com/developer/explorer/#!/Time-based_One-time_Password_2.0/verifyTotpEnrollment_2_0
- https://securitypoc.ice.ibmcloud.com/developer/explorer/#!/Email_One-time_Password_2.0/attemptEmailotpVerification_2_0
- 对于瞬态因子 API,JWT 的
sub字段将填充请求中使用的瞬态信息。 例如,电子邮件或电话号码,而不是userId。 - 设置
returnJwt=true时,通常返回状态码204且没有 HTTP 主体的验证 API 将其状态码更改为200。 它们返回content-typeapplication/json并具有如下响应:
对于已返回 JSON 的因子验证,将{ "assertion:"ey..."}assertion特性添加到响应。
将访问策略应用于不同授权类型
配置应用程序时,存在访问策略是否应用于特定授权类型的选项。
此配置控制是否对基于 grant_type 参数值的 /token 请求评估访问策略。 无论对特定授权的任何先前 /token 调用情况如何,此评估都适用。
policyauth- 必须始终启用访问策略。
ROPC- 如果 ROPC 授权类型的使用不支持
mfa_challenge响应,那么可以禁用访问策略。 JWT Bearer- 在
jwt-bearer授权类型上禁用访问策略时,无法通过policyauth流完成 MFA。 执行第一因子后,访问策略不会运行。 Refresh token- 只能应用于将上下文参数
original_grant_type用作上下文属性条件的refresh_token请求子集。