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

在DotNetCoreCLI@2任务中配置Azure凭据,实现测试调用Azure资源

解决Azure DevOps流水线测试调用Azure资源API的凭据问题

问题根源

你当前的实现存在两个核心问题:

  • DefaultAzureCredential默认不会自动识别自定义的环境变量令牌,需要显式指定凭据提供程序链
  • 返回的AccessToken错误包含了Bearer前缀,Azure SDK会自动处理认证头格式,令牌本身不需要添加该前缀

修正后的自定义凭据实现

实现合规的TokenCredential子类,并在初始化DefaultAzureCredential时将其加入凭据链:

using Azure.Core;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

public class PipelineAccessTokenCredential : TokenCredential
{
    public override AccessToken GetToken(TokenRequestContext requestContext, CancellationToken cancellationToken)
    {
        var pipelineToken = Environment.GetEnvironmentVariable("SYSTEM_ACCESSTOKEN");
        if (string.IsNullOrEmpty(pipelineToken))
        {
            throw new InvalidOperationException("未获取到流水线访问令牌,请检查环境变量配置");
        }

        // 使用UTC时间设置过期时间,避免时区偏差问题
        return new AccessToken(pipelineToken, DateTimeOffset.UtcNow.AddMinutes(60));
    }

    public override ValueTask<AccessToken> GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken)
    {
        return new ValueTask<AccessToken>(GetToken(requestContext, cancellationToken));
    }
}

// 在测试代码中初始化凭据
var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions
{
    CredentialChain = new List<TokenCredential>
    {
        new PipelineAccessTokenCredential(),
        // 可选:保留其他默认凭据提供程序,方便本地调试
        new EnvironmentCredential(),
        new VisualStudioCredential()
    }
});

// 示例:使用凭据初始化Azure服务客户端
var blobServiceClient = new BlobServiceClient(new Uri("https://yourstorageaccount.blob.core.windows.net"), credential);

流水线配置调整

移除无效的SecretsFilter参数,并确保任务有权限访问OAuth令牌:

- task: DotNetCoreCLI@2
  displayName: 'dotnet test'
  env:
    SYSTEM_ACCESSTOKEN: $(System.AccessToken)
  inputs:
    command: test
    arguments: --collect "Code coverage"
    projects: ${{ parameters.testProjects }}
  # 关键:确保任务能访问OAuth令牌,否则$(System.AccessToken)会为空值
  condition: succeeded()

更简化的替代方案

如果构建代理使用了Azure托管标识,无需自定义凭据,DefaultAzureCredential会自动拾取托管标识权限:

// 直接使用默认凭据链,流水线代理的托管标识会被自动识别
var credential = new DefaultAzureCredential();

权限验证要点

  • 确保流水线的服务主体/托管标识拥有目标Azure资源的对应权限(例如存储账户的Storage Blob Data Contributor)
  • 可在测试中添加日志输出,验证SYSTEM_ACCESSTOKEN是否被正确读取,排查环境变量传递问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:21:04