【问题标题】:Use managed identities in Azure DevOps build pipeline在 Azure DevOps 构建管道中使用托管标识
【发布时间】:2019-11-13 14:53:49
【问题描述】:

我设法使以下代码正常工作 (complete code here) 以使用 Azure 托管标识进行身份验证(通过 Visual Studio)并无需使用凭据即可访问 Azure 存储帐户。

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

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

代码设法找到我的用户登录到 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 次后失败。微星 响应代码:BadRequest,响应: {"error":"invalid_request","error_description":"找不到身份"} 参数:连接字符串:[未指定连接字符串], 资源:https://storage.azure.com/,权威:。异常消息: 尝试使用 Visual Studio 获取令牌。无法访问令牌 获得。找不到 Visual Studio 令牌提供程序文件 “C:\Users\VssAdministrator\AppData\Local.IdentityService\AzureServiceAuth\tokenprovider.json” 参数:连接字符串:[未指定连接字符串], 资源:https://storage.azure.com/,权威:。异常消息: 尝试使用 Azure CLI 获取令牌。无法访问令牌 获得。错误:请运行“az login”来设置帐户。

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

【问题讨论】:

  • 你能找到答案吗?我也有同样的问题。
  • @HockeyJ,很抱歉,但现在我不记得出了什么问题。

标签: azure-devops azure-managed-identity


【解决方案1】:

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

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

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

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

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

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

服务主体有自动和手动两种。又是贴错标签。自动选项实际上没有什么自动的,唯一发生的事情是它为您在 Azure AD 中预配服务主体。它将授予服务主体订阅级别的贡献者角色(这意味着对订阅中除访问控制之外的所有内容的完全访问权限)。您不应授予服务主体这种访问权限。这是过度的。请记住,您的服务主体只是受凭据保护,如果它们泄漏,它们会让任何人造成无法弥补的伤害。

【讨论】:

  • 您的回答似乎表明从安全角度来看没有好的解决方案。 DevOps Build Pipeline 中的 XUnit 项目是否无法调用具有 SQL Server 访问权限的托管标识?
【解决方案2】:

由于这个问题到目前为止还没有回答,你可以试试这个: 尝试将连接信息显式传递给 azureServiceTokenProvider。现在,以下代码块假定您使用的是 a shared secret credential to sign into Azure AD,但可以扩展到此处描述的任何方法 - Service-to-service authentication to Azure Key Vault using .NET

var azureServicesAuthString = $"RunAs=App;AppId={AppId};TenantId={TenantId};AppKey={ClientSecret}";
tokenProvider = new AzureServiceTokenProvider(connectionString: azureServicesAuthString);
var authResult = await azureServiceTokenProvider.GetAuthenticationResultAsync(storageResource, cancellationToken: cancellationToken);

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 它只适用于基于虚拟机的代理,不适用于托管代理
    • 还没有多大意义。创建Managed identity authentication 类型的服务连接后,除了连接名称之外我没有其他选择。然后我尝试在 Azure 门户中查找托管标识,但一无所获。我仍然错过了使构建机器能够使用令牌提供程序进行身份验证的要点。 @Thomas 建议托管代理还不能像这样进行身份验证,但我什至不确定是否要构建我们自己的虚拟机。
    • 为了清楚起见,我知道如何创建自己的构建服务器并让 Azure DevOps 挑选它们进行构建。只是创建“托管身份验证”并没有做任何我看不到的事情。显然,我仍然迷路,但欢迎任何指点。谢谢@Varun 和 Thomas。
    • 据我所知,这是在运行管道的 VM 上启用系统分配的托管标识。这就是为什么您无法在 AAD 中找到它的原因。您需要在存储帐户上授予对 VM 本身的访问权限。
    猜你喜欢
    • 2020-01-01
    • 2021-01-21
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    相关资源
    最近更新 更多