SSIS包使用Active Directory Service Principal报authentication键值无效
问题根因
你当前使用的System.Data.SqlClient库不支持连接字符串中Authentication参数的Active Directory Service Principal枚举值,该参数属于Microsoft.Data.SqlClient、高版本ODBC/OLEDB驱动的支持特性,在.NET Framework 4.7配套的原生System.Data.SqlClient中无法被识别,因此抛出参数无效报错。
可行解决方案
方案一:替换驱动库(改动最小)
- 在脚本任务的项目中通过NuGet安装兼容.NET Framework 4.7的
Microsoft.Data.SqlClient稳定版包(推荐2.1及以上版本) - 将脚本中所有引用
System.Data.SqlClient的命名空间替换为Microsoft.Data.SqlClient - 调整连接字符串,去掉
Authentication参数值两端的引号即可,调整后示例:
Server=tcp:servername.database.windows.net,1433; Initial Catalog=DBName;Persist Security Info=False; User ID=clientid;Password=secrets; Authentication=Active Directory Service Principal; MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;
原有数据操作逻辑无需修改,直接运行即可。
方案二:保留System.Data.SqlClient,手动获取访问令牌
如果不想替换现有依赖库,可以改用手动获取Azure AD令牌的方式完成身份验证:
- 删除连接字符串中的
Authentication、User ID、Password三个参数,调整为基础连接字符串:
Server=tcp:servername.database.windows.net,1433;Initial Catalog=DBName;Persist Security Info=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;
- 在脚本任务中安装
Microsoft.Identity.ClientNuGet包,编写代码获取访问令牌后传入数据库连接,示例逻辑:
using Microsoft.Identity.Client; using System.Data.SqlClient; // 构造机密客户端 var confidentialClient = ConfidentialClientApplicationBuilder .Create("你的服务主体客户端ID") .WithClientSecret("你的服务主体密钥") .WithTenantId("你的Azure AD租户ID") .Build(); // 请求Azure SQL访问令牌 var tokenResult = await confidentialClient .AcquireTokenForClient(new string[] { "https://database.windows.net/.default" }) .ExecuteAsync(); // 打开连接时传入令牌 using (var sqlConn = new SqlConnection(调整后的基础连接字符串)) { sqlConn.AccessToken = tokenResult.AccessToken; sqlConn.Open(); // 原有数据操作逻辑保持不变 }
注意事项
- 两种方案都需要提前确认所用服务主体已被授予目标Azure SQL数据库的对应操作权限
- 部署SSIS包到生产环境运行时,需要确保运行节点已安装对应依赖,或者将依赖包设置为随脚本任务程序集一同发布。
内容的提问来源于stack exchange,提问作者user3934763
相关产品推荐
相关产品推荐

