Keycloak 25.0.0 发布

2024年6月10日

要下载此版本,请访问 Keycloak 下载页面

亮点

已移除 Account Console v2 主题

Account Console v2 主题已从 Keycloak 中移除。此主题在 Keycloak 24 中已被弃用,并由 Account Console v3 主题取代。如果您仍在使用此主题,则应迁移到 Account Console v3 主题。

Java 21 支持

Keycloak 现在支持 OpenJDK 21,因为我们希望坚持使用最新的 LTS OpenJDK 版本。

Java 17 支持已弃用

OpenJDK 17 支持在 Keycloak 中已弃用,并将在后续版本中移除,转而支持 OpenJDK 21。

大多数 Java 适配器已被移除

如先前 Keycloak 版本的发行说明中所述,大多数 Java 适配器现已从 Keycloak 代码库和下载页面中移除。

对于 OAuth 2.0/OIDC,这包括移除 Tomcat 适配器、WildFly/EAP 适配器、Servlet Filter 适配器、KeycloakInstalled 桌面适配器、jaxrs-oauth-client 适配器、JAAS 登录模块、Spring 适配器和 SpringBoot 适配器。您可以查看 我们之前的文章,了解一些替代方案列表。

对于 SAML,这包括移除 Tomcat 适配器和 Servlet filter 适配器。WildFly 和 JBoss EAP 仍支持 SAML 适配器。

通用授权客户端库仍然受支持,我们仍计划继续支持它。它的目标是与任何其他 OAuth 2.0 或 OpenID Connect 库结合使用。您可以查看 快速入门,了解一些将此授权客户端库与 Elytron OIDC 或 SpringBoot 等第三方 Java 适配器一起使用的示例。您还可以查看快速入门,了解与 WildFly 一起使用的 SAML 适配器示例。

升级到 PatternFly 5

在 Keycloak 24 中,欢迎页面已更新为使用 PatternFly 5,这是 Keycloak 用户界面基础设计系统的最新版本。在此版本中,管理控制台和账户控制台也已更新为使用 PatternFly 5。如果您想扩展和自定义管理控制台和账户控制台,请查看 PatternFly 5 中的更改,并相应地更新您的自定义设置。

Argon2 密码哈希

Argon2 现在是 Keycloak 在非 FIPS 环境中使用的默认密码哈希算法。

Argon2 是 2015 年密码哈希竞赛的获胜者,并且是 OWASP 推荐的哈希算法。

在 Keycloak 24 中,PBKDF2 的默认哈希迭代次数从 27.5K 增加到 210K,导致生成密码哈希所需的 CPU 时间增加了 10 倍以上。使用 Argon2,可以实现更好的安全性,同时 CPU 时间几乎与以前版本的 Keycloak 相同。一个缺点是 Argon2 需要更多内存,这是抵御 GPU 攻击的要求。Keycloak 中 Argon2 的默认值每个哈希请求需要 7MB。为了防止过多的内存和 CPU 使用,Argon2 并行计算哈希默认限制为 JVM 可用的核心数。为了支持 Argon2 的内存密集型特性,我们将默认 GC 从 ParallelGC 更新为 G1GC,以获得更好的堆利用率。

新的主机名选项

为了解决先前主机名配置设置的复杂性和缺乏直观性的问题,我们很自豪地推出 Hostname v2 选项。

我们听取了您的反馈,解决了棘手的问题,并创建了更流畅的主机名配置管理体验。请注意,即使这些选项背后的行为也已更改,并且需要您注意 - 如果您正在处理自定义主机名设置。

Hostname v2 选项默认受支持,因为旧的主机名选项已弃用,并将在后续版本中移除。您应尽快迁移到这些选项。

新选项默认激活,因此 Keycloak 将无法识别旧选项。

有关如何迁移的信息,请参阅 升级指南

持久用户会话

以前版本的 Keycloak 仅将离线用户会话和离线客户端会话存储在数据库中。新功能 persistent-user-session 不仅将在线用户会话和在线客户端会话存储在内存中,还存储在数据库中。即使所有 Keycloak 实例都重新启动或升级,这也将允许用户保持登录状态。

此功能是一项预览功能,默认情况下处于禁用状态。要使用它,请将以下内容添加到您的构建命令中

bin/kc.sh build --features=persistent-user-session ...

有关更多详细信息,请参阅 启用和禁用功能 指南。容量调整指南 包含一个新的段落,描述了启用此功能后更新的资源需求。

有关如何升级的信息,请参阅 升级指南

Cookies 更新

为所有 cookies 设置 SameSite 属性

