Django2.2迁移至Azure SQL后无法读取数据库session数据问题
问题原因
- 核心原因是Django 2.2.x版本默认
SESSION_COOKIE_SAMESITE = 'Lax',如果你的Azure AD回调使用form_post响应模式,该请求属于跨站点POST请求,按照浏览器SameSite规则,跨站POST请求不会携带SameSite=Lax的Cookie,导致Django无法识别原有会话,因此session为空、session_key为None。 - 次要可能原因:
- 站点启用HTTPS但未配置
SESSION_COOKIE_SECURE = True,或者配置了SESSION_COOKIE_SECURE = True但站点仍使用HTTP访问,导致浏览器不存储sessionid Cookie - Azure AD配置的回调域名与站点实际访问域名不一致(协议、域名、端口任意一项不匹配),Cookie无法跨域名携带
- 错误配置了
SESSION_COOKIE_DOMAIN,导致Cookie作用域不匹配当前站点
- 站点启用HTTPS但未配置
可行解决方案
- 调整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'
- 回调模式兼容方案(本地开发HTTP场景用)
如果是本地开发环境无法使用HTTPS,可将Azure AD的响应模式改为fragment,该模式下回调为GET请求,适配SameSite=Lax规则,无需修改SESSION_COOKIE_SAMESITE配置,注意fragment模式的参数在URL哈希中,需要前端提取后再传给后端complete接口。 - 域名一致性校验
检查Azure AD后台配置的回调地址,与AZURE_AD_REDIRECT_URI配置、站点实际访问的地址三者完全一致,包含协议(HTTP/HTTPS)、域名、端口所有部分。
验证方法
可以通过浏览器开发者工具排查:
- 访问
sso/login接口时,检查响应头的Set-Cookie字段是否存在sessionid - 跳转回
sso/complete接口时,检查请求头的Cookie字段是否携带了之前返回的sessionid,如果没有携带则说明是Cookie规则问题,按上述方案调整即可
内容的提问来源于stack exchange,提问作者Matthias Güntert
相关产品推荐
相关产品推荐

