使用django-microsoft-auth对接Azure AD SSO出现AADSTS90102错误如何解决
问题成因
- 反向代理链路(NGINX → uvicorn)传递的
X-Forwarded-Proto请求头存在重复值:请求经过NGINX转发时,若未主动清理客户端传入的同名头,新增的协议值会和原始值通过逗号拼接为https,https - django-microsoft-auth 2.4.0版本生成重定向URI时,直接读取了该拼接后的异常协议值作为URI前缀,最终生成
https,https://example.org/microsoft/auth-callback/格式的非法重定向地址,触发Azure接口校验报错。
解决办法
1. 修正NGINX反向代理配置
在站点的NGINX配置块的location /段强制覆盖转发头,避免继承客户端传入的非法头导致值拼接:
location / { proxy_pass http://127.0.0.1:8000; # 替换为你实际的uvicorn监听地址 proxy_set_header Host $host; # 强制设置协议头,不继承原始请求的X-Forwarded-Proto值 proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; # 清空客户端传入的X-Forwarded-Host头,防止伪造或拼接 proxy_set_header X-Forwarded-Host ""; }
修改后执行nginx -s reload重载配置生效。
2. 修正Django配置
在项目settings.py中添加以下配置,让Django信任反向代理传递的头信息:
# 配置SSL协议头校验规则 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 允许读取反向代理传递的Host头 USE_X_FORWARDED_HOST = True
3. 修正uvicorn启动参数
启动uvicorn时添加允许转发IP的配置,避免uvicorn忽略NGINX传递的代理头:
uvicorn 你的项目名.asgi:application --forwarded-allow-ips="*"
若使用systemd等托管服务,将上述参数添加到启动命令中即可。
备选兼容方案
若以上配置后问题仍未解决,可在settings.py中硬编码指定重定向地址,覆盖库的自动生成逻辑:
MICROSOFT_AUTH_REDIRECT_URI = "https://example.org/microsoft/auth-callback/"
内容的提问来源于stack exchange,提问作者Bernard
相关产品推荐
相关产品推荐

