如何通过服务主体令牌访问Azure DevOps项目中的NuGet源?
通过服务主体认证访问Azure Artifacts NuGet源的C#实现
方案一:结合Azure DevOps客户端库与服务主体令牌
你可以利用Microsoft.Azure.DevOps.Client库,通过服务主体令牌建立连接后,使用专用的工件客户端操作NuGet源:
获取服务主体访问令牌
先通过Azure.Identity库获取针对Azure DevOps资源的令牌(需确保服务主体拥有Artifacts相关权限):var credential = new ClientSecretCredential(tenantId, clientId, clientSecret); var accessToken = await credential.GetTokenAsync(new TokenRequestContext(new[] { "499b84ac-1321-427f-aa17-267ca6975798/.default" }));注:
499b84ac-1321-427f-aa17-267ca6975798是Azure DevOps的固定资源ID。创建连接并获取工件客户端
用令牌建立Vss连接后,获取ArtifactHttpClient即可操作NuGet源:var vssToken = new VssAadToken("Bearer", accessToken.Token); var credentials = new VssAadCredential(vssToken); var orgUri = new Uri("https://dev.azure.com/你的组织名"); var connection = new VssConnection(orgUri, credentials); var artifactClient = connection.GetClient<ArtifactHttpClient>();示例:获取指定Feed的包列表
var packages = await artifactClient.GetPackagesAsync("你的项目名", "你的Feed名");
方案二:直接为NuGet配置令牌认证
NuGet支持将服务主体令牌作为密码进行Basic认证,用户名可填任意非空值:
var feedUrl = "https://pkgs.dev.azure.com/你的组织名/_packaging/你的Feed名/nuget/v3/index.json"; var repository = Repository.CreateSource(Repository.Provider.GetCoreV3(), feedUrl); // 用户名填任意非空值,密码用服务主体令牌 repository.PackageSource.Credentials = new NuGet.Configuration.PackageSourceCredential( feedUrl, "azuresp", accessToken.Token, true, "basic" ); var findPackageResource = await repository.GetResourceAsync<FindPackageByIdResource>(); // 后续可通过findPackageResource执行包查询等操作
关键注意事项
- 需在Azure DevOps的Feed权限设置中,为服务主体分配读取/写入权限。
- 获取令牌时必须指定Azure DevOps的专用资源ID,否则令牌无法用于Artifacts认证。
内容的提问来源于stack exchange,提问作者Mei
相关产品推荐
相关产品推荐

