第 12 章 管理 OpenID Connect 和 SAML 客户端


客户端是可以请求用户身份验证的实体。客户端采用两种形式。第一种类型的客户端是希望参与单点登录的应用程序。这些客户端只需要使用红帽构建的 Keycloak 为其提供安全性。其他类型的客户端是请求访问令牌之一,以便它能够代表经过身份验证的用户调用其他服务。本节讨论有关配置客户端的各个方面以及进行此操作的各种方法。

12.1. 管理 OpenID Connect 客户端

OpenID Connect 是推荐的协议来保护应用程序。它基于 Web 友好设计,它最好用于 HTML5/JavaScript 应用程序。

12.1.1. 创建 OpenID Connect 客户端

要保护使用 OpenID 连接协议的应用程序,您可以创建一个客户端。

流程

  1. 点菜单中的 Clients
  2. Create client

    创建客户端

    Create Client

  3. Client type 设置为 OpenID Connect
  4. 输入 客户端 ID。

    此 ID 是一个字母数字字符串,用于 OIDC 请求以及红帽构建的 Keycloak 数据库来识别客户端。

  5. 为客户端提供 名称

    如果您计划本地化此名称,请设置替换字符串值。例如,字符串值,如 ${myapp}。如需更多信息 ,请参阅 服务器开发人员指南

  6. Save

此操作会创建客户端,并将您带到 Settings 选项卡,您可以在其中 执行基本配置

12.1.2. 基本配置

Settings 选项卡包含用于配置此客户端的许多选项。

设置标签页

Settings tab

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 也可以配置为允许任何 httphttps 重定向 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 RequiredOff,则适用此交换机。

  • 同意屏幕仅包含与配置的客户端范围对应的同意。

  • On

    同意屏幕上还有一个关于此客户端本身的项目。

客户端同意屏幕文本
如果启用了 Consent requiredDisplay 客户端, 则适用。包含有关此客户端权限的同意屏幕上的文本。

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 支持的密钥管理模式是密钥加密。

在密钥加密中:

  1. 客户端生成非对称加密密钥对。
  2. 公钥用于加密 CEK。
  3. 红帽构建的 Keycloak 会为每个 ID 令牌生成一个 CEK
  4. 红帽构建的 Keycloak 使用生成的 CEK 加密 ID 令牌
  5. 红帽构建的 Keycloak 使用客户端的公钥加密 CEK。
  6. 客户端使用其私钥解密此加密的 CEK
  7. 客户端使用解密的 CEK 解密 ID 令牌。

客户端以外的方无法解密 ID 令牌。

客户端必须通过其公钥将 CEK 加密到红帽 Keycloak 的构建。红帽构建的 Keycloak 支持从客户端提供的 URL 下载公钥。客户端必须根据 Json Web Keys (JWK) 规格提供公钥。

该流程是:

  1. 打开客户端的 Keys 选项卡。
  2. JWKS URL 切换到 ON。
  3. 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)

选择算法的步骤是:

  1. 打开客户端 的高级 选项卡。
  2. 打开 Fine Grain OpenID Connect Configuration
  3. ID Token Encryption Content Encryption Algorithm 下拉菜单中选择算法。

12.1.3.3. 打开 ID 连接兼容性模式

本节存在向后兼容。单击问号图标,了解每个字段的详情。

OAuth 2.0 通用 TLS 证书 Bound 访问令牌已启用

双向 TLS 将访问令牌和刷新令牌与客户端证书绑定,该证书在 TLS 握手过程中交换。此绑定可防止攻击者使用 stolen 令牌。

这种类型的令牌是拥有者密钥令牌。与 bearer 令牌不同,拥有者密钥令牌的接收者是否可以验证令牌的发送方是否是合法的。

如果此设置为 on,则工作流为:

  1. 令牌请求在授权代码流或混合流中发送到令牌端点。
  2. 红帽构建的 Keycloak 请求客户端证书。
  3. 红帽构建的 Keycloak 接收客户端证书。
  4. 红帽构建的 Keycloak 可以成功验证客户端证书。

如果验证失败,红帽构建的 Keycloak 会拒绝令牌。

在以下情形中,红帽构建的 Keycloak 将验证客户端发送访问令牌或刷新令牌:

  • 令牌刷新请求通过拥有者外刷新令牌发送到令牌端点。
  • UserInfo 请求发送到带有拥有者外访问令牌的 UserInfo 端点。
  • 注销请求发送到 Logout 端点,并带有一个拥有者-of-key 刷新令牌。

如需了解更多详细信息,请参阅 OAuth 2.0 通用 TLS 客户端身份验证和证书绑定 访问令牌 中的 Mutual TLS 客户端证书 Bound 访问令牌。

注意

目前,红帽构建的 Keycloak 客户端适配器不支持拥有者的密钥令牌验证。红帽构建的 Keycloak 适配器将访问和刷新令牌视为 bearer 令牌。

OIDC 的高级配置

OpenID Connect 的 Advanced Settings 允许您在客户端级别上配置 会话和令牌超时的覆盖

Advanced Settings

