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

使用pyodbc访问带MFA的SSMS数据库时遇浏览器更新错误

解决Python通过Azure AD MFA连接SQL Server时的浏览器更新错误

可能的原因与解决方案

1. 升级ODBC驱动版本

ODBC Driver 17对Azure AD交互式认证的浏览器兼容性有限,建议升级到ODBC Driver 18 for SQL Server。新版本优化了认证流程的浏览器适配,能更好支持MFA验证环节。

2. 修正连接字符串参数

原连接字符串中UID字段为空会导致认证流程异常,修改时需:

  • 将你的Azure AD账号填入UID字段
  • 添加Prompt=Always参数强制触发完整认证流程

示例修改:

DRIVER = "ODBC Driver 18 for SQL Server"
SERVERNAME = "some.server.name.database.windows.net"
DB = "SOME_DB"
AAD_UID = "your_aad_account@domain.com"

connection_str = f'DRIVER={DRIVER};SERVER={SERVERNAME},1433;DATABASE={DB};UID={AAD_UID};Encrypt=yes;Authentication=ActiveDirectoryInteractive;TrustServerCertificate=no;Prompt=Always;'

3. 确认系统默认浏览器配置

认证弹窗依赖系统默认浏览器,需确保:

  • 默认浏览器为Chrome、Edge、Firefox等现代主流浏览器
  • 浏览器已更新至最新版本,避免因版本过低导致兼容性错误

4. 使用Azure Identity库替代原生交互式认证(推荐方案)

通过azure-identity库直接获取认证令牌,绕过浏览器兼容性问题,官方认证窗口会直接弹出MFA验证选项:

步骤1:安装依赖

pip install azure-identity pyodbc pandas

步骤2:修改代码

import pandas as pd
import pyodbc
from azure.identity import InteractiveBrowserCredential

DRIVER = "ODBC Driver 18 for SQL Server"
SERVERNAME = "some.server.name.database.windows.net"
DB = "SOME_DB"
AAD_ACCOUNT = "your_aad_account@domain.com"

# 初始化交互式凭证,指定账号提示
credential = InteractiveBrowserCredential(login_hint=AAD_ACCOUNT)
# 获取SQL Server的访问令牌
token = credential.get_token("https://database.windows.net/.default")

# 使用令牌建立连接
connection_str = f'DRIVER={DRIVER};SERVER={SERVERNAME},1433;DATABASE={DB};Encrypt=yes;TrustServerCertificate=no;'
cnxn = pyodbc.connect(
    connection_str,
    attrs_before={1256: bytes(token.token, "UTF-8")}  # 传递访问令牌
)

# 执行查询
query_string = '''select top(10) * from smth.other'''
df = pd.read_sql(query_string, cnxn)
print(df)

5. 检查系统环境兼容性

  • Windows用户:确保系统为Windows 10或更高版本,旧系统对Azure AD现代认证支持有限
  • Linux/macOS用户:确保图形界面环境正常运行,能正常弹出交互式认证窗口

内容的提问来源于stack exchange,提问作者Isaac A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:02:19