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

Python使用JWT令牌登录Azure SQL失败,寻求排查帮助

问题:使用JWT令牌通过SQLAlchemy连接Azure SQL时登录失败(错误18456)

尝试通过应用注册生成的JWT令牌,使用SQLAlchemy连接Azure SQL,始终触发以下错误:

[28000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user ''. (18456)

已执行的操作:

  • 创建应用注册test-app
  • 在数据库中执行权限配置:
    CREATE USER [test-app] FROM EXTERNAL PROVIDER;
    EXEC sp_addrolemember N'db_datareader', N'test-app';
    GRANT SELECT ON test_vw to [test-app];
    
  • 将test-app添加到SQL Server的Contributor和Reader角色
  • 配置IP白名单,可通过SSMS使用个人账号的"AAD Universal with MFA"登录
  • 通过以下请求生成JWT令牌:
    POST https://login.microsoftonline.com/9ff8761-1be4-4729-b88df-e421e19d92f/oauth2/v2.0/token HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    
    client_id=[client_id]
    client_secret=[client_secret]
    scope=https://database.windows.net/.default
    grant_type=client_credentials
    
  • 使用Python代码连接(代码见问题描述)

排查与修复要点

1. 验证JWT令牌的有效性

  • 解码令牌(可通过本地工具或jwt.io离线验证),检查aud字段必须为https://database.windows.net/,如果不符,说明请求令牌时的scope参数错误
  • 确认exp字段显示令牌未过期

2. 确认Azure SQL服务器已配置AAD管理员

必须在Azure门户的SQL服务器设置 > Active Directory管理员中指定AAD管理员账号,否则Azure AD服务主体(应用注册)无法登录数据库。即使个人MFA账号能登录,服务主体也依赖此配置。

3. 检查数据库用户映射

执行以下SQL语句,确认用户存在且类型正确:

SELECT name, type, type_desc FROM sys.database_principals WHERE name = 'test-app';

需确保type_desc为EXTERNAL_USER,且应用注册名称完全匹配(Azure AD对象名称大小写敏感)。

4. 修正令牌二进制格式处理

原代码中构造令牌二进制结构的方式错误,SQL Server期望UTF-16LE编码、双null结尾的字节流。替换令牌处理代码为:

SQL_COPT_SS_ACCESS_TOKEN = 1256
# 正确转换令牌为SQL Server要求的格式
token_bytes = jwt_token.encode('utf-16-le') + b'\x00\x00'
tokenstruct = struct.pack("<I", len(token_bytes)) + token_bytes

5. 优化ODBC连接参数

  • 确保使用最新版本的ODBC Driver 17 for SQL Server,旧版本对AAD令牌支持存在缺陷
  • 连接字符串中显式添加TrustServerCertificate=no,避免证书信任问题:
    params = urllib.parse.quote_plus(
        f"Driver={driver};Server={server};Database={database};Encrypt=yes;TrustServerCertificate=no"
    )
    

6. 移除不必要的RBAC角色

SQL Server的Contributor和Reader角色是管理层面权限,与数据库登录无关,建议移除这些角色,仅保留数据库层面的权限配置,避免权限逻辑混淆。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:55:49