Expand
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。

ACR to LoA mapping

详情请查看 步骤身份验证和 官方 OIDC 规格

12.1.4. 机密客户端凭证

如果客户端的 客户端身份验证 设置为 ON,客户端的凭据必须在 Credentials 选项卡下配置。

凭证标签页

Credentials Tab

Client Authenticator 下拉列表指定用于您的客户端的凭证类型。

客户端 ID 和 Secret

这个选择是默认设置。secret 会自动生成。如果需要,点 Regenerate 重新创建 secret。

签名的 JWT

Signed JWT

签名的 JWT 是 "Signed Json Web Token"。

选择此凭证类型时,还必须在键选项卡中为客户端生成私钥和证书 私钥将用于签署 JWT,而证书则供服务器用于验证签名。

Key 标签页

Keys tab

单击 Generate new key 按钮以启动此过程。

生成密钥

generate client keys

  1. 选择您要使用的归档格式。
  2. 输入 密钥密码
  3. 输入 存储密码
  4. Generate

当您生成密钥时,Red Hat build of Keycloak 将存储证书,并下载您的客户端的私钥和证书。

您还可以使用外部工具生成密钥,然后通过单击 Import Certificate 来导入客户端的证书。

导入证书

Import Certificate

  1. 选择证书的归档格式。
  2. 输入存储密码。
  3. 单击 Import File,选择证书文件。
  4. Import

如果您单击 Use JWKS URL,则不需要导入证书。在这种情况下,您可以提供以 JWK 格式发布公钥的 URL。使用此选项时,如果密钥被改变,红帽构建的 Keycloak 会重新导入密钥。

如果您使用由红帽构建的 Keycloak 适配器保护的客户端,您可以使用此格式配置 JWKS URL,假设 https://myhost.com/myapp 是客户端应用程序的根 URL:

https://myhost.com/myapp/k_jwks
Copy to Clipboard Toggle word wrap

如需了解更多详细信息,请参阅 服务器开发人员指南

使用客户端 Secret 签名 JWT

如果选择了这个选项,您可以使用由客户端 secret 签名的 JWT,而不是私钥。

客户端机密将用于签署客户端 JWT。

X509 证书

红帽构建的 Keycloak 将验证客户端是否在 TLS Handshake 中使用正确的 X509 证书。

X509 证书

x509 client auth

验证器还使用配置的 regexp 验证表达式检查证书的 Subject DN 字段。对于某些用例,接受所有证书就足够了。在这种情况下,您可以使用 (DSL?) (?:$) 表达式。

红帽构建的 Keycloak 可以通过两种方式从请求获取客户端 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 轮转策略示例:

流程

  1. 单击菜单中的 Realm Settings
  2. Client Policies 选项卡。
  3. Profiles 页面中,点 Create client profile

    创建配置集

    Create Client Profile

  4. 输入 Name 的任何名称。
  5. 输入可帮助您识别 Description 配置集目的的描述。
  6. Save

    此操作会创建配置集,并可让您配置 executor。

  7. Add executor 为这个配置集配置 executor。

    创建配置集执行器

    Client Profile Executor

  8. Executor Type 选择 secret-rotation
  9. Secret 过期 输入每个 secret 的最大持续时间时间(以秒为单位)。
  10. 为 Rotat ed Secret 过期,输入每个轮转 secret 的最长持续时间(以秒为单位)。

    警告

    请记住,Rotated Secret Expiration 值必须总是小于 Secret 过期

  11. 输入时间(以秒为单位),之后,任何更新操作都会更新 Remain Expiration Time 的客户端。
  12. Add

    在上例中:

    • 每个 secret 都会在一周内有效。
    • 轮转的 secret 在两天后过期。
    • 更新动态客户端的窗口在 secret 过期前一天启动。
  13. 返回到 Client Policies 选项卡。
  14. Policies
  15. Create client policy

    创建客户端 Secret 轮转策略

    Client Rotation Policy

  16. 输入 Name 的任何名称。
  17. 输入可帮助您识别 Description 策略目的的描述。
  18. Save

    此操作会创建策略,并允许您将策略与配置集关联。它还允许您配置策略执行的条件。

  19. 在 Conditions 下,点 Add condition

    创建客户端 Secret 轮转策略条件

    Client Rotation Policy Condition

  20. 要将行为应用到所有机密客户端,请在 Condition Type 字段中选择 client-access-type

    注意

    要应用到特定的客户端组,另一种方法是在 Condition Type 字段中选择 client-roles 类型。这样,您可以创建特定的角色并为每个角色分配自定义轮转配置。

  21. 机密 添加到字段 Client Access Type
  22. Add
  23. 回到策略设置中,在 Client Profiles 下,单击 Add client profile,然后从列表中选择 Weekly Client Secret Rotation Profile,然后单击 Add

    客户端 Secret 轮转策略

    Client Rotation Policy

注意

要将 secret 轮转行为应用到现有客户端,请按照以下步骤执行:

使用管理控制台

  1. 点菜单中的 Clients
  2. 点客户端。
  3. Credentials 选项卡。
  4. 点客户端 secret 的 Re-generate

