使用mssql包通过Microsoft Entra ID - 支持MFA的通用认证连接Azure Synapse时遇到问题求助
mssql包通过Microsoft Entra ID - 支持MFA的通用认证连接Azure Synapse时遇到问题求助
你好,从你的描述来看,核心问题是在无浏览器的服务器环境下,没法用交互式MFA来连接Azure Synapse,需要改用非交互式的Microsoft Entra ID(旧称Azure AD)认证方式,我来帮你梳理清楚问题和解决步骤:
先理清你之前尝试的问题出在哪
- Client ID的误解:你从Entra ID拿的用户主体名完全不对——Client ID应该是Entra应用注册的ID,不是用户账号的ID,这是你之前报错的核心原因之一。
- 认证方式选错了:
Active Directory Integrated是给已加入域的Windows机器用的集成认证,不适合无浏览器的服务器环境,这种方式会尝试用当前机器的Windows账号去认证,自然会出现“Login failed for user ''”的空用户错误。
正确的解决方案:用服务主体认证(无浏览器环境首选)
因为你的服务器没法做交互式MFA,最稳定的方式是创建一个Entra应用注册(也就是服务主体),用这个“虚拟账号”来连接Synapse,步骤如下:
1. 在Entra ID中创建应用注册
- 登录Entra ID控制台,进入「应用注册」→「新注册」
- 随便填个名称,选择「仅此组织目录中的帐户」(按你的权限范围选就行),重定向URI可以留空(因为是非交互式认证)
- 注册完成后,立刻记下应用程序(客户端) ID和目录(租户) ID
- 进入「证书和密码」→「客户端密码」→「新客户端密码」,设置有效期并保存生成的密码(这个只会显示一次,一定要存好)
2. 给服务主体分配Synapse权限
- 进入Azure Synapse工作区,在「管理」→「SQL管理员」里,把这个服务主体添加为Synapse管理员(或者按需分配更细的权限)
- 也可以直接在Synapse数据库里执行SQL,给服务主体分配数据库级权限:
CREATE USER [你的应用注册名称] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [你的应用注册名称]; -- 按需换成db_datawriter或其他角色
3. 配置正确的mssql连接字符串
用Active Directory Service Principal作为认证方式,示例如下:
"Server=xxxxxx.sql.azuresynapse.net;Database=JDMDW;Timeout=30;Max Pool Size=10;Min Pool Size=0;ConnectRetryInterval=2;Authentication=Active Directory Service Principal;Encrypt=true;TrustServerCertificate=false;TenantId=你的租户ID;ClientId=你的应用注册Client ID;ClientSecret=你的应用注册Client Secret"
其他可选方式(仅限非MFA用户)
如果你一定要用个人用户账号认证,只有当你的账号没有启用MFA时,才能用Active Directory Password方式,连接字符串示例:
"Server=xxxxxx.sql.azuresynapse.net;Database=JDMDW;Timeout=30;Max Pool Size=10;Min Pool Size=0;ConnectRetryInterval=2;Authentication=Active Directory Password;Encrypt=true;TrustServerCertificate=false;TenantId=你的租户ID;User Id=你的用户UPN;Password=你的用户密码"
但这种方式不支持MFA,所以还是服务主体的方案更适配你的服务器环境。
几个关键注意点
- 绝对不要同时设置
Integrated Security=true,这会和Entra认证方式冲突 TrustServerCertificate建议设为false,Azure Synapse的SSL证书是受信任的,没必要绕过验证- 确保你的服务器能访问
login.microsoftonline.com,不然Entra认证会直接失败
内容来源于stack exchange
相关产品推荐
相关产品推荐

