You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keycloak 25.x.x迁移后登录失败:未发送KC_RESTART Cookie

Keycloak 25.x.x迁移后登录失败:KC_RESTART Cookie未发送/保存

原使用Keycloak 20.0.5版本,搭配以下配置可正常运行:

Dockerfile

FROM quay.io/keycloak/keycloak:25.0.0 as builder
WORKDIR /opt/keycloak
FROM quay.io/keycloak/keycloak:25.0.0
COPY --from=builder /opt/keycloak/ /opt/keycloak/
RUN mkdir -p /opt/keycloak/themes/custom_theme
COPY ./custom_theme /opt/keycloak/themes/custom_theme
COPY ./sds-sms-authenticator-0.0.16.jar /opt/keycloak/providers/custom_provider.jar
RUN /opt/keycloak/bin/kc.sh build
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]

K8s部署环境变量

env:
- name: KEYCLOAK_ADMIN
  value: admin
- name: KEYCLOAK_ADMIN_PASSWORD
  value: admin_password
- name: KC_PROXY
  value: edge
- name: KC_DB
  value: postgres
- name: KC_DB_URL
  value: jdbc:postgresql://sample.rds.amazonaws.com/sample_dev
- name: KC_DB_SCHEMA
  value: keycloak
- name: KC_DB_USERNAME
  value: db_app_user
- name: KC_DB_PASSWORD
  value: db_password
- name: KC_HEALTH_ENABLED
  value: "true"
- name: KC_METRICS_ENABLED
  value: "true"
- name: KC_HTTP_RELATIVE_PATH
  value: /my-keycloak-service/

公网Ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  creationTimestamp: "2024-07-11T07:25:56Z"
  generation: 3
  name: my-keycloak-public-ingress
  namespace: my
  resourceVersion: "200565111"
  uid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
spec:
  ingressClassName: public-nginx
  rules:
  - host: xxx.ap-southeast-1.elb.amazonaws.com
    http:
      paths:
      - backend:
          service:
            name: my-keycloak-service
            port:
              number: 8080
        path: /my-keycloak-service(/|$)(.*)
        pathType: Prefix
status:
  loadBalancer:
    ingress:
    - ip: xx.xxx.xx.xxx

问题现象

迁移至Keycloak 25.x.x版本后,本地运行正常,但输入管理员登录凭证后出现错误页面。排查发现请求http://xxx.ap-southeast-1.elb.amazonaws.com/my-keycloak-service/realms/master/login-actions/authenticate未携带KC_RESTART Cookie。

已尝试操作

在Dockerfile中添加以下环境变量,但问题未解决:

ENV KC_HOSTNAME_STRICT=false
ENV KC_HOSTNAME_STRICT_HTTPS=true
ENV KC_HTTP_ENABLED=false

更新信息

通过浏览器调试发现:输入用户凭证前,浏览器从http://xxx.ap-southeast-1.elb.amazonaws.com/sales-and-distribution-keycloak-service/realms/master/protocol/openid-connect/auth的响应中收到了Cookie,但未保存该Cookie。

解决方案/排查指导

  1. 检查Cookie的SameSite属性:Keycloak 25.x可能调整了Cookie的SameSite默认值,若Ingress使用HTTP(非HTTPS),SameSite=Strict或Lax可能导致Cookie不被保存。可添加环境变量KC_SPI_SESSION_COOKIE_SAME_SITE=Lax测试,若使用HTTPS则可设置为None。
  2. 验证路径匹配一致性:当前Ingress路径规则为/my-keycloak-service(/|$)(.*),而KC_HTTP_RELATIVE_PATH是/my-keycloak-service/,末尾斜杠可能导致Cookie的Path属性不匹配。尝试将KC_HTTP_RELATIVE_PATH改为/my-keycloak-service(去掉末尾斜杠),或调整Ingress路径规则。
  3. 修正HTTPS与Cookie Secure属性冲突:当前公网访问为HTTP,但KC_HOSTNAME_STRICT_HTTPS=true会让Keycloak生成带Secure属性的Cookie,HTTP环境下浏览器会拒绝保存。需:
    • 要么将ELB配置为HTTPS终止,确保公网访问为HTTPS;
    • 要么设置KC_HOSTNAME_STRICT_HTTPS=false和KC_SPI_SESSION_COOKIE_SECURE=false(仅适用于测试或非生产环境)。
  4. 清理浏览器缓存与Cookie:旧版本Keycloak的Cookie可能与新版本冲突,强制清理后重新测试。
  5. 排除自定义主题影响:切换回Keycloak默认主题测试,若恢复正常则说明自定义主题存在Cookie处理逻辑问题。
  6. 完善代理头传递配置:Edge模式下Keycloak依赖代理传递的X-Forwarded-*头,需在Ingress中添加注解确保Nginx正确传递:
    annotations:
      nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
      nginx.ingress.kubernetes.io/x-forwarded-proto: "http" # 若使用HTTPS则改为https
      nginx.ingress.kubernetes.io/x-forwarded-host: "xxx.ap-southeast-1.elb.amazonaws.com"
    

内容的提问来源于stack exchange,提问作者iuhettiarachchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:07:32