以下 cookies 过去未设置 SameSite 属性,这在最新的浏览器版本中导致它们默认为 SameSite=Lax

  • KC_STATE_CHECKER 现在设置 SameSite=Strict

  • KC_RESTART 现在设置 SameSite=None

  • KEYCLOAK_LOCALE 现在设置 SameSite=None

  • KEYCLOAK_REMEMBER_ME 现在设置 SameSite=None

默认值 SameSite=Lax 会导致基于 POST 绑定的问题,主要适用于 SAML,但也用于某些 OpenID Connect / OAuth 2.0 流程。

cookie KC_AUTH_STATE 已移除,Keycloak 服务器不再设置它,因为服务器不再需要此 cookie。

以下用于设置自定义 cookie 的 API 已被移除

  • ServerCookie - 由 NewCookie.Builder 替换

  • LocaleSelectorProvider.KEYCLOAK_LOCALE - 由 CookieType.LOCALE 替换

  • HttpCookie - 由 NewCookie.Builder 替换

  • HttpResponse.setCookieIfAbsent(HttpCookie cookie) - 由 HttpResponse.setCookieIfAbsent(NewCookie cookie) 替换

解决了已过期身份验证会话的“您已登录”问题

Keycloak 23 版本改进了用户在多个浏览器选项卡中并行进行身份验证的情况。但是,此改进未解决身份验证会话过期的情况。现在,对于用户已在一个浏览器选项卡中登录,而另一个浏览器选项卡中的身份验证会话过期的情况,Keycloak 能够使用 OIDC/SAML 错误重定向回客户端应用程序,以便客户端应用程序可以立即重试身份验证,由于 SSO 会话,这通常应自动登录应用程序。有关更多详细信息,请参阅 服务器管理指南身份验证会话

轻量级访问令牌变得更轻量级

在以前的版本中,添加了对轻量级访问令牌的支持。在此版本中,我们设法从轻量级访问令牌中移除了更多内置声明。这些声明由协议映射器添加。其中一些甚至影响常规访问令牌或 ID 令牌,因为它们并非 OIDC 规范严格要求。

  • 声明 subauth_time 现在由协议映射器添加,这些映射器在新的客户端作用域 basic 上默认配置,该作用域会自动添加到所有客户端。这些声明仍然像以前一样添加到 ID 令牌和访问令牌,但不添加到轻量级访问令牌。

  • 声明 nonce 现在仅添加到 ID 令牌。它不会添加到常规访问令牌或轻量级访问令牌。为了向后兼容,您可以通过协议映射器将此声明添加到访问令牌,这需要显式配置。

  • 声明 session_state 现在未添加到任何令牌。如果需要,仍然可以通过协议映射器添加它。规范仍然支持另一个专用声明 sid,它在以前的版本中也可用,并且具有完全相同的值。

有关更多详细信息,请参阅 升级指南

支持令牌自省端点中的 application/jwt 媒体类型

调用令牌自省端点时,可以使用 HTTP 标头 Accept: application/jwt。当为特定客户端启用时,它会从令牌自省端点返回声明 jwt,其中包含完整的 JWT 访问令牌,这对于客户端调用自省端点使用轻量级访问令牌的情况尤其有用。感谢 Thomas Darimont 的贡献。

密码策略新增检查密码是否包含用户名

Keycloak 支持新的密码策略,允许您拒绝包含用户用户名的用户密码。

必需操作的改进

在管理控制台中,您现在可以在特定领域的必需操作选项卡中配置一些必需操作。目前,更新密码是唯一内置的可配置必需操作。它支持设置最大身份验证年龄,这是用户可以通过 kc_action 参数(例如,在账户控制台中更新密码时使用)更新其密码的最大时间,而无需重新身份验证。必需操作的排序也得到了改进。当身份验证期间存在多个必需操作时,所有操作将一起排序,无论这些操作是在身份验证期间设置的(例如,通过 kc_action 参数)还是由管理员手动添加到用户帐户的操作。感谢 Thomas DarimontDaniel Fesenmeyer 的贡献。

Passkeys 改进

添加了对 Passkeys 条件 UI 的支持。当启用 Passkeys 预览功能时,会有一个专用的身份验证器可用,这意味着您可以从可用 Passkeys 帐户列表中选择,并基于该帐户对用户进行身份验证。感谢 Takashi Norimatsu 的贡献。

SAML 的默认客户端配置文件

添加了用于保护 SAML 客户端的默认客户端配置文件。在管理控制台中浏览领域的客户端策略时,您会看到一个新的客户端配置文件 saml-security-profile。使用它时,将对 SAML 客户端应用安全最佳实践,例如强制签名、禁用 SAML 重定向绑定以及禁止通配符重定向 URL。

