运行于IaaS的Django Web应用如何实现Azure AD身份认证
Django 应用接入 Azure AD 身份认证落地方案
一、Azure AD 租户侧前置配置
- 登录企业所属的Azure AD管理中心,新建应用注册:填写应用自定义名称,重定向URI选择「Web」类型,填写你的应用回调地址,格式为
https://<你的应用公网域名>/azure/callback/,本地调试阶段可以额外添加http://localhost:8000/azure/callback/作为测试回调地址。 - 应用注册完成后,复制三个核心参数留存:应用程序(客户端)ID、目录(租户)ID,后续Django配置需要用到。
- 进入应用的「证书和密码」页面,新建客户端密钥,根据企业安全要求设置过期时间,密钥生成后立刻复制保存,页面关闭后无法再次查看密钥值。
- 进入「API权限」页面,添加Microsoft Graph的委托权限
User.Read,配置完成后点击「授予管理员同意」,避免普通用户登录时弹出无意义的权限申请提示。 - 如果需要限制仅企业自有租户内的账号可登录,直接在应用「身份验证」页将「支持的账户类型」设置为「仅此组织目录中的账户」即可,无需额外写域名校验逻辑。
二、Django 应用侧改造
- 先安装适配依赖:执行
pip install django-auth-azure-ad,这个库完全适配Django原生认证体系,不用自己手写OAuth2全流程逻辑,减少出bug概率。 - 修改项目
settings.py配置:
生产环境不要把密钥类参数硬编码在代码里,通过服务器环境变量读取,避免代码泄露引发安全问题
INSTALLED_APPS = [ # 保留原有已配置的app 'azure_ad', ] # 保留原有ModelBackend,方便本地超级用户后台登录 AUTHENTICATION_BACKENDS = ( 'azure_ad.backends.AzureADBackend', 'django.contrib.auth.backends.ModelBackend', ) # 替换为你之前从Azure AD后台复制的对应参数 AZURE_AD_CLIENT_ID = "从Azure后台复制的客户端ID" AZURE_AD_CLIENT_SECRET = "生成的客户端密钥值" AZURE_AD_TENANT_ID = "从Azure后台复制的租户ID" # 登录成功后默认跳转的首页地址 LOGIN_REDIRECT_URL = "/" # 未登录访问受保护页面时,自动跳转到Azure AD登录入口 LOGIN_URL = "/azure/login/"
- 修改项目根路由文件
urls.py,加入Azure AD的认证路由:
from django.urls import path, include urlpatterns = [ # 保留原有业务路由 path('azure/', include('azure_ad.urls')), ]
- 业务视图的权限控制直接复用Django原生的
login_required装饰器即可,所有需要登录后才能访问的视图加上该装饰器后,用户未登录访问时会自动跳转至Azure AD登录页,认证通过后自动回跳至原访问页面。 - 用户首次通过Azure AD登录时,插件会自动在Django本地的
auth_user表创建对应用户,默认用户名为Azure AD内的用户邮箱。如果需要同步用户部门、岗位、权限组等额外信息,可以写一个信号接收器监听user_logged_in信号,调用Graph接口拉取对应字段同步到本地用户表即可。
三、IaaS 服务器侧适配
- 因为应用部署在自管IaaS服务器上,不需要额外做特殊网络打通,只要保证服务器出方向可以正常访问Azure AD的登录端点、Microsoft Graph接口即可,入方向仅需要开放应用Web服务端口给终端用户访问。
- 如果IaaS服务器前挂了Nginx等反向代理,记得在反向代理配置中添加HTTPS头透传,避免回调时出现HTTP/HTTPS协议不匹配的报错,Nginx对应配置参考:
proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Host $host;
- 生产环境必须给域名配置合法HTTPS证书,Azure AD的OAuth2认证流程不接受HTTP协议的回调地址(本地localhost调试除外)。
四、效果验证
- 配置部署完成后,直接访问任意加了登录校验的业务页面,会自动跳转至企业Azure AD统一登录页。
- 用户输入企业域账号完成校验后,会自动回跳至原访问的业务页面,全程不需要应用侧处理密码校验逻辑,认证有效性完全由Azure AD保障。
- 如果需要做细粒度权限控制(比如仅特定部门、特定用户组可以访问某些模块),可以在登录回调环节拉取用户的Azure AD组信息,同步到Django原生权限体系中,后续视图直接复用Django原生的权限判断逻辑即可。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

