我正在使用 DevOps Pipelines 来运行我的 sql 单元测试。 这适用于 vstest 任务以及与 ActiveDirectoryServicePrincipal 的服务连接。
但是我们的平台人员将服务连接中的身份验证模式更改为工作负载身份联合。
自此更改以来,无法再连接到我们的 Azure 云数据库。 如果我更改测试应用程序的 app.config 中的身份验证,错误为: Microsoft.Data.SqlClient.SqlException:Microsoft.Data.SqlClient.SqlException:WorkloadIdentityCredential 身份验证不可用。工作负载选项未完全配置。
我在 app.config 的连接字符串中尝试了不同的设置。我还尝试将 vstest 任务替换为 azureCLI 任务,我在其中通过 vstest.console.exe 调用测试。在这里可以生成访问令牌,但我不知道如何将其传递给测试。 到目前为止我找不到解决我的连接问题的方法。
有人有相同的设置或知道如何解决这个问题吗?
添加:旧 VSTEST 任务的 yaml:
steps:
- task: VSTest@3
displayName: 'run DB Unittest'
inputs:
testAssemblyVer2: |
**\*Tests.dll
!**\*TestAdapter.dll
!**\obj\**
codeCoverageEnabled: true
添加:新 AzureCLI 任务的 yaml:
steps:
- task: AzureCLI@2
displayName: 'Azure CLI '
inputs:
azureSubscription: 'ServiceConnection'
scriptType: ps
scriptLocation: inlineScript
inlineScript: |
$Result = "$(Agent.TempDirectory)\TestResults"
$TestDLL = ".\...\Tests.dll"
$TestAdapter = ".\...\TestAdapter.dll"
$TetPlatform = "...\vstest.console.exe"
&$TetPlatform $TestDLL /TestAdapterPath:$TestAdapter /ResultsDirectory:$Result
addSpnToEnvironment: true
enabled: false
添加:app.config 的连接部分:
<configSections>
<section name="SqlUnitTesting" type="Microsoft.Data.Tools.Schema.Sql.UnitTesting.Configuration.SqlUnitTestingSection, Microsoft.Data.Tools.Schema.Sql.UnitTesting, Version=19.0.0.0, Culture=neutral, PublicKeyToken=***" />
</configSections>
<SqlUnitTesting>
<DataGeneration ClearDatabase="true" />
<ExecutionContext Provider="Microsoft.Data.SqlClient"
ConnectionString="Authentication=ActiveDirectoryServicePrincipal;
Persist Security Info=False;
Pooling=False;
Multiple Active Result Sets=False;
Connect Timeout=60;
Encrypt=True;
Trust Server Certificate=False;
Data Source=#{UTConnectionDataSource}#;
Initial Catalog=#{UTConnectionInitialCatalog}#;
User ID=#{UTConnectionUserID}#;
Password=#{UTConnectionPassword}#;"
CommandTimeout="30" />
<PrivilegedContext Provider="Microsoft.Data.SqlClient"
ConnectionString="Authentication=ActiveDirectoryServicePrincipal;
Persist Security Info=False;
Pooling=False;
Multiple Active Result Sets=False;
Connect Timeout=60;
Encrypt=True;
Trust Server Certificate=False;
Data Source=#{UTConnectionDataSource}#;
Initial Catalog=#{UTConnectionInitialCatalog}#;
User ID=#{UTConnectionUserID}#;
Password=#{UTConnectionPassword}#;"
CommandTimeout="30" />
</SqlUnitTesting>
<system.data>
<DbProviderFactories>
<add name="Microsoft SqlClient Data Provider" invariant="Microsoft.Data.SqlClient" description="Microsoft SqlClient Data Provider for SqlServer" type="Microsoft.Data.SqlClient.SqlClientFactory, Microsoft.Data.SqlClient" />
</DbProviderFactories>
</system.data>
根据您的
app.config
,您正在使用ActiveDirectoryServicePrincipal
作为身份验证。
但是根据 使用 Microsoft Entra 身份验证和 SqlClient 连接到 Azure SQL,您应该使用
Active Directory Workload Identity
。
从版本 5.2 开始提供,与托管身份一样,工作负载身份验证模式使用连接字符串中的用户 ID 参数值作为其客户端 ID(如果指定)。但与托管标识不同的是,WorkloadIdentityCredentialOptions 默认其值来自环境变量:AZURE_TENANT_ID、AZURE_CLIENT_ID 和 AZURE_FEDERATED_TOKEN_FILE。但是,只有客户端 ID 可以被连接字符串覆盖。
以下示例演示了使用 Microsoft.Data.SqlClient v5.2 及更高版本的用户分配的托管标识进行 Active Directory 工作负载身份验证。
// Use your own values for Server, Database, and User Id.
// With Microsoft.Data.SqlClient v5.2+
string ConnectionString = @"Server=demo.database.windows.net; Authentication=Active Directory Workload Identity; Encrypt=True; User Id=ClientIdOfManagedIdentity; Database=testdb";
using (SqlConnection conn = new SqlConnection(ConnectionString)) {
conn.Open();
}