添加了新的身份验证器 Confirm override existing link。此身份验证器允许覆盖 Keycloak 用户的链接 IDP 用户名,该用户名之前已链接到不同的 IDP 身份。更多详细信息请参阅 服务器管理指南。感谢 Lex Cao 的贡献。

OpenID 可验证凭据颁发 - 实验性支持

正在进行对 OpenID 可验证凭据颁发 (OID4VCI) 支持的工作。目前,这仍在进行中,但正在逐步添加内容。Keycloak 可以充当 OID4VC 颁发者,并支持预授权代码流。支持 JWT-VC、SD-JWT-VC 和 VCDM 格式的可验证凭据。感谢 OAuth SIG 小组的成员的贡献和反馈,尤其感谢 Stefan WiedemannFrancis PouatchaTakashi NorimatsuYutaka Obuchi

按用户属性搜索不再区分大小写

按用户属性搜索用户时,Keycloak 不再强制使用小写比较来搜索用户属性名称。此更改的目标是通过使用 Keycloak 在用户属性表上的本机索引来加速搜索。如果您的数据库排序规则不区分大小写,则您的搜索结果将保持不变。如果您的数据库排序规则区分大小写,您可能会看到比以前更少的搜索结果。

授权客户端库中的破坏性修复

对于 keycloak-authz-client 库的用户,调用 AuthorizationResource.getPermissions(…​) 现在正确返回 List<Permission>

以前,即使方法声明声明了 List<Permission>,它也会在运行时返回 List<Map>

此修复程序将破坏依赖于将 List 或其内容强制转换为 List<Map> 的代码。如果您在任何情况下使用过此方法,您很可能这样做过并且会受到影响。

导出客户端的授权设置时不再设置 ID

导出客户端的授权设置时,不再设置资源、作用域和策略的 ID。因此,您现在可以将一个客户端的设置导入到另一个客户端。

用于指标和健康检查端点的管理端口

指标和健康检查端点不再通过标准 Keycloak 服务器端口访问。由于这些端点应从外部世界隐藏,因此可以在单独的默认管理端口 9000 上访问它们。

它允许不将其作为 Kubernetes 环境中的标准 Keycloak 端点向用户公开。新的管理界面提供了一组新的选项,并且是完全可配置的。

Keycloak Operator 假定管理界面默认处于启用状态。有关更多详细信息,请参阅 配置管理界面

用于远程日志记录的 Syslog

Keycloak 现在支持用于远程日志记录的 Syslog 协议。它利用 RFC 5424 中定义的协议。默认情况下,syslog 处理程序处于禁用状态,但启用后,它会将所有日志事件发送到远程 syslog 服务器。

有关更多信息,请参阅 配置日志记录 指南。

EnvironmentDependentProviderFactory 类的更改

方法 EnvironmentDependentProviderFactory.isSupported() 已弃用多个版本,现在已被移除。

有关更多详细信息,请参阅 升级指南

所有缓存选项均为运行时选项

现在可以在运行时指定 cachecache-stackcache-config-file 选项。这消除了由于它们而执行构建阶段和重建映像的需要。

有关更多详细信息,请参阅 升级指南

高可用性指南已增强

高可用性指南现在包含有关如何配置 AWS Lambda 以防止从备份站点到主站点的预期自动故障恢复的指南。

从 AccessToken、IDToken 和 JsonWebToken 类中移除已弃用的方法

在此版本中,我们最终从以下类中移除了已弃用的方法

  • AccessToken

  • IDToken

  • JsonWebToken

有关更多详细信息,请参阅 升级指南

方法 getExp 已添加到 SingleUseObjectKeyModel

由于从 AccessTokenIDTokenJsonWebToken 中移除了已弃用的方法,SingleUseObjectKeyModel 也发生了更改,以保持与到期值相关的方法名称的一致性。

有关更多详细信息,请参阅 升级指南

支持 PostgreSQL 16

受支持和测试的数据库现在包括 PostgreSQL 16。

引入对客户身份和访问管理 (CIAM) 和多租户的支持

在此版本中,我们以技术预览功能的形式交付 Keycloak 组织。

此功能为领域提供了一些核心 CIAM 功能,这将作为未来更多功能的基础,以解决企业对企业 (B2B) 和企业对企业对客户 (B2B2C) 用例。

在功能方面,该功能已完成。但是,我们仍需努力使其在下一个主要版本中获得完全支持。剩余的工作主要是为生产部署准备该功能,重点是可伸缩性。此外,根据我们在下一个主要版本之前收到的反馈,我们最终可能会接受其他功能并为该功能增加更多价值,而不会影响其路线图。

有关更多详细信息,请参阅 服务器管理指南

升级

在升级之前,请参阅 迁移指南,获取完整的更改列表。

所有已解决的问题

新功能

增强

错误