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


客户端是可以请求用户进行身份验证的实体。客户端以两种形式提供。第一种类型的客户端是希望参与单点登录的应用程序。这些客户端只希望 Red Hat Single Sign-On 为它们提供安全。另一种类型的客户端是请求访问令牌,以便它能够代表经过身份验证的用户调用其他服务。本节讨论配置客户端以及执行它的各种方法。

12.1. OIDC 客户端

OpenID Connect 是用来保护应用程序的推荐协议。它从基础上设计为非常友好,它最适合使用 HTML5/JavaScript 应用程序。

12.1.1. 创建 OpenID Connect 客户端

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

流程

  1. 点菜单中的 Clients
  2. Create 进入 Add Client 页面。

    添加客户端

    Add Client

  3. 为客户端 ID 输入任何名称。
  4. 在客户端 协议 下拉菜单中选择 openid-connect
  5. Root URL 字段中输入应用程序的基本 URL。
  6. Save

12.1.2. 基本设置

当您创建 OIDC 客户端时,您可以在 Settings 标签页中看到以下字段。

客户端 ID
OIDC 请求和 Red Hat Single Sign-On 数据库中使用的 alpha-numeric ID 字符串来识别客户端。
名称
Red Hat Single Sign-On UI 屏幕中的客户端名称。要本地化名称,请设置替换字符串值。例如,字符串值,如 ${myapp}。如需更多信息,请参阅 服务器开发人员指南
描述
客户端的描述。此设置也可以本地化。
Enabled
关闭后,客户端无法请求身份验证。
需要同意
在打开后,用户会看到一个授权页面,他们可用于授予该应用程序的访问权限。它还会显示元数据,以便用户知道用户可以访问的确切信息。
访问类型
OIDC 客户端的类型。
机密
对于执行浏览器登录并要求客户端 secret 在发出访问令牌请求时的服务器端客户端。此设置应该用于服务器端应用程序。
公开
对于执行浏览器登录的客户端。由于无法确保 secret 可以与客户端客户端保持安全,因此务必要通过配置正确的重定向 URI 来限制访问。
bearer-only
应用只允许 bearer 令牌请求。开启后,此应用无法参与浏览器登录。
启用标准流
启用后,客户端可以使用 OIDC 授权代码流
隐式流已启用
启用后,客户端可以使用 OIDC Implicit Flow
启用直接访问
启用后,客户端可以使用 OIDC Direct Access Grants
启用 OAuth 2.0 设备授权
如果这样做,则允许客户端使用 OIDC 设备授权授权
OpenID Connect Client Initiated Backchannel Authentication Enabled
如果出现这种情况,则允许客户端使用 OIDC 客户端初始频道身份验证Grant
Root URL
如果 Red Hat Single Sign-On 使用任何配置的相对 URL,则会在其前面加上这个值。
有效的 Redirect URI

必填字段.输入 URL 模式,再单击 + 来添加和 - 来删除现有 URL,然后单击保存。您可以在 URL 模式末尾使用通配符。例如 http://host.com/*

专用重定向 URL 模式通常更安全。如需更多信息 ,请参阅 未知的重定向 URI

基本 URL
当 Red Hat Single Sign-On 需要链接到客户端时,会使用这个 URL。
管理员 URL
客户端的回调端点。服务器使用此 URL 进行回调,如推送撤销策略、执行回频道注销和其他管理操作。对于 Red Hat Single Sign-On servlet 适配器,这个 URL 可以是 servlet 应用的根 URL。如需更多信息,请参阅 保护应用程序和服务指南
Web Origins

输入 URL 模式并点击 + 来添加和 - 删除现有的 URL。点 Save

此选项处理 跨资源共享(CORS)。如果浏览器 JavaScript 尝试 AJAX HTTP 请求到域不同于 JavaScript 代码来自的服务器,请求必须使用 CORS。服务器必须处理 CORS 请求,否则浏览器不会显示或允许处理请求。这个协议可防止 XSS、CSRF 和其他基于 JavaScript 的攻击。

这里列出的域 URL 嵌入到发送到客户端应用程序的访问令牌中。客户端应用使用此信息来确定是否允许在其上调用 CORS 请求。只有 Red Hat Single Sign-On 客户端适配器只支持此功能。如需更多信息 ,请参阅保护应用程序和服务指南

前端频道注销
如果启用了 Front Channel Logout,则应用程序应该可以根据 OpenID Connect Front-Channel Logout 规格通过前端频道注销用户。如果启用,您还应提供 Front-Channel Logout URL
front-Channel Logout URL
Red Hat Single Sign-On 将通过前端频道向客户端发送注销请求的 URL。
Backchannel Logout URL
当注销请求发送到这个域(通过 end_session_endpoint)时,会导致客户端自己注销的 URL。如果省略,则不会向客户端发送注销请求。

12.1.3. 高级设置

当您点 Advanced Settings 时,会显示其他字段。

OAuth 2.0 Mutual TLS Certificate Bound Access Tokens Enabled

注意

要在 Red Hat Single Sign-On 中启用 mutual TLS,请参阅在 WildFly 中启用 mutual SSL

Mutual TLS 将访问令牌和刷新令牌与客户端证书绑定,后者在 TLS 握手期间交换。这个绑定可防止攻击者使用 stolen 令牌。

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

如果这个设置位于,则工作流为:

  1. 令牌请求在授权代码流或混合流中发送到令牌端点。
  2. 红帽单点登录请求客户端证书。
  3. Red Hat Single Sign-On 接收客户端证书。
  4. 红帽单点登录成功验证客户端证书。

如果验证失败,红帽单点登录会拒绝令牌。

在以下情形中,Red Hat Single Sign-On 将验证客户端发送访问令牌或刷新令牌:

  • 令牌刷新请求发送到令牌端点,并带有拥有者(key)刷新令牌。
  • UserInfo 请求会发送到 userInfo 端点,其具有拥有者(key)访问令牌。
  • 注销请求发送到 Logout 端点,并带有拥有者(key)刷新令牌。

如需了解更多详细信息,请参阅 OAuth 2.0 Mutual TLS 客户端身份验证和证书 Bound Access Tokens 中的 Mutual TLS Client Certificate Bound Access Tokens。

注意

目前,Red Hat Single Sign-On 客户端适配器不支持拥有者密钥令牌验证。红帽单点登录适配器将访问和刷新令牌视为 bearer 令牌。

代码交换代码挑战方法验证密钥

如果攻击者破坏合法客户端的授权代码,则代码交换的概念验证密钥(PKCE)可防止攻击者获得应用到代码的令牌。

管理员可以选择以下选项之一:

(空白)
除非客户端向红帽单点登录授权端点发送适当的 PKCE 参数,否则 Red Hat Single Sign-Ons 不适用于 PKCE。
S256
Red Hat Single Sign-On 适用于客户端 PKCE,其代码质询方法是 S256。
plain
Red Hat Single Sign-On 适用于客户端 PKCE,其代码质询方法是纯的。

如需了解更多详细信息,请参阅 OAuth 公共客户端代码交换的 RFC 7636 证明密钥

已签名和加密 ID 令牌支持

红帽单点登录可以根据 Json Web 加密(JWE)规范加密 ID 令牌。管理员决定是否为每个客户端配置了 ID 令牌。

用于加密 ID 令牌的密钥是内容加密密钥(CEK)。Red Hat Single Sign-On 和客户端必须协商使用 CEK 以及它的交付方式。用于确定 CEK 的方法是密钥管理模式。Red Hat Single Sign-On 支持的密钥管理模式是密钥加密。

在密钥加密中:

  1. 客户端生成非对称加密密钥对。
  2. 公钥用于加密 CEK。
  3. Red Hat Single Sign-On 会为每个 ID 令牌生成 CEK
  4. Red Hat Single Sign-On 使用这个生成的 CEK 加密 ID 令牌
  5. Red Hat Single Sign-On 使用客户端的公钥加密 CEK。
  6. 客户端使用其私钥解密这个加密的 CEK
  7. 客户端使用解密的 CEK 来解密 ID 令牌。

除客户端外,没有方可以解密 ID 令牌。

客户端必须将其公钥用于加密 CEK 到 Red Hat Single Sign-On。Red Hat Single Sign-On 支持从客户端提供的 URL 下载公钥。客户端必须根据 Json Web Keys (JWK) 规范提供公钥。

此过程是:

  1. 打开客户端的 Keys 选项卡。
  2. JWKS URL 切换到 ON。
  3. JWKS URL textbox 中输入客户端的公钥 URL。

密钥加密算法在 Json Web Algorithm (JWA) 规范中定义。Red Hat Single Sign-On 支持:

  • RSAES-PKCS1-v1_5(RSA1_5)
  • RSAES OAEP 使用默认参数(RSA-OAEP)
  • RSAES OAEP 256 使用 SHA-256 和 MFG1 (RSA-OAEP-256)

选择算法的步骤是:

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

12.1.4. 机密客户端凭证

如果客户端的 访问类型设为 机密,则必须在 Credentials 选项卡中配置该客户端的凭据。

凭证标签页

Credentials Tab

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

客户端 ID 和机密

这个选择是默认设置。为您自动生成 secret,点 Regenerate Secret 会根据需要重新创建 secret。

签名的 JWT

client credentials jwt

签名的 JWT "Signed Json Web 令牌"。

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

keys 标签页

client oidc keys

点击 Generate new key and certificate 按钮启动此过程。

生成密钥

generate client keys

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

生成密钥时,Red Hat Single Sign-On 将存储证书并下载您的客户端的私钥和证书。

您还可以使用外部工具生成密钥,然后点 Import Certificate 导入客户端证书。

导入证书

Import Certificate

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

如果点击 Use JWKS URL,则不需要导入证书。在这种情况下,您可以提供以 JWK 格式发布公钥的 URL。使用此选项时,如果密钥被改变,Red Hat Single Sign-On 会重新导入密钥。

如果您使用由 Red Hat Single Sign-On 适配器保护的客户端,您可以使用以下格式配置 JWKS URL,假设 https://myhost.com/myapp 是客户端应用程序的根 URL:

https://myhost.com/myapp/k_jwks

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

警告

Red Hat Single Sign-On 会缓存 OIDC 客户端的公钥。如果您的客户端的私钥被破坏,请更新您的密钥并清除密钥缓存。如需了解更多详细信息,请参阅清除缓存 部分。

使用客户端 Secret 签名 JWT

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

客户端机密将用于由客户端为 JWT 签名。

X509 证书

Red Hat Single Sign-On 在 TLS Handshake 中验证客户端是否使用正确的 X509 证书。

注意

这个选项需要在 Red Hat Single Sign-On 中需要 mutual TLS。请参阅 WildFly 中启用 mutual SSL

X509 证书

x509 client auth

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

Red Hat Single Sign-On 有两种方法以从请求获取客户端 ID:

12.1.5. 使用服务帐户

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

流程

  1. 点菜单中的 Clients
  2. 选择您的客户端。
  3. Settings 选项卡。
  4. 将客户端的 Access Type 设置为 机密
  5. 服务帐户已启用 切换到 ON
  6. Save
  7. 配置客户端凭据
  8. Scope 选项卡。
  9. 验证您有角色或切换 完整范围允许 ON
  10. Service Account Roles 选项卡
  11. 配置可用于此客户端的角色。

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

  • 客户端的角色范围映射和从链接的客户端范围映射中继承的角色范围映射。
  • 服务帐户角色.

要调用的 REST URL 是 /auth/realms/{realm-name}/protocol/openid-connect/token。这个 URL 必须以 POST 请求形式调用,并要求您使用请求发布客户端凭证。

默认情况下,客户端凭证由 Authorization: Basic 标头中的客户端的 clientId 和 clientSecret 表示,但您也可以使用签名的 JWT 断言或客户端身份验证的其他自定义机制验证客户端。

您还需要根据 OAuth2 规格将 grant_type 参数设置为 "client_credentials"。

例如,POST 调用以检索服务帐户,如下所示:

    POST /auth/realms/demo/protocol/openid-connect/token
    Authorization: Basic cHJvZHVjdC1zYS1jbGllbnQ6cGFzc3dvcmQ=
    Content-Type: application/x-www-form-urlencoded

    grant_type=client_credentials

从 OAuth 2.0 规范中,响应与此 Access Token 响应 类似。

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
}

默认情况下,仅返回访问令牌。默认情况下,不会返回刷新令牌,在 Red Hat Single Sign-On side 上不创建用户会话。由于缺少刷新令牌,在访问令牌过期时需要重新身份验证。但是,这种情形并不意味着红帽单点登录服务器的额外开销,因为默认不会创建会话。

在这种情况下,注销是不必要的。但是,通过将请求发送到 OAuth2 Revocation Endpoints 部分所述,可以撤销颁发的访问令牌。

12.1.6. 受众支持

通常,部署红帽单点登录的环境由一组使用 Red Hat Single Sign-On 进行身份验证的 保密公共客户端 应用程序组成。

服务 ( OAuth 2 规范中的资源服务器 )还可以为来自客户端应用程序的请求提供服务,并为这些应用程序提供资源。这些服务需要向它们发送访问令牌(Bearer 令牌)来验证请求。此令牌在登录 Red Hat Single Sign-On 后由 frontend 应用获取。

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

  1. 前端客户端应用程序需要针对 Red Hat Single Sign-On 进行身份验证。
  2. 红帽单点登录验证用户。
  3. 红帽单点登录向应用程序签发令牌。
  4. 该应用使用令牌来调用不受信任的服务。
  5. 不受信任的服务会返回对应用程序的响应。但是,它会保留应用程序令牌。
  6. 然后,不受信任的服务使用应用令牌调用可信服务。这会导致安全性损坏,因为不受信任的服务滥用令牌以代表客户端应用程序访问其他服务。

这种情境在服务间有高信任但并不是信任较低的环境的环境中不太可能出现。在某些环境中,这个工作流可能正确,因为不受信任的服务可能需要从可信服务检索数据,以将数据返回到原始客户端应用。

在服务之间存在高度信任时,一个无限制的受众很有用。否则,受众应限制。您可以限制使用者和同时,允许不受信任的服务从可信服务检索数据。在这种情况下,请确保将不受信任的服务和可信服务添加为令牌的受众。

为防止访问令牌的任何滥用,请限制令牌上的使用者,并配置您的服务来验证令牌上的使用者。流会按如下方式改变:

  1. frontend 应用通过 Red Hat Single Sign-On 进行身份验证。
  2. 红帽单点登录验证用户。
  3. 红帽单点登录向应用程序签发令牌。应用程序知道它需要调用不受信任的服务,以便在发送到 Red Hat Single Sign-On 的 身份验证请求中放置范围=<不受信任的服务 > (请参阅 客户端范围部分,以了解有关 范围 参数的更多详情)。

    给应用程序发布的令牌包含对其受众提供的不受信任的服务的引用("audience": [ "<untrusted service>" ]),该令牌声明了客户端使用此访问令牌调用不受信任的服务。

  4. 不可信服务使用令牌调用可信服务。调用不成功,因为受信任的服务会检查令牌上的使用者,并且发现其受众只针对不受信任的服务。这个行为是正常的,安全没有被破坏。

