在Azure DevOps构建管道中使用托管身份

时间:2019-07-02 23:45:53

标签: azure-devops azure-managed-identity

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

    const html = document.querySelector('html');
    const body = document.querySelector('body');
    const iframe = document.createElement('iframe');
    ...Some code ....
    html.insertBefore(iframe, body);

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

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

我发现了在Azure DevOps中创建与Azure的服务连接时创建的服务主体,并赋予了它相同的const string storageResource = "https://storage.azure.com/"; var authResult = await azureServiceTokenProvider.GetAuthenticationResultAsync(storageResource, cancellationToken: cancellationToken); 角色,希望Azure DevOps会使用它来运行代码,但没有成功。

所以我的问题是:

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

顺便说一句,错误消息:

  

Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException   :参数:连接字符串:[未指定连接字符串],   资源:https://storage.azure.com/,权限:。异常消息:   尝试了以下3种方法来获取访问令牌,但没有一种方法   工作了。参数:连接字符串:[无连接字符串   指定],资源:https://storage.azure.com/,权限:。   异常消息:尝试使用托管服务身份获取令牌。   无法获取访问令牌。重试5次后失败。微星   ResponseCode:BadRequest,Response:   {“错误”:“ invalid_request”,“错误描述”:“找不到身份”}   参数:连接字符串:[未指定连接字符串],   资源:https://storage.azure.com/,权限:。异常消息:   尝试使用Visual Studio获取令牌。存取凭证不能为   获得。在以下位置找不到Visual Studio令牌提供程序文件   “ C:\ Users \ VssAdministrator \ AppData \ Local.IdentityService \ AzureServiceAuth \ tokenprovider.json”   参数:连接字符串:[未指定连接字符串],   资源:https://storage.azure.com/,权限:。异常消息:   尝试使用Azure CLI获取令牌。存取凭证不能为   获得。错误:请运行“ az登录”以设置帐户。

     

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

3 个答案:

答案 0 :(得分:2)

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

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

New Azure service connection

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

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

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

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

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

答案 1 :(得分:0)

您将需要创建“ Managed identity authentication”类型的服务连接以在DevOps管道中使用托管身份。

答案 2 :(得分:0)

由于至今尚未回答此问题,您可以尝试以下操作: 尝试将连接信息明确传递给 azureServiceTokenProvider 。现在,followig代码块假定您正在使用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);