使用客户端 REST 服务,它可以通过两种方式执行:

  • 通过客户端上的更新操作
  • 通过重新生成客户端 secret 端点

12.1.7. 使用服务帐户

每个 OIDC 客户端都有一个内置 服务帐户。使用 此服务帐户 获取访问令牌。

流程

  1. 点菜单中的 Clients
  2. 选择您的客户端。
  3. Settings 选项卡。
  4. 客户端身份验证 切换为 On
  5. 选择 服务帐户角色
  6. Save
  7. 配置 您的客户端凭据
  8. Scope 选项卡。
  9. 验证您是否有角色,或者将 Full Scope Allowed 切换到 ON
  10. Service Account Roles 选项卡
  11. 为您的客户端配置此服务帐户可用的角色。

访问令牌的角色是以下交集:

  • 客户端的角色范围映射与从链接的客户端范围继承的角色范围映射合并。
  • 服务帐户角色。

要调用的 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
Copy to Clipboard Toggle word wrap

响应类似于 OAuth 2.0 规范的此 访问令牌响应

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
    "access_token":"2YotnFZFEjr1zCsicMWpAA",
    "token_type":"bearer",
    "expires_in":60
}
Copy to Clipboard Toggle word wrap

默认仅返回访问令牌。不会返回刷新令牌,默认身份验证时不会在红帽构建的 Keycloak 端上创建用户会话。由于缺少刷新令牌,在访问令牌过期时需要重新进行身份验证。但是,这种情况并不意味着红帽构建的 Keycloak 服务器的额外开销,因为默认不会创建会话。

在这种情况下,不需要注销。但是,发布的访问令牌可以通过向 OAuth2 撤销端点发送请求来撤销,如 OpenID Connect Endpoints 部分所述。

12.1.8. Audience 支持

通常,部署了红帽构建的 Keycloak 的环境由一组使用红帽构建的 Keycloak 进行身份验证 的机密公共 客户端应用程序组成。

服务 ( OAuth 2 规格中的资源服务器 )也可用于提供来自客户端应用程序的请求,并为这些应用程序提供资源。这些服务要求 向它们 发送访问令牌(早期令牌)以验证请求。此令牌由 frontend 应用程序在登录到红帽 Keycloak 构建时获得。

在跨服务间信任的环境中,您可能会遇到这种情况:

  1. 前端客户端应用程序需要针对红帽构建的 Keycloak 进行身份验证。
  2. 红帽构建的 Keycloak 验证用户。
  3. 红帽构建的 Keycloak 向应用程序发布令牌。
  4. 应用使用令牌来调用不受信任的服务。
  5. 不受信任的服务将响应返回给应用程序。但是,它会保留应用程序令牌。
  6. 然后,不受信任的服务使用应用程序令牌调用可信服务。这会导致安全性,因为不受信任的服务会滥用令牌代表客户端应用程序访问其他服务。

这种场景不太可能在服务间具有高度信任的环境中,而不是在信任较低的环境中。在某些环境中,此工作流可能正确,因为不受信任的服务可能需要从可信服务检索数据,才能将数据返回到原始客户端应用程序。

当服务之间存在高级别的信任时,没有限制的使用者很有用。否则,使用者应有限。您可以限制使用者,并同时允许不受信任的服务从可信服务检索数据。在这种情况下,确保不受信任的服务和可信服务作为使用者添加到令牌。

要防止任何滥用访问令牌,请限制令牌的使用者并配置您的服务以验证令牌上的使用者。流将改变,如下所示:

  1. 前端应用程序针对红帽构建的 Keycloak 进行身份验证。
  2. 红帽构建的 Keycloak 验证用户。
  3. 红帽构建的 Keycloak 向应用程序发布令牌。应用程序知道它需要调用不受信任的服务,以便在发送到红帽构建的 Keycloak 的 身份验证请求中放置 scope=<untrusted service > (请参阅 Client Scopes 部分 以了解更多有关 scope 参数的详细信息)。

    发布到应用程序的令牌包含对其使用者中的不受信任的服务的引用("audience": [ "<untrusted service>" ]),它声明客户端使用此访问令牌来调用不受信任的服务。

  4. 不受信任的服务使用令牌调用可信服务。调用不成功,因为可信服务会检查令牌上的使用者,并发现其使用者仅适用于不受信任的服务。这个行为是预期的,安全性不会中断。

如果客户端希望稍后调用可信服务,则必须恢复带有 scope=<trusted service > 的 SSO 登录来获取另一个令牌。然后,返回的令牌将包含可信服务作为使用者:

"audience": [ "<trusted service>" ]
Copy to Clipboard Toggle word wrap

使用这个值调用 < 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 协议映射器

audience mapper

注意

AudienceAudience Resolve 协议映射程序默认将使用者添加到访问令牌中。ID 令牌通常仅包含一个使用者、发布的令牌的客户端 ID,这是 OpenID Connect 规格的要求。但是,访问令牌不一定有客户端 ID (这是为其发布的令牌),除非添加了使用者映射程序。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat