Keycloak在IDP发起登录后出现“Cookie not found”错误求助
问题背景
我正在使用Keycloak 22.0.1配置从ServiceA到我的应用的IDP发起式认证,已完成ServiceA要求的所有必要配置,同时在Keycloak上配置了SAML身份提供商,并填入了从ServiceA获取的对应配置值。
问题现象
点击ServiceA门户上的应用图标后,流程正常启动,收到状态为Success的SAML响应,其Destination属性URL与ServiceA上配置的断言消费者服务端点值匹配,受众(Audience)也正常,但重定向到Keycloak后出现错误提示:
We are sorry... Cookie not found. Please make sure cookies are enabled in your browser.
相关日志与提示
- Keycloak日志:
type=IDENTITY_PROVIDER_LOGIN_ERROR, realmId=myrealm, clientId=null, userId=null, ipAddress=XX.XXX.XXX.XXX, error=cookie_not_found - Firefox开发者工具提示:
Cookie “KC_STATE_CHECKER” does not have a proper “SameSite” attribute value. Soon, cookies without the “SameSite” attribute or with an invalid value will be treated as “Lax”. This means that the cookie will no longer be sent in third-party contexts. If your application depends on this cookie being available in such contexts, please add the “SameSite=None” attribute to it.
已排查操作
- 反复核对ServiceA与Keycloak上的所有URL,甚至联系ServiceA支持获取SAML元数据描述符以避免手动复制错误;
- 开启Keycloak的DEBUG和TRACE日志,未发现有效信息;
- 尝试不同浏览器、隐身模式、清除Cookie等操作,问题依旧;
- 尝试移除Audience中的https://和路径,无改善;
- ServiceA支持确认我的配置正确,且SAML响应有效。
求助问题
- 为何Keycloak在此流程中无法找到KC_STATE_CHECKER Cookie?
- 如何确保Keycloak Cookie正确添加SameSite=None属性?
- Keycloak或ServiceA是否还需额外配置?
问题解答
1. KC_STATE_CHECKER Cookie无法找到的原因
核心原因是跨域场景下的Cookie SameSite属性限制。IDP发起式认证属于第三方上下文(从ServiceA页面跳转到Keycloak),Keycloak默认生成的KC_STATE_CHECKER Cookie未指定SameSite=None属性,现代浏览器会将未明确设置SameSite的Cookie默认视为Lax模式,该模式下Cookie不会在跨域跳转的请求中发送给Keycloak,导致Keycloak无法获取用于验证请求状态的Cookie,进而抛出cookie_not_found错误。
2. 为Keycloak Cookie添加SameSite=None属性
Keycloak 22.0.1无UI或REST API直接配置Cookie属性的选项,可通过以下两种方式设置:
- 启动参数方式:启动Keycloak时添加JVM参数:
注意:使用-Dkeycloak.cookie.same-site=NoneSameSite=None必须确保Keycloak运行在HTTPS环境下,因为该属性要求Cookie同时具备Secure属性,Keycloak在HTTPS环境中会自动为Cookie添加此属性。 - 配置文件方式:修改Keycloak安装目录
conf下的keycloak.conf文件,添加:
保存后重启Keycloak生效。cookie-same-site=none
3. 额外配置检查
- Keycloak端:
- 确认部署环境为HTTPS,否则浏览器会拒绝接受
SameSite=None的Cookie; - 检查SAML身份提供商的响应绑定设置,确保
Post Binding Response配置符合跨域场景需求;
- 确认部署环境为HTTPS,否则浏览器会拒绝接受
- ServiceA端:
- 确认SAML请求中的
RelayState参数正确传递,该参数用于维持认证流程状态,丢失可能导致Cookie验证失败; - 确保ServiceA配置的回调URL(即Keycloak的断言消费者服务端点)为HTTPS协议,且与Keycloak端配置完全一致。
- 确认SAML请求中的
内容的提问来源于stack exchange,提问作者Vujasinovic
相关产品推荐
相关产品推荐