如果客户端想要稍后调用可信服务,它必须通过使用 范围 =<受信任的服务>重新运行 SSO 登录来获取另一个令牌。然后,返回的令牌会将可信服务作为受众包含在内:

"audience": [ "<trusted service>" ]

使用这个值调用 < trusted service>

12.1.6.1. 设置

设置受众检查时:

  • 通过添加 标志在适配器配置中添加 verify-token-audience,确保服务被配置为检查发送的访问令牌的使用者。详情请参阅 Adapter 配置
  • 确保红帽单点登录发布的令牌包含所有必要的受众。可使用客户端角色添加受众,如 下一节 或硬编码中所述。请参阅 硬编码受众

12.1.6.2. 自动添加受众

Audience Resolve protocol mapper 在默认的客户端范围 角色 中定义。映射器会检查至少一个可用于当前令牌的客户端角色。然后,每个客户端的客户端 ID 会被添加为受众,如果您的服务(通常为 bearer-only)客户端依赖于客户端角色,这很有用。

例如,对于仅限 bearer 的客户端和机密客户端,您可以使用为机密客户端发布的访问令牌来调用仅 bearer 的客户端 REST 服务。如果满足,则仅限 bearer 的客户端作为使用者自动添加到为机密客户端发布的访问令牌中。

  • bearer-only 客户端本身定义了任何客户端角色。
  • 目标用户至少分配了其中一个客户端角色。
  • 机密客户端具有所分配角色的角色范围映射。
注意

如果要确保受众没有自动添加,请不要在机密客户端上配置角色范围映射。反之,您可以创建一个专用的客户端范围,其中包含专用客户端范围范围的角色范围映射。

假设客户端范围作为可选客户端范围添加到机密客户端,客户端角色和受众将会在令牌中明确请求,则将添加到令牌中。

注意

前端客户端本身不会自动添加到访问令牌受众,从而允许轻松地区分访问令牌和 ID 令牌,因为访问令牌将不包含作为受众发布令牌的客户端。

如果您需要客户自己作为受众,请查看 硬编码的受众 选项。但是,不建议使用与 frontend 和 REST 服务相同的客户端。

12.1.6.3. 硬编码的受众

如果您的服务依赖于 realm 角色,或者不依赖于令牌中的角色,那么使用硬编码的受众会很有用。硬编码的使用者是一个协议映射程序,它将将指定服务客户端的客户端 ID 添加为令牌的使用者。如果要使用与客户端 ID 不同的受众,您可以使用任何自定义值,如 URL。

您可以将协议映射程序直接添加到 frontend 客户端。如果直接添加协议映射程序,那么还将始终添加听众。

如需更多对 protocol mapper 的控制,您可以在专用客户端范围内创建协议映射程序,该范围将调用,如 good服务

受众协议映射程序

audience mapper

  • good服务 客户端的 Installation 选项卡中,您可以生成适配器配置,您可以确认 verify-token-audience 选项被设置为 true。这在您使用此配置时,会强制适配器验证受众。
  • 您需要确保机密客户端能够在其令牌中以使用者请求 良好的服务

    在机密客户端上:

    1. Client Scopes 选项卡。
    2. good服务 分配为可选(或默认)客户端范围。

      如需了解更多详细信息 ,请参阅客户端范围链接部分

  • 您可以选择 评估客户端范围 并生成示例访问令牌。如果将 good-service 包含在 scope 参数中,如果将 good服务作为可选客户端范围,则服务 将添加到生成的访问令牌的受众中。
  • 在您的机密客户端应用程序中,确保使用 scope 参数。当您要发布令牌以访问良好服务 时,必须包括值 good-service

    请参阅:

注意

默认情况下,A udience 和 Audience Resolve 协议映射器会将受众仅添加到访问令牌中。ID 令牌通常仅包含单个受众,以及发出令牌的客户端 ID,这是 OpenID Connect 规格的要求。但是,访问令牌不一定具有客户端 ID,而这是发出的令牌,除非使用者映射程序被添加。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部