第 12 章 管理 OpenID Connect 和 SAML 客户端
客户端是可以请求用户身份验证的实体。客户端采用两种形式。第一种类型的客户端是希望参与单点登录的应用程序。这些客户端只需要使用红帽构建的 Keycloak 为其提供安全性。其他类型的客户端是请求访问令牌之一,以便它能够代表经过身份验证的用户调用其他服务。本节讨论有关配置客户端的各个方面以及进行此操作的各种方法。
12.1. 管理 OpenID Connect 客户端 复制链接链接已复制到粘贴板!
OpenID Connect 是推荐的协议来保护应用程序。它基于 Web 友好设计,它最好用于 HTML5/JavaScript 应用程序。
12.1.1. 创建 OpenID Connect 客户端 复制链接链接已复制到粘贴板!
要保护使用 OpenID 连接协议的应用程序,您可以创建一个客户端。
流程
- 点菜单中的 Clients。
点 Create client。
创建客户端
- 将 Client type 设置为 OpenID Connect。
输入 客户端 ID。
此 ID 是一个字母数字字符串,用于 OIDC 请求以及红帽构建的 Keycloak 数据库来识别客户端。
为客户端提供 名称。
如果您计划本地化此名称,请设置替换字符串值。例如,字符串值,如 ${myapp}。如需更多信息 ,请参阅 服务器开发人员指南。
- 点 Save。
此操作会创建客户端,并将您带到 Settings 选项卡,您可以在其中 执行基本配置。
12.1.2. 基本配置 复制链接链接已复制到粘贴板!
Settings 选项卡包含用于配置此客户端的许多选项。
设置标签页
12.1.2.1. 常规设置 复制链接链接已复制到粘贴板!
- 客户端 ID
- OIDC 请求以及 Red Hat build of Keycloak 数据库用于识别客户端的字母数字字符 ID 字符串。
- Name
- 红帽构建的 Keycloak UI 屏幕中的客户端名称。要本地化名称,请设置替换字符串值。例如,字符串值,如 ${myapp}。如需更多信息 ,请参阅 服务器开发人员指南。
- 描述
- 客户端的描述。此设置也可以本地化。
- 在控制台中始终显示
- 即使此用户没有活跃的会话,也始终在帐户控制台中列出此客户端。
12.1.2.2. 访问设置 复制链接链接已复制到粘贴板!
- 根 URL
- 如果红帽构建的 Keycloak 使用任何配置的相对 URL,则该值会添加到其中。
- 主页 URL
- 提供当身份验证服务器需要重定向或链接到客户端时的默认 URL。
- 有效的 Redirect URI
必填字段。输入 URL 模式并点击 + 以添加和 - 以删除现有 URL 并点 Save。确切的(区分大小写)字符串匹配用于比较有效的重定向 URI。
您可以在 URL 模式的末尾使用通配符。例如
http://host.com/path/*。为避免安全问题,如果传递的重定向 URI 包含 userinfo 部分或其路径 来管理对 父目录的访问(/../),则不会执行通配符比较,但标准和安全匹配的字符串匹配。完整的通配符
*有效重定向 URI 也可以配置为允许任何 http 或 https 重定向 URI。请不要在生产环境中使用它。专用重定向 URI 模式通常更安全。如需更多信息 ,请参阅不特定的重定向 URI。
- Web Origins
输入 URL 模式并点击 + 以添加和 - 删除现有 URL。点 Save。
此选项处理 跨Origin Resource Sharing (CORS)。如果浏览器 JavaScript 尝试向域与 JavaScript 代码来自的服务器不同的服务器,请求必须使用 CORS。服务器必须处理 CORS 请求,否则浏览器不会显示或允许处理请求。这个协议可防止 XSS、CSRF 和其他基于 JavaScript 的攻击。
此处列出的域 URL 嵌入在发送到客户端应用程序的访问令牌中。客户端应用程序使用此信息来决定是否允许 CORS 请求对其调用。只有红帽构建的 Keycloak 客户端适配器支持此功能。如需更多信息 ,请参阅保护应用程序和服务指南。
- 管理 URL
- 客户端的回调端点。服务器使用此 URL 进行回调,如推送撤销策略、执行后通道注销和其他管理操作。对于红帽构建的 Keycloak servlet 适配器,此 URL 可以是 servlet 应用程序的 root URL。如需更多信息,请参阅 保护应用程序和服务指南。
12.1.2.3. 功能配置 复制链接链接已复制到粘贴板!
- 客户端身份验证
OIDC 客户端的类型。
ON
对于执行浏览器登录的服务器端客户端,在发出访问令牌请求时需要客户端 secret。此设置应该用于服务器端应用程序。
OFF
对于执行浏览器登录的客户端客户端。由于无法确保 secret 可以与客户端侧客户端安全保持安全,因此务必要通过配置正确的重定向 URI 来限制访问。
- 授权
- 启用或禁用此客户端的精细授权支持。
- 标准流
- 如果启用,这个客户端可以使用 OIDC 授权代码流。
- 直接访问授予
- 如果启用,这个客户端可以使用 OIDC Direct Access Grants。
- 隐式流
- 如果启用,这个客户端可以使用 OIDC Implicit Flow。
- 服务帐户角色
-
如果启用,此客户端可以向红帽构建的 Keycloak 进行身份验证,并检索专用于此客户端的访问令牌。就 OAuth2 规范而言,这启用了对此
客户端授予的客户端凭证的支持。 - Auth 2.0 设备授权授予
- 如果启用,这个客户端可以使用 OIDC Device Authorization Grant。
- OIDC CIBA Grant
- 如果启用,这个客户端可以使用 OIDC Client Initiated Backchannel Authentication Grant。
12.1.2.4. 登录设置 复制链接链接已复制到粘贴板!
- 登录主题
- 用于登录、OTP、授予注册和忘记密码页面的主题。
- 需要同意
如果启用,用户必须同意客户端访问。
对于执行浏览器登录的客户端客户端。由于无法确保 secret 可以与客户端侧客户端安全保持安全,因此务必要通过配置正确的重定向 URI 来限制访问。
- 在屏幕上显示客户端
如果 Consent Required 为 Off,则适用此交换机。
关
同意屏幕仅包含与配置的客户端范围对应的同意。
On
同意屏幕上还有一个关于此客户端本身的项目。
- 客户端同意屏幕文本
- 如果启用了 Consent required 和 Display 客户端, 则适用。包含有关此客户端权限的同意屏幕上的文本。
12.1.2.5. 注销设置 复制链接链接已复制到粘贴板!
- 前端频道退出
-
如果启用了 Channel Logout,应用程序应该可以通过前端频道注销用户,以根据 OpenID Connect\":\"ont-Channel Logout 规格注销用户。如果启用,您还应提供 192.168.1.0/24ont
-Channel Logout URL。 - 前端注销 URL
- 红帽构建的 Keycloak 用于通过前端向客户端发送注销请求的 URL。
- Backchannel logout URL
- 当注销请求发送到此域时,将导致客户端注销其自身的 URL (通过 end_session_endpoint)。如果省略,则不会将注销请求发送到客户端。
- 需要返回通道注销会话
- 指定在使用 Backchannel Logout URL 时,Logout Token 中是否包含会话 ID 声明。
- Backchannel logout 撤销离线会话
- 指定在使用 Backchannel Logout URL 时,Logout Token 中是否包含 revoke_offline_access 事件。当收到带有此事件的 Logout Token 时,红帽构建的 Keycloak 将撤销离线会话。
12.1.3. 高级配置 复制链接链接已复制到粘贴板!
在 Settings 选项卡中完成字段后,您可以使用其他标签页来执行高级配置。
12.1.3.1. 高级标签页 复制链接链接已复制到粘贴板!
当您点 Advanced 选项卡时,会显示其他字段。有关特定字段的详情,请点击该字段的问题标记图标。但是,本节将详细介绍某些字段。
12.1.3.2. 精细的 OpenID Connect 配置 复制链接链接已复制到粘贴板!
徽标 URL
引用客户端应用程序徽标的 URL。
策略 URL
Relying Party Client 向最终用户提供的 URL,以读取如何使用配置集数据。
服务 URL 术语
Relying Party 客户端向最终用户提供的 URL,以读取 Relying Party 的服务条款。
签名和加密的 ID 令牌支持
红帽构建的 Keycloak 可以根据 Json Web 加密(JWE)规范加密 ID 令牌。管理员确定是否为每个客户端加密 ID 令牌。
用于加密 ID 令牌的密钥是内容加密密钥(CEK)。红帽构建的 Keycloak 和客户端必须协商使用哪个 CEK 以及如何交付它。用于确定 CEK 的方法是密钥管理模式。红帽构建的 Keycloak 支持的密钥管理模式是密钥加密。
在密钥加密中:
- 客户端生成非对称加密密钥对。
- 公钥用于加密 CEK。
- 红帽构建的 Keycloak 会为每个 ID 令牌生成一个 CEK
- 红帽构建的 Keycloak 使用生成的 CEK 加密 ID 令牌
- 红帽构建的 Keycloak 使用客户端的公钥加密 CEK。
- 客户端使用其私钥解密此加密的 CEK
- 客户端使用解密的 CEK 解密 ID 令牌。
客户端以外的方无法解密 ID 令牌。
客户端必须通过其公钥将 CEK 加密到红帽 Keycloak 的构建。红帽构建的 Keycloak 支持从客户端提供的 URL 下载公钥。客户端必须根据 Json Web Keys (JWK) 规格提供公钥。
该流程是:
- 打开客户端的 Keys 选项卡。
- 将 JWKS URL 切换到 ON。
- 在 JWKS URL 文本框中输入客户端的公钥 URL。
密钥加密算法在 Json Web Algorithm (JWA) 规格中定义。红帽构建的 Keycloak 支持:
- RSAES-PKCS1-v1_5(RSA1_5)
- RSAES OAEP 使用默认参数(RSA-OAEP)
- RSAES OAEP 256 使用 SHA-256 和 MFG1 (RSA-OAEP-256)
选择算法的步骤是:
- 打开客户端 的高级 选项卡。
- 打开 Fine Grain OpenID Connect Configuration。
- 从 ID Token Encryption Content Encryption Algorithm 下拉菜单中选择算法。
12.1.3.3. 打开 ID 连接兼容性模式 复制链接链接已复制到粘贴板!
本节存在向后兼容。单击问号图标,了解每个字段的详情。
OAuth 2.0 通用 TLS 证书 Bound 访问令牌已启用
双向 TLS 将访问令牌和刷新令牌与客户端证书绑定,该证书在 TLS 握手过程中交换。此绑定可防止攻击者使用 stolen 令牌。
这种类型的令牌是拥有者密钥令牌。与 bearer 令牌不同,拥有者密钥令牌的接收者是否可以验证令牌的发送方是否是合法的。
如果此设置为 on,则工作流为:
- 令牌请求在授权代码流或混合流中发送到令牌端点。
- 红帽构建的 Keycloak 请求客户端证书。
- 红帽构建的 Keycloak 接收客户端证书。
- 红帽构建的 Keycloak 可以成功验证客户端证书。
如果验证失败,红帽构建的 Keycloak 会拒绝令牌。
在以下情形中,红帽构建的 Keycloak 将验证客户端发送访问令牌或刷新令牌:
- 令牌刷新请求通过拥有者外刷新令牌发送到令牌端点。
- UserInfo 请求发送到带有拥有者外访问令牌的 UserInfo 端点。
- 注销请求发送到 Logout 端点,并带有一个拥有者-of-key 刷新令牌。
如需了解更多详细信息,请参阅 OAuth 2.0 通用 TLS 客户端身份验证和证书绑定 访问令牌 中的 Mutual TLS 客户端证书 Bound 访问令牌。
目前,红帽构建的 Keycloak 客户端适配器不支持拥有者的密钥令牌验证。红帽构建的 Keycloak 适配器将访问和刷新令牌视为 bearer 令牌。
OIDC 的高级配置
OpenID Connect 的 Advanced Settings 允许您在客户端级别上配置 会话和令牌超时的覆盖。
| Configuration | 描述 |
|---|---|
| 访问令牌生命周期 | 该值会覆盖名称相同的 realm 选项。 |
| 客户端会话 Idle | 该值会覆盖名称相同的 realm 选项。该值应小于全局 SSO 会话空闲。 |
| 客户端会话最大 | 该值会覆盖名称相同的 realm 选项。该值应小于全局 SSO Session Max。 |
| 客户端离线会话空闲 | 此设置允许您为客户端配置较短的离线会话闲置超时。超时是红帽构建 Keycloak 撤销其离线令牌前会话闲置的时间长度。如果没有设置,则使用 realm Offline Session Idle。 |
| 客户端离线会话 Max | 此设置允许您为客户端配置较短的离线会话最大生命周期。生命周期是红帽构建的 Keycloak 撤销对应的离线令牌前的最长时间。这个选项需要在域中全局启用 Session Max Limited,默认为 Offline Session Max。 |
Code Exchange Code Challenge 方法的概念验证密钥
如果攻击者窃取合法客户端的授权代码,则针对代码交换(PKCE)的密钥会阻止攻击者收到应用到代码的令牌。
管理员可以选择以下选项之一:
- (blank)
- 红帽构建的 Keycloak 不适用 PKCE,除非客户端向红帽构建的 Keycloak 授权端点发送适当的 PKCE 参数。
- S256
- 红帽构建的 Keycloak 适用于代码质询方法为 S256 的客户端 PKCE。
- plain
- 红帽构建的 Keycloak 适用于代码质询方法为 plain 的客户端 PKCE。
如需了解更多详细信息,请参阅 OAuth 公共客户端的代码交换的 RFC 7636 的密钥。
ACR 到身份验证级别(LoA)映射
在客户端的高级设置中,您可以定义哪个 身份验证上下文参考(ACR) 值映射到哪个级别的 身份验证(LoA)。此映射也可以在 ACR 到 LoA Mapping 所述的域中指定。最佳实践是在域级别配置此映射,它允许在多个客户端间共享相同的设置。
当从此客户端发送到红帽构建的 Keycloak 时,Default ACR 值可以用来指定默认值 ,但没有附加了cr_values 参数的 claim 参数。 请参阅 官方 OIDC 动态客户端注册规格。
请注意,默认的 ACR 值用作默认级别,但它不能可靠用于强制使用特定级别的登录。例如,假设您将默认 ACR 值 配置为级别 2。默认情况下,用户需要用户使用级别 2 进行身份验证。但是,当用户将参数明确附加到登录请求时,如 acr_values=1,则使用级别 1。因此,如果客户端真正需要级别 2,则建议客户端检查 ID 令牌中是否存在 acr 声明,并加倍它包含请求的级别 2。
详情请查看 步骤身份验证和 官方 OIDC 规格。
12.1.4. 机密客户端凭证 复制链接链接已复制到粘贴板!
如果客户端的 客户端身份验证 设置为 ON,客户端的凭据必须在 Credentials 选项卡下配置。
凭证标签页
Client Authenticator 下拉列表指定用于您的客户端的凭证类型。
客户端 ID 和 Secret
这个选择是默认设置。secret 会自动生成。如果需要,点 Regenerate 重新创建 secret。
签名的 JWT
签名的 JWT 是 "Signed Json Web Token"。
选择此凭证类型时,还必须在键选项卡中为客户端生成私钥和证书 。私钥将用于签署 JWT,而证书则供服务器用于验证签名。
Key 标签页
单击 Generate new key 按钮以启动此过程。
生成密钥
- 选择您要使用的归档格式。
- 输入 密钥密码。
- 输入 存储密码。
- 点 Generate。
当您生成密钥时,Red Hat build of Keycloak 将存储证书,并下载您的客户端的私钥和证书。
您还可以使用外部工具生成密钥,然后通过单击 Import Certificate 来导入客户端的证书。
导入证书
- 选择证书的归档格式。
- 输入存储密码。
- 单击 Import File,选择证书文件。
- 点 Import。
如果您单击 Use JWKS URL,则不需要导入证书。在这种情况下,您可以提供以 JWK 格式发布公钥的 URL。使用此选项时,如果密钥被改变,红帽构建的 Keycloak 会重新导入密钥。
如果您使用由红帽构建的 Keycloak 适配器保护的客户端,您可以使用此格式配置 JWKS URL,假设 https://myhost.com/myapp 是客户端应用程序的根 URL:
https://myhost.com/myapp/k_jwks
https://myhost.com/myapp/k_jwks
如需了解更多详细信息,请参阅 服务器开发人员指南。
使用客户端 Secret 签名 JWT
如果选择了这个选项,您可以使用由客户端 secret 签名的 JWT,而不是私钥。
客户端机密将用于签署客户端 JWT。
X509 证书
红帽构建的 Keycloak 将验证客户端是否在 TLS Handshake 中使用正确的 X509 证书。
X509 证书
验证器还使用配置的 regexp 验证表达式检查证书的 Subject DN 字段。对于某些用例,接受所有证书就足够了。在这种情况下,您可以使用 (DSL?) (?:$) 表达式。
红帽构建的 Keycloak 可以通过两种方式从请求获取客户端 ID:
-
查询中的
client_id参数(在 OAuth 2.0 规范的 2.2 部分中介绍)。 -
提供
client_id作为表单参数。
12.1.5. 客户端 Secret 轮转 复制链接链接已复制到粘贴板!
请注意,客户端 Secret 轮转支持正在开发中。以实验性方式使用此功能。
对于具有 机密 客户端身份验证 红帽构建的 Keycloak 的客户端,支持通过客户端 策略 轮转客户端 secret 的功能。
客户端 secret 轮转策略提供了更高的安全性,以减少机密泄漏等问题。启用后,红帽构建的 Keycloak 支持每个客户端同时有两个活跃的 secret。策略根据以下设置管理轮转:
- Secret expiration: [seconds] - 当 secret 被轮转时,这是新 secret 的过期时间。添加到 secret 创建日期的数量( 以秒为单位)。在策略执行时计算。
- 轮转 secret expiration: [seconds] - 当 secret 被轮转时,这个值是旧 secret 的剩余过期时间。这个值应该总是小于 Secret 过期时间。当值为 0 时,在客户端轮转过程中将立即删除旧 secret。添加到 secret 轮转日期的数量( 以秒为单位)。在策略执行时计算。
- 更新期间轮转的剩余时间: [seconds] - 更新动态客户端应执行客户端 secret 轮转的时间周期。在策略执行时计算。
当发生客户端 secret 轮转时,会生成一个新的主 secret,旧客户端主 secret 变为带有新过期日期的辅助 secret。
12.1.5.1. 客户端 secret 轮转的规则 复制链接链接已复制到粘贴板!
轮转不会自动或通过后台进程进行。为了执行轮转,客户端上需要一个更新操作,通过 Regenerate Secret (在客户端凭证选项卡中或 Admin REST API)的功能,通过 Red Hat build of Keycloak Admin Console。在调用客户端更新操作时,secret 轮转会根据规则进行:
- 当 Secret 过期 值小于当前日期时。
- 在动态客户端注册客户端更新 请求期间,如果更新期间保留过期时间 的值与当前日期和时间和 Secret 过期时间 匹配,客户端 secret 将自动轮转。
此外,还可以通过 Admin REST API 来强制客户端 secret 轮转。
在创建新客户端期间,如果客户端 secret 轮转策略处于活动状态,则行为将自动应用。
要将 secret 轮转行为应用到现有客户端,请在定义策略后更新该客户端,以便应用此行为。
12.1.6. 创建 OIDC 客户端 Secret 轮转策略 复制链接链接已复制到粘贴板!
以下是定义 secret 轮转策略示例:
流程
- 单击菜单中的 Realm Settings。
- 点 Client Policies 选项卡。
在 Profiles 页面中,点 Create client profile。
创建配置集
- 输入 Name 的任何名称。
- 输入可帮助您识别 Description 配置集目的的描述。
点 Save。
此操作会创建配置集,并可让您配置 executor。
点 Add executor 为这个配置集配置 executor。
创建配置集执行器
- 为 Executor Type 选择 secret-rotation。
- 为 Secret 过期 输入每个 secret 的最大持续时间时间(以秒为单位)。
为 Rotat ed Secret 过期,输入每个轮转 secret 的最长持续时间(以秒为单位)。
警告请记住,Rotated Secret Expiration 值必须总是小于 Secret 过期。
- 输入时间(以秒为单位),之后,任何更新操作都会更新 Remain Expiration Time 的客户端。
点 Add。
在上例中:
- 每个 secret 都会在一周内有效。
- 轮转的 secret 在两天后过期。
- 更新动态客户端的窗口在 secret 过期前一天启动。
- 返回到 Client Policies 选项卡。
- 点 Policies。
点 Create client policy。
创建客户端 Secret 轮转策略
- 输入 Name 的任何名称。
- 输入可帮助您识别 Description 策略目的的描述。
点 Save。
此操作会创建策略,并允许您将策略与配置集关联。它还允许您配置策略执行的条件。
在 Conditions 下,点 Add condition。
创建客户端 Secret 轮转策略条件
要将行为应用到所有机密客户端,请在 Condition Type 字段中选择 client-access-type
注意要应用到特定的客户端组,另一种方法是在 Condition Type 字段中选择 client-roles 类型。这样,您可以创建特定的角色并为每个角色分配自定义轮转配置。
- 将 机密 添加到字段 Client Access Type。
- 点 Add。
回到策略设置中,在 Client Profiles 下,单击 Add client profile,然后从列表中选择 Weekly Client Secret Rotation Profile,然后单击 Add。
客户端 Secret 轮转策略
要将 secret 轮转行为应用到现有客户端,请按照以下步骤执行:
使用管理控制台
- 点菜单中的 Clients。
- 点客户端。
- 点 Credentials 选项卡。
- 点客户端 secret 的 Re-generate。
使用客户端 REST 服务,它可以通过两种方式执行:
- 通过客户端上的更新操作
- 通过重新生成客户端 secret 端点
12.1.7. 使用服务帐户 复制链接链接已复制到粘贴板!
每个 OIDC 客户端都有一个内置 服务帐户。使用 此服务帐户 获取访问令牌。
流程
访问令牌的角色是以下交集:
- 客户端的角色范围映射与从链接的客户端范围继承的角色范围映射合并。
- 服务帐户角色。
要调用的 REST URL 是 /realms/{realm-name}/protocol/openid-connect/token。此 URL 必须作为 POST 请求调用,并且要求您通过请求发布客户端凭据。
默认情况下,客户端凭证由 Authorization: Basic 标头中的客户端的 clientId 和 clientSecret 表示,但您也可以使用签名的 JWT 断言或其它自定义机制来验证客户端。
您还需要根据 OAuth2 规格将 grant_type 参数设置为 "client_credentials"。
例如,检索服务帐户的 POST 调用类似如下:
POST /realms/demo/protocol/openid-connect/token
Authorization: Basic cHJvZHVjdC1zYS1jbGllbnQ6cGFzc3dvcmQ=
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
POST /realms/demo/protocol/openid-connect/token
Authorization: Basic cHJvZHVjdC1zYS1jbGllbnQ6cGFzc3dvcmQ=
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
响应类似于 OAuth 2.0 规范的此 访问令牌响应。
默认仅返回访问令牌。不会返回刷新令牌,默认身份验证时不会在红帽构建的 Keycloak 端上创建用户会话。由于缺少刷新令牌,在访问令牌过期时需要重新进行身份验证。但是,这种情况并不意味着红帽构建的 Keycloak 服务器的额外开销,因为默认不会创建会话。
在这种情况下,不需要注销。但是,发布的访问令牌可以通过向 OAuth2 撤销端点发送请求来撤销,如 OpenID Connect Endpoints 部分所述。
12.1.8. Audience 支持 复制链接链接已复制到粘贴板!
通常,部署了红帽构建的 Keycloak 的环境由一组使用红帽构建的 Keycloak 进行身份验证 的机密 或 公共 客户端应用程序组成。
服务 ( OAuth 2 规格中的资源服务器 )也可用于提供来自客户端应用程序的请求,并为这些应用程序提供资源。这些服务要求 向它们 发送访问令牌(早期令牌)以验证请求。此令牌由 frontend 应用程序在登录到红帽 Keycloak 构建时获得。
在跨服务间信任的环境中,您可能会遇到这种情况:
- 前端客户端应用程序需要针对红帽构建的 Keycloak 进行身份验证。
- 红帽构建的 Keycloak 验证用户。
- 红帽构建的 Keycloak 向应用程序发布令牌。
- 应用使用令牌来调用不受信任的服务。
- 不受信任的服务将响应返回给应用程序。但是,它会保留应用程序令牌。
- 然后,不受信任的服务使用应用程序令牌调用可信服务。这会导致安全性,因为不受信任的服务会滥用令牌代表客户端应用程序访问其他服务。
这种场景不太可能在服务间具有高度信任的环境中,而不是在信任较低的环境中。在某些环境中,此工作流可能正确,因为不受信任的服务可能需要从可信服务检索数据,才能将数据返回到原始客户端应用程序。
当服务之间存在高级别的信任时,没有限制的使用者很有用。否则,使用者应有限。您可以限制使用者,并同时允许不受信任的服务从可信服务检索数据。在这种情况下,确保不受信任的服务和可信服务作为使用者添加到令牌。
要防止任何滥用访问令牌,请限制令牌的使用者并配置您的服务以验证令牌上的使用者。流将改变,如下所示:
- 前端应用程序针对红帽构建的 Keycloak 进行身份验证。
- 红帽构建的 Keycloak 验证用户。
红帽构建的 Keycloak 向应用程序发布令牌。应用程序知道它需要调用不受信任的服务,以便在发送到红帽构建的 Keycloak 的 身份验证请求中放置 scope=<untrusted service > (请参阅 Client Scopes 部分 以了解更多有关 scope 参数的详细信息)。
发布到应用程序的令牌包含对其使用者中的不受信任的服务的引用("audience": [ "<untrusted service>" ]),它声明客户端使用此访问令牌来调用不受信任的服务。
- 不受信任的服务使用令牌调用可信服务。调用不成功,因为可信服务会检查令牌上的使用者,并发现其使用者仅适用于不受信任的服务。这个行为是预期的,安全性不会中断。
如果客户端希望稍后调用可信服务,则必须恢复带有 scope=<trusted service > 的 SSO 登录来获取另一个令牌。然后,返回的令牌将包含可信服务作为使用者:
"audience": [ "<trusted service>" ]
"audience": [ "<trusted service>" ]
使用这个值调用 < trusted service>。
12.1.8.1. 设置 复制链接链接已复制到粘贴板!
在设置使用者检查时:
- 通过在适配器配置中添加标记 verify-token-audience,确保服务被配置为检查发送到它们的访问令牌上的使用者。详情请参阅适配器配置。
- 确保红帽构建的 Keycloak 发布的访问令牌包含所有必要的受众。可以使用客户端角色添加使用者,如下一部分所述或硬编码。???请参阅 硬编码的使用者。
12.1.8.2. 自动添加使用者 复制链接链接已复制到粘贴板!
Audience Resolve 协议映射器在默认客户端 范围角色 中定义。映射程序检查至少有一个客户端角色可用于当前令牌的客户端。然后,每个客户端的客户端 ID 会添加为受众,如果您的服务客户端依赖客户端角色时很有用。服务客户端通常是在没有启用任何流的情况下的客户端,这可能没有直接向其自身发布的令牌。它代表 OAuth 2 资源服务器。
例如,对于服务客户端和机密客户端,您可以使用为机密客户端发布的访问令牌来调用服务客户端 REST 服务。如果满足以下条件,服务客户端将自动作为受众添加到为机密客户端发布的访问令牌中:
- 服务客户端本身上定义了任何客户端角色。
- 目标用户至少分配了其中一个客户端角色。
- 机密客户端具有所分配的角色的角色范围映射。
如果要确保未自动添加 audience,请不要直接在机密客户端上配置角色范围映射。相反,您可以创建一个专用的客户端范围,其中包含专用客户端范围的客户端角色范围映射。
假设客户端范围作为可选客户端范围添加到机密客户端,如果 scope=< trusted service > 参数明确请求,客户端角色和使用者将添加到令牌中。
frontend 客户端本身不会自动添加到访问令牌使用者,因此允许在访问令牌和 ID 令牌之间轻松添加,因为访问令牌不包含作为使用者发布的令牌的客户端。
如果您需要客户端本身作为使用者,请参阅 硬编码的 audience 选项。但是,不建议使用与 frontend 和 REST 服务相同的客户端。
12.1.8.3. 硬编码的使用者 复制链接链接已复制到粘贴板!
当您的服务依赖于 realm 角色或不依赖于令牌中的角色时,使用硬编码的使用者会很有用。硬编码的使用者是一种协议映射程序,它将将指定服务客户端的客户端 ID 作为令牌的用户添加。如果要使用与客户端 ID 不同的使用者,您可以使用任何自定义值,如 URL。
您可以将协议映射程序直接添加到前端客户端。如果直接添加了协议映射程序,则始终添加使用者。
要对协议映射器进行更多控制,您可以在专用客户端范围内创建协议映射器,如 良好的服务。
Audience 协议映射器
- 在 良好服务 客户端的 Client details 选项卡中,您可以生成适配器配置,并确认 verify-token-audience 设置为 true。如果您使用此配置,这个操作会强制适配器验证使用者。
您需要确保机密客户端能够将 good-service 请求为其令牌中的使用者。
在机密客户端中:
- 点 Client Scopes 选项卡。
将 good-service 分配为可选(或默认)客户端范围。
如需了解更多详细信息 ,请参阅客户端范围链接部分。
- 您可以选择 评估客户端范围 并生成示例访问令牌。当将 good-service 指定为可选客户端范围时,如果 good-service 包含在 scope 参数中,则良好服务将添加到生成的访问令牌的使用者中。
在机密客户端应用程序中,确保使用了 scope 参数。当您要发出令牌才能访问良好的服务时,必须包含 good-service 值。
请参阅:
Audience 和 Audience Resolve 协议映射程序默认将使用者添加到访问令牌中。ID 令牌通常仅包含一个使用者、发布的令牌的客户端 ID,这是 OpenID Connect 规格的要求。但是,访问令牌不一定有客户端 ID (这是为其发布的令牌),除非添加了使用者映射程序。