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

Fab*_*iro 5 azure-devops azure-managed-identity

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

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

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

Run Code Online (Sandbox Code Playgroud)

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

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

我找到了在 Azure DevOps 中创建到 Azure 的服务连接时创建的服务主体,并赋予它相同的Storage Blob Data Contributor角色,希望 Azure DevOps 会使用它来运行代码,但没有成功。

所以我的问题是:

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

顺便说一句,错误信息:

Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException :参数:连接字符串:[未指定连接字符串],资源:https : //storage.azure.com/,权限:。异常消息:尝试了以下 3 种方法来获取访问令牌,但均无效。参数:连接字符串:[未指定连接字符串],资源:https : //storage.azure.com/,权限:。异常消息:尝试使用托管服务标识获取令牌。无法获取访问令牌。重试 5 次后失败。MSI ResponseCode: BadRequest, Response: {"error":"invalid_request","error_description":"Identity not found"} 参数:连接字符串:[未指定连接字符串],资源:https:, 权威: 。异常消息:尝试使用 Visual Studio 获取令牌。无法获取访问令牌。在“C:\Users\VssAdministrator\AppData\Local.IdentityService\AzureServiceAuth\tokenprovider.json”中找不到 Visual Studio 令牌提供程序文件:连接字符串:[未指定连接字符串],资源:https ://storage.azure 。 com/ , 权限: . 异常消息:尝试使用 Azure CLI 获取令牌。无法获取访问令牌。错误:请运行“az login”来设置帐户。

TearDown : System.NullReferenceException : 未将对象引用设置为对象的实例。

Joh*_*ren 13

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

  • 服务主体(又名 Azure Active Directory 中的应用程序注册)
  • 管理身份
  • 发布个人资料

新的 Azure 服务连接

发布配置文件是 Azure 应用服务特定的身份验证机制,可让你通过 Kudu 进行发布。

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

只能在暴露(又名)AzureServiceTokenProvider的环境中工作。托管的 Azure DevOps 管道不是这样的环境。MSI_ENDPOINTIDENTITY_ENDPOINT

服务主体是您很可能会使用的。

服务主体有自动和手动两种形式。再次出现标签错误。实际上,自动选项并没有什么自动功能,唯一发生的事情是它为您在 Azure AD 中配置服务主体。它将授予服务主体订阅级别的贡献者角色(这意味着对订阅中除访问控制之外的所有内容的完全访问权限)。您不应授予服务主体此类访问权限。这是过度的。请记住,您的服务主体仅受凭据保护,如果它们泄露,任何人都会造成无法挽回的伤害。


Var*_*rma -2

您将需要创建“托管身份验证”类型的服务连接才能在 DevOps 管道中使用托管身份。