本地Django连接Azure AD认证的Azure SQL托管实例认证失败
报错根因
错误码AADSTS50076指向核心原因:当前使用的Azure AD账号已被管理员配置强制多因素认证(MFA),配置中使用的Authentication=ActiveDirectoryPassword属于非交互认证模式,仅支持账号+密码的纯凭据验证,不支持MFA交互流程。SSMS能正常连接是因为其默认调用交互式认证流程,会自动弹出MFA验证窗口,而pyodbc的密码认证模式不会触发该流程,必然认证失败。
本地开发场景可行方案
方案1:交互式Azure AD认证(优先选,无需调整账号权限)
该模式首次连接时会自动弹出微软登录窗口完成MFA验证,凭证会缓存到本地,后续开发无需重复验证,适配绝大多数本地开发场景。
首先调整依赖:
- 确保本地安装的ODBC Driver for SQL Server版本不低于17.1,推荐升级到最新稳定版
- 卸载已停止维护的旧驱动包
django-pyodbc-azure,更换为官方维护的mssql-django:
pip uninstall -y django-pyodbc-azure pip install mssql-django pyodbc
修改settings.py数据库配置,注意引擎字段同步替换:
DATABASES = { 'default': { 'ENGINE': 'mssql', 'NAME': '目标数据库名', # 直接填库名,不需要拼接实例前缀 'USER': 'xxxx.xxxx@xxxx.com', 'HOST': 'XXX.public.XXXX.database.windows.net', # 不需要加tcp:前缀 'PORT': '3342', 'OPTIONS': { 'driver': 'ODBC Driver 17 for SQL Server', 'authentication': 'ActiveDirectoryInteractive', 'Encrypt': 'yes', 'TrustServerCertificate': 'no', }, } }
首次执行数据库操作(比如python manage.py migrate)时会自动唤起浏览器完成Azure AD登录和MFA验证,验证通过后即可正常连接。
方案2:Azure CLI凭据复用(适合本地已安装Azure CLI的场景)
如果本地已经安装Azure CLI,且已执行az login完成账号登录和MFA验证,可以直接复用CLI缓存的凭据连接,不需要在配置里写账号密码,也不需要额外弹窗:
DATABASES = { 'default': { 'ENGINE': 'mssql', 'NAME': '目标数据库名', 'HOST': 'XXX.public.XXXX.database.windows.net', 'PORT': '3342', 'OPTIONS': { 'driver': 'ODBC Driver 17 for SQL Server', 'authentication': 'ActiveDirectoryAzureCli', 'Encrypt': 'yes', 'TrustServerCertificate': 'no', }, } }
只要Azure CLI保持登录状态,就能直接连通数据库。
方案3:服务主体认证(无交互,适合需要固定配置的场景)
如果不想做任何交互验证,可以在Azure AD中注册应用作为服务主体,给服务主体分配SQL托管实例的对应访问权限,用客户端ID和密钥连接,该模式不受个人账号MFA策略限制:
- 在Azure AD中完成新应用注册,记录应用(客户端)ID、租户ID,生成客户端密钥并记录密钥值
- 用管理员账号连接SQL托管实例,执行SQL给服务主体授权:
CREATE USER [应用注册显示名称] FROM EXTERNAL PROVIDER; ALTER ROLE db_owner ADD MEMBER [应用注册显示名称]; -- 根据实际需求分配最小权限即可
- 修改配置如下:
DATABASES = { 'default': { 'ENGINE': 'mssql', 'NAME': '目标数据库名', 'HOST': 'XXX.public.XXXX.database.windows.net', 'PORT': '3342', 'OPTIONS': { 'driver': 'ODBC Driver 17 for SQL Server', 'authentication': 'ActiveDirectoryServicePrincipal', 'user': f'{客户端ID}@{租户ID}', 'password': '客户端密钥值', 'Encrypt': 'yes', 'TrustServerCertificate': 'no', }, } }
避坑提示
- 不要继续尝试使用
ActiveDirectoryPassword模式,只要账号被强制MFA,该模式受Azure AD策略限制永远无法连通,没有绕开方法 - 旧包
django-pyodbc-azure已停止维护多年,对新版ODBC驱动的Azure AD认证模式支持不全,必须替换为mssql-django - 使用ODBC Driver 18及以上版本时,默认强制加密连接,不要随意开启
TrustServerCertificate=yes,避免中间人攻击风险。
内容的提问来源于stack exchange,提问作者Sabyasachi
相关产品推荐
相关产品推荐

