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

Django2.2迁移至Azure SQL后无法读取数据库session数据问题

问题原因

  1. 核心原因是Django 2.2.x版本默认SESSION_COOKIE_SAMESITE = 'Lax',如果你的Azure AD回调使用form_post响应模式,该请求属于跨站点POST请求,按照浏览器SameSite规则,跨站POST请求不会携带SameSite=Lax的Cookie,导致Django无法识别原有会话,因此session为空、session_key为None。
  2. 次要可能原因:
    • 站点启用HTTPS但未配置SESSION_COOKIE_SECURE = True,或者配置了SESSION_COOKIE_SECURE = True但站点仍使用HTTP访问,导致浏览器不存储sessionid Cookie
    • Azure AD配置的回调域名与站点实际访问域名不一致(协议、域名、端口任意一项不匹配),Cookie无法跨域名携带
    • 错误配置了SESSION_COOKIE_DOMAIN,导致Cookie作用域不匹配当前站点

可行解决方案

  1. 调整Session Cookie配置(生产环境优先方案)
    在settings.py中增加以下配置:
# 允许跨站请求携带Cookie,适配form_post回调模式
SESSION_COOKIE_SAMESITE = 'None'
# SameSite=None必须配套开启Secure,要求站点使用HTTPS访问
SESSION_COOKIE_SECURE = True
# 可选:如果需要跨子域名共享Session可正确配置,无需求可以删除
# SESSION_COOKIE_DOMAIN = '.yourdomain.com'
  1. 回调模式兼容方案(本地开发HTTP场景用)
    如果是本地开发环境无法使用HTTPS,可将Azure AD的响应模式改为fragment,该模式下回调为GET请求,适配SameSite=Lax规则,无需修改SESSION_COOKIE_SAMESITE配置,注意fragment模式的参数在URL哈希中,需要前端提取后再传给后端complete接口。
  2. 域名一致性校验
    检查Azure AD后台配置的回调地址,与AZURE_AD_REDIRECT_URI配置、站点实际访问的地址三者完全一致,包含协议(HTTP/HTTPS)、域名、端口所有部分。

验证方法

可以通过浏览器开发者工具排查:

  • 访问sso/login接口时,检查响应头的Set-Cookie字段是否存在sessionid
  • 跳转回sso/complete接口时,检查请求头的Cookie字段是否携带了之前返回的sessionid,如果没有携带则说明是Cookie规则问题,按上述方案调整即可

内容的提问来源于stack exchange,提问作者Matthias Güntert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:24:03