You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地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策略限制:

  1. 在Azure AD中完成新应用注册,记录应用(客户端)ID、租户ID,生成客户端密钥并记录密钥值
  2. 用管理员账号连接SQL托管实例,执行SQL给服务主体授权:
CREATE USER [应用注册显示名称] FROM EXTERNAL PROVIDER;
ALTER ROLE db_owner ADD MEMBER [应用注册显示名称]; -- 根据实际需求分配最小权限即可
  1. 修改配置如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:51:30