在AWS ALB上部署的Django应用集成Azure AD认证时重定向URI不匹配问题
看起来你遇到的是AWS ALB终止HTTPS后,后端Django应用无法正确识别请求协议导致的重定向URI不匹配问题,我来帮你梳理下原因和解决办法:
问题根源
AWS ALB作为SSL终止点,会将外部的HTTPS请求转换成HTTP转发给你的Django应用。而Django默认会根据自身接收到的请求协议生成回调URI,所以它会输出http://myhost/oauth2/callback,这就和你在Azure里配置的HTTPS版本不匹配,触发了AADSTS50011错误。
具体解决步骤
配置Django信任ALB的转发头
在你的Djangosettings.py中添加以下配置,让Django从ALB传递的X-Forwarded-Proto头里获取真实的请求协议:SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')同时更新
CSRF_TRUSTED_ORIGINS,确保它包含HTTPS前缀的域名:CSRF_TRUSTED_ORIGINS = ['https://myhost']这样Django就能正确识别出请求是通过HTTPS进来的,生成的回调URI也会是HTTPS版本。
确认ALB的转发头设置
检查你的AWS ALB目标组,确保它在转发请求时保留了X-Forwarded-Proto、X-Forwarded-For这些默认头。AWS ALB默认会自动添加这些头,但如果有自定义的请求头规则,不要把它们移除。验证回调URI生成
可以临时开启DEBUG = True(注意生产环境用完要改回去),访问https://myhost/oauth2/login,查看跳转至Azure认证页面的URL中,redirect_uri参数是否已经变成https://myhost/oauth2/callback。如果已经正确显示,说明配置生效了。额外检查项
- 再次确认Azure应用注册中的重定向URI是
https://myhost/oauth2/callback,没有拼写错误(比如多/少斜杠、域名错误)。 - 确保你的
ALLOWED_HOSTS配置正确,已经包含myhost。
- 再次确认Azure应用注册中的重定向URI是
总结
核心就是让Django通过ALB传递的转发头识别真实的请求协议,这样生成的回调URI就能和Azure里配置的保持一致,解决不匹配的问题。
备注:内容来源于stack exchange,提问作者roshan

