PAYATHON 2026

SSIS 如何通过 OData 或 ADO.NET 连接 Dataverse 并配置 Entra 认证?

数据阿明

结论

将 client ID 和 client secret 填入题目中 SSIS 内置 OData connection manager 的用户名和密码框,无法完成 Dataverse 所需的应用 OAuth 认证。Microsoft 文档说明,该连接管理器目前不支持 Modern authentication。官方说明

对于无人值守的 SSIS 作业,可以复用已经成功的 .NET OAuth 代码,通过 Script Component、Script Task 或外部程序调用 Dataverse Web API。也可以选用明确支持 Dataverse 应用认证的连接器。

ADO.NET 是另一条可以单独验证的路径。Dataverse 提供只读的 TDS endpoint,但 SSIS 能否使用所需的认证方式,还取决于实际加载的 SqlClient provider 及其版本。Entra Password 接收的是 Entra 用户账号和密码,不能填入应用的 client ID 和 client secret。

为什么现有 OData 认证选项失败?

用户名和密码输入框看起来相同,使用的认证协议却可能不同。

  • Basic Authentication 不会自动执行 OAuth client credentials 流程,也不会获取 Bearer token。
  • Microsoft Dynamics CRM Online 和 Microsoft Dynamics AX Online 的名称,不能证明它们支持自定义应用的 client ID、证书或 client secret。
  • Microsoft Online Services 不能作为 Dynamics CRM Online 的通用认证入口,官方文档明确排除了这种用法。连接管理器认证限制

给 client ID 添加 @mytenant.com 后缀,不会把应用身份变成用户身份。调试时发现内部调用了 Entra 相关代码,也不能据此推断组件支持所需的应用认证流程;没有必要依赖修改那些硬编码 GUID 来解决问题。

Microsoft.SharePoint.Client.Runtime 加载失败,说明该次执行遇到了程序集依赖问题。即使补齐依赖,也不能据此认定这条认证路径能够访问 Dataverse。

方案一:在 SSIS 中复用 Web API OAuth 调用

这个方案最接近现有的成功代码。Dataverse Web API 要求 OAuth;无人值守应用可以使用与 Entra 应用绑定的 Dataverse application user,并通过 secret 或证书认证。Dataverse OAuth 文档

配置步骤

  1. 沿用已经验证可用的 Entra 应用注册、tenant ID 和凭据。
  2. 确认目标 Dataverse 环境中存在绑定该应用的 application user,并分配所需的表访问权限。拿到 token 不代表已经获得数据访问权限。
  3. 使用 MSAL 获取访问目标环境的 token,在 Web API 请求中发送 Authorization: Bearer <token>。
  4. 如果需要直接输出 SSIS 数据流行,使用 Script Component;如果先提取文件或写入暂存表,可以使用 Script Task,或由 SSIS 调用外部程序。

下面是一个独立的 C# 调用方法示例,需要引用 Microsoft.Identity.Client。参数由部署配置传入;environmentUrl 使用环境的组织根 URL,webApiRoot 使用题目给出的 Web API 根地址。对于 confidential client,scope 使用 <environment-url>/.default。scope 与应用用户配置

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Microsoft.Identity.Client;

public static async Task<string> ReadAccountsAsync(
    string tenantId,
    string clientId,
    string clientSecret,
    string environmentUrl,
    string webApiRoot)
{
    var app = ConfidentialClientApplicationBuilder
        .Create(clientId)
        .WithAuthority($"https://login.microsoftonline.com/{tenantId}")
        .WithClientSecret(clientSecret)
        .Build();

    var token = await app.AcquireTokenForClient(
        new[] { environmentUrl.TrimEnd('/') + "/.default" })
        .ExecuteAsync();

    using (var http = new HttpClient())
    using (var request = new HttpRequestMessage(
        HttpMethod.Get,
        webApiRoot.TrimEnd('/') +
        "/accounts?$select=accountid,name&$top=10"))
    {
        request.Headers.Authorization =
            new AuthenticationHeaderValue("Bearer", token.AccessToken);
        request.Headers.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));

        using (var response = await http.SendAsync(request))
        {
            response.EnsureSuccessStatusCode();
            return await response.Content.ReadAsStringAsync();
        }
    }
}

该示例只演示认证和一次读取,并非完整的 SSIS 数据源实现。实际提取时需要解析 JSON、处理分页链接 @odata.nextLink,并在长时间运行时重新获取 token。证书认证可以沿用现有的 .WithCertificate(...) 实现。

部署时,还要确认 SSIS 运行主机能够加载所需程序集,作业执行账号能够读取配置和证书私钥。不要将 secret 或 token 写入日志。

