Azure devops 在Azure DevOps构建管道中使用托管标识

Azure devops 在Azure DevOps构建管道中使用托管标识,azure-devops,azure-managed-identity,Azure Devops,Azure Managed Identity,我设法使下面的代码正常工作()以使用Azure托管标识进行身份验证(通过Visual Studio),并在不使用凭据的情况下访问Azure存储帐户 const string storageResource = "https://storage.azure.com/"; var authResult = await azureServiceTokenProvider.GetAuthenticationResultAsync(storageResource, cancellationToken:

我设法使下面的代码正常工作()以使用Azure托管标识进行身份验证(通过Visual Studio),并在不使用凭据的情况下访问Azure存储帐户

const string storageResource = "https://storage.azure.com/";

var authResult = await azureServiceTokenProvider.GetAuthenticationResultAsync(storageResource, cancellationToken: cancellationToken);

代码设法找到我的用户登录到VisualStudio,并使用它来获取令牌,一切顺利

但是,此代码是在Azure DevOps构建管道中作为库集成测试的一部分执行的

我在Azure DevOps中创建与Azure的服务连接时找到了创建的服务主体,并为其指定了相同的
存储Blob Data Contributor
角色,希望Azure DevOps能够使用它来运行代码,但没有成功

所以我的问题是:

如何获取在Azure DevOps构建管道中运行的代码,以便能够使用
AzureServiceTokenProvider
进行身份验证

顺便说一句,错误消息:

Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException :参数:连接字符串:[未指定连接字符串], 资源:,权限:。异常消息: 尝试了以下3种方法来获取访问令牌,但均未尝试 工作。参数:连接字符串:[无连接字符串] 已指定],资源:,权限:。 异常消息:尝试使用托管服务标识获取令牌。 无法获取访问令牌。重试5次后失败。微星 响应代码:BAD请求,响应: {“错误”:“无效的请求”,“错误描述”:“找不到标识”} 参数:连接字符串:[未指定连接字符串], 资源:,权限:。异常消息: 尝试使用Visual Studio获取令牌。无法创建访问令牌 获得。在上找不到Visual Studio令牌提供程序文件 “C:\Users\VssAdministrator\AppData\Local.IdentityService\AzureServiceAuth\tokenprovider.json” 参数:连接字符串:[未指定连接字符串], 资源:,权限:。异常消息: 尝试使用Azure CLI获取令牌。无法创建访问令牌 获得。错误:请运行“az登录”以设置帐户

拆卸:System.NullReferenceException:对象引用未设置为 对象的实例


您需要创建类型为“”的服务连接才能在DevOps管道中使用托管标识

由于这个问题到目前为止还没有得到回答,您可以尝试以下方法: 尝试将连接信息直接传递给azureServiceTokenProvider。下面的代码块假设您正在使用,但可以扩展到此处描述的任何方法-


当您在Azure DevOps中创建服务连接时,您将看到(在撰写本文时)4个选项

  • 服务主体(也称为Azure Active Directory中的应用注册)
  • 管理身份
  • 发布配置文件

发布配置文件是一种特定于Azure应用程序服务的身份验证机制,允许您通过Kudu发布

管理标识有点标记错误。它们用于允许运行Azure管道的VM充当该VM的托管标识(然后,您授予该托管标识访问您希望它能够在Azure门户中访问的资源的权限)。这与其他身份验证方法的工作方式有些不同,但我想当您在Azure中的VM上托管自己的Azure管道时,这是有意义的。此选项有以下警告

AzureServiceTokenProvider
只能在公开
MSI_端点
(又称
IDENTITY_端点
)的环境中工作。托管的Azure DevOps管道不是这样的环境

服务主体很可能就是您将要使用的


服务主体有自动和手动两种风格。又是标签错误。自动选项实际上没有什么自动的功能。唯一发生的事情是,它在Azure广告中为您提供服务主体。它将在订阅级别向服务主体授予参与者角色(这意味着对订阅中除访问控制之外的所有内容的完全访问)。您不应该授予服务主体这种访问权。这太过分了。请记住,您的服务主体只是受到凭据的保护,如果它们泄漏,任何人都会受到不可弥补的伤害。

这只适用于基于VM的代理,而不适用于托管代理。目前还没有什么意义。创建类型为
托管身份验证的服务连接后,除了连接名称之外,我没有其他选择。然后我尝试在Azure Portal中查找托管标识,但什么也找不到。我仍然忽略了让构建机器能够使用令牌提供程序进行身份验证的要点@Thomas建议托管代理还不能像这样进行身份验证,但我甚至不确定是否有我们自己的虚拟机来构建。我只想说清楚,我知道如何创建自己的构建服务器,并让Azure DevOps选择它们来构建。只是创建“托管身份验证”并没有让我看到什么。很明显,我还是迷路了,但欢迎任何指点。谢谢@Varun和Thomas。据我所知,这是在运行管道的虚拟机上启用系统分配的托管标识。这就是为什么你无法在AAD中找到它。您需要在存储帐户上授予对VM本身的访问权限。您能找到此问题的答案吗?我也有同样的问题。@HockeyJ,很抱歉,但现在我不记得是什么问题了。
var azureServicesAuthString = $"RunAs=App;AppId={AppId};TenantId={TenantId};AppKey={ClientSecret}";
tokenProvider = new AzureServiceTokenProvider(connectionString: azureServicesAuthString);
var authResult = await azureServiceTokenProvider.GetAuthenticationResultAsync(storageResource, cancellationToken: cancellationToken);