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

如何在集成测试中覆盖Azure App Configuration并指定认证凭据

解决ASP.NET Core集成测试中Azure App Configuration凭据覆盖问题

问题核心

集成测试中,默认的DefaultAzureCredential会尝试多种凭据类型(如托管身份、VS凭据等),即使代码中配置了排除项,在Azure DevOps流水线中仍未生效,本质是测试配置的优先级未覆盖原有应用配置,或凭据初始化逻辑未被正确替换。

解决方案

1. 重构应用代码,让凭据配置可扩展

修改Program.cs,将Azure App Configuration的凭据初始化逻辑抽离,支持通过配置参数控制:

var builder = WebApplication.CreateBuilder(args);

// 从配置读取凭据选项,测试时可覆盖
var credentialOptions = builder.Configuration
    .GetSection("AzureCredentialOptions")
    .Get<DefaultAzureCredentialOptions>() ?? new DefaultAzureCredentialOptions();

builder.Configuration.AddAzureAppConfiguration(options =>
{
    options.Connect(
        new Uri(builder.Configuration["AppConfig:Endpoint"]),
        new DefaultAzureCredential(credentialOptions)
    );
});

var app = builder.Build();
// 后续中间件配置...
app.Run();

2. 在集成测试中强制覆盖凭据配置

使用WebApplicationFactory时,先清除原有Azure App Configuration配置源,再重新添加仅使用EnvironmentCredential的配置:

public class TestWebApplicationFactory<TProgram> : WebApplicationFactory<TProgram> 
    where TProgram : class
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureAppConfiguration((context, config) =>
        {
            // 移除已加载的Azure App Configuration配置源
            var existingAppConfigSource = config.Sources
                .FirstOrDefault(s => s is AzureAppConfigurationSource);
            if (existingAppConfigSource != null)
            {
                config.Sources.Remove(existingAppConfigSource);
            }

            // 初始化仅使用EnvironmentCredential的凭据
            var restrictedCredential = new DefaultAzureCredential(new DefaultAzureCredentialOptions
            {
                // 排除所有非环境变量的凭据类型
                ExcludeInteractiveBrowserCredential = true,
                ExcludeManagedIdentityCredential = true,
                ExcludeSharedTokenCacheCredential = true,
                ExcludeVisualStudioCredential = true,
                ExcludeVisualStudioCodeCredential = true,
                ExcludeAzureCliCredential = true,
                ExcludeAzurePowerShellCredential = true,
                ExcludeAzureDeveloperCliCredential = true,
                // 保留环境变量凭据
                ExcludeEnvironmentCredential = false
            });

            // 重新添加Azure App Configuration配置
            config.AddAzureAppConfiguration(options =>
            {
                options.Connect(
                    new Uri(context.Configuration["AppConfig:Endpoint"]),
                    restrictedCredential
                );
                // 保留原应用中的筛选、刷新等逻辑
            });
        });
    }
}

3. Azure DevOps流水线配置验证

  • 确保流水线中已设置AZURE_CLIENT_ID、AZURE_CLIENT_SECRET、AZURE_TENANT_ID三个环境变量,供EnvironmentCredential使用。
  • 若流水线启用了托管身份,需确认测试任务未继承该身份权限(或在凭据选项中明确排除ManagedIdentityCredential,避免多余尝试)。

关键注意点

  • 务必清除原有配置源:若直接添加新的Azure App Configuration配置,原有配置会优先生效,导致排除项不生效。
  • 覆盖所有凭据类型:DefaultAzureCredential会不断新增凭据类型(如Azure Developer CLI),需确保所有非环境变量类型都被排除。

内容的提问来源于stack exchange,提问作者span

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:32:05