Web API endpoint 和 discovery endpoint 怎么选?

读取业务表时,应使用目标环境的 Web API endpoint,例如:

https://foobar.api.crm9.dynamics.com/api/data/v9.2/

discovery endpoint 用于发现环境信息,不能代替业务表的 OData 服务地址。换成 discovery URL 也无法解决认证方式不匹配的问题。

获取 token 时,优先保留现有 .NET 客户端中已验证成功的 authority 和资源配置,避免同时修改认证方式与目标资源。

方案二:通过 ADO.NET 访问 Dataverse TDS endpoint

Dataverse TDS endpoint 模拟 SQL 数据连接,只提供表数据的只读查询。使用它需要启用 TDS endpoint、具备相应的数据访问权限,并允许所需网络端口;它不提供直接修改 Dataverse 底层数据库的通道。Dataverse SQL 查询说明

连接服务器时,使用环境的组织主机名,例如:

<environment>.crm9.dynamics.com,5558

这里不填写 https://、/api/data/v9.2/ 或 discovery URL。请从实际环境配置中确认主机名,不要仅凭 Web API 地址猜测。

官方文档说明,TDS endpoint 仅支持 Microsoft Entra ID 认证;用户未配置 MFA 时可以使用 Entra Password。交互式连接成功,只能证明该客户端及其登录方式可用,不能证明 SSIS 使用相同的 provider 或认证流程。TDS 认证与连接排查

使用 ADO.NET connection manager 前,需要确认 provider 支持相应的连接字符串。以下内容只展示用户密码认证的字段含义,不能保证题目中的设计器可以正常加载:

Server=<environment>.crm9.dynamics.com,5558;
Authentication=Active Directory Password;
User ID=<user@mytenant.com>;
Password=<user-password>;
Encrypt=True;
TrustServerCertificate=False;

不要为了迁就定时作业而关闭 MFA。对于已有应用身份认证的场景,Web API 通常更容易延续现有配置。

Entra Password 和应用认证分别填什么?

认证方式用户名或 User ID密码或 Password适用条件
Active Directory PasswordEntra 用户的登录名,通常是 UPN该用户的密码用户密码流程,不能满足 MFA 要求
Active Directory Service Principal应用的 client IDclient secret 的值provider 与目标服务均支持应用认证
Active Directory Integrated通常不手工填写通常不手工填写使用当前身份,依赖域和 Entra 环境配置
Active Directory Interactive可选登录提示不填写需要用户交互,适合人工登录

这些认证模式各有不同。Entra Integrated 没有密码框是其工作方式的一部分,不能仅凭这一点判断它损坏;它也不会自动使用应用注册中的 secret。SqlClient Entra 认证说明

例如,对于已经配置 Entra 认证、且已授权该应用访问目标数据库的 Azure SQL,可以在支持的 Microsoft.Data.SqlClient 中使用:

Server=tcp:<server>.database.windows.net,1433;
Database=<database>;
Authentication=Active Directory Service Principal;
User ID=<client-id>;
Password=<client-secret-value>;
Encrypt=True;
TrustServerCertificate=False;

这是 Azure SQL 的应用认证示例,不能直接当作 Dataverse TDS 的可用配置。还需要核对目标服务支持的认证方式,以及 SSIS 实际加载的 provider、依赖和版本。ADO.NET connection manager 的能力取决于所选的 .NET provider。ADO.NET connection manager 配置说明

如何排查 Connection string property has not been initialized?

这条错误说明连接初始化过程没有获得有效的连接字符串。单凭它无法判断账号密码是否正确,也不足以确认是某个已知产品缺陷。

建议按以下顺序排查:

  1. 确认 SSIS 项目的目标版本、Visual Studio 的 SSIS 扩展版本,以及实际选择的是 System.Data.SqlClient 还是 Microsoft.Data.SqlClient。
  2. 检查 connection manager 的 ConnectionString 属性是否已保存,是否被表达式、项目参数或运行环境覆盖为空。
  3. 在与 SSIS 相同的运行环境中,使用相同 provider 和完整连接字符串创建最小 .NET 测试,确认能否执行 Open()。
  4. 如果独立程序成功而 SSIS 失败,再检查设计器、provider 加载和部署环境的差异。可以启用 SSIS 包级日志中的 Diagnostic 事件,观察连接管理器对 provider 的调用。官方诊断说明

现有材料没有提供版本和完整连接配置,无法确定该初始化错误的唯一原因。针对当前目标,可以优先复用已经成功的 .NET OAuth 调用,先完成无人值守的数据提取,再单独处理 ADO.NET 设计器问题。

备注:内容仅供参考。