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

使用托管身份连接Azure SQL数据库遇登录失败,求排查遗漏配置

使用托管身份连接Azure SQL数据库时遇到登录失败问题,求排查遗漏配置

com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user ''

环境信息

  • Java 17
  • SQL Driver 9.4.1.jre8

连接字符串

jdbc:sqlserver://host:1433;encrypt=true;databaseName=simple;trustServerCertificate=false;loginTimeout=30;hostNameInCertificate=*.database.windows.net;authentication=ActiveDirectoryMSI;msiClientId=[Client id of the managed Identity myinstance];

已完成的配置

我已为Azure SQL服务器启用Azure AD,为VM开启系统分配身份,并在用户分配选项卡中添加了托管身份。

在Azure SQL中,我通过以下语句添加了以虚拟机名称(testMSSQL)和托管身份名称(myinstance)命名的用户:

CREATE USER testMSSQL FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER testMSSQL;

CREATE USER myinstance FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER myinstance;

Azure SQL服务器AD管理员配置
VM托管身份配置


可能遗漏的配置排查

  1. 驱动版本兼容性问题
    你用的SQL Driver 9.4.1.jre8是适配JRE8的版本,但当前运行环境是Java 17,版本不匹配可能导致身份验证逻辑异常。建议更换为适配Java 17的驱动版本(比如mssql-jdbc 12.x及以上)。

  2. MSI客户端ID配置错误
    检查连接字符串里的msiClientId是否填的是用户分配托管身份的真实Client ID(不是名称),要从Azure门户托管身份详情页复制准确值,别留括号之类的多余字符。

  3. 缺少服务器级登录配置
    你只在数据库层面创建了用户,但托管身份需要先在SQL服务器级别创建登录,才能关联数据库用户。执行以下SQL(替换为托管身份的对象ID/Client ID):

    -- 为用户分配身份创建服务器登录
    CREATE LOGIN [myinstance] FROM EXTERNAL PROVIDER WITH SID = '<托管身份对象ID>', TYPE = E;
    -- 为系统分配身份创建服务器登录
    CREATE LOGIN [testMSSQL] FROM EXTERNAL PROVIDER;
    
  4. 托管身份缺少SQL访问权限
    到Azure门户的SQL服务器IAM页面,给对应的托管身份添加SQL DB Contributor或Reader权限,确保身份能获取到有效的访问令牌。

  5. 冗余连接参数清理
    连接字符串里重复写了encrypt=true,虽然不影响功能,但建议删掉冗余项,避免配置混乱。

  6. 防火墙与AD管理员验证
    确认SQL服务器防火墙规则允许VM的IP访问;同时检查AD管理员是否配置正确(从截图看已设置,可二次验证管理员权限)。

内容的提问来源于stack exchange,提问作者D.T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:24:57