Keycloak配置Identity Provider记住我时如何固定会话过期时间
问题根因
Keycloak默认对SSO会话采用滑动过期逻辑:只要用户携带未失效的会话再次触发认证流程(包括从外部身份提供商
可落地方案
根据你需要的生效范围,可以选以下三种实现方式:
全局绝对过期配置(无代码,适合全Realm统一规则的场景)
- 进入目标Realm的设置页,打开
Sessions配置标签 - 将
SSO Session Max设置为你需要的首次登录后固定有效时长,例如8小时 - 将
SSO Session Idle(空闲超时)参数设置为和SSO Session Max完全相同的值,同时关闭Remember Me相关的空闲续期选项 - 配置生效后,所有会话无论期间是否有访问,最长有效期都为首次登录后设定的固定时长,到点自动强制失效,不会被任何访问动作续期。该方案会作用于Realm下所有客户端、所有登录方式,无法单独对二维码IDP场景生效。
- 进入目标Realm的设置页,打开
认证流程条件控制(无代码,适合仅IDP场景生效的需求)
- 进入目标Realm的
Authentication配置页,找到当前二维码IDP绑定的Post Login认证流 - 在流程的Cookie身份验证节点前新增条件判断节点,规则配置为:当请求携带IDP回跳特征参数(如
kc_idp_hint、IDP回跳专属state标识)且当前已存在有效用户会话时,直接跳过后续的会话更新步骤,仅完成认证放行 - 调整后普通账号密码登录的会话仍保持默认滑动续期逻辑,只有从IDP回跳的已登录请求不会触发会话时间刷新。
- 进入目标Realm的
自定义SPI精准控制(轻量开发,适合精细化规则场景)
- 开发一个极简Keycloak SPI扩展,实现
SessionRefreshManager接口,重写refreshSession方法 - 在方法内增加判断逻辑:如果当前会话的认证来源为你配置的二维码IDP,直接返回
false阻断会话续期动作;其余来源的会话保持默认滑动续期逻辑 - 将扩展打包为jar包放入Keycloak的
providers目录,重启服务加载扩展即可生效。该方案不会改动任何默认逻辑,仅针对指定IDP的场景生效,是适配性最好的方案。
- 开发一个极简Keycloak SPI扩展,实现
注意:如果你的业务应用侧维护了独立于Keycloak的本地会话,需要同步调整应用侧的会话过期策略和Keycloak侧规则对齐,避免出现两边会话状态不一致的问题。
内容的提问来源于stack exchange,提问作者Marcos Pupo
相关产品推荐
相关产品推荐

