6

我设法让下面的代码工作(完整的代码在这里)使用 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 次后失败。MSI ResponseCode:BadRequest,响应:{"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 : 对象引用未设置为对象的实例。

4

3 回答 3

6

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

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

新的 Azure 服务连接

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

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

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

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

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

于 2021-04-09T07:21:07.203 回答
0

由于到目前为止尚未回答此问题,您可以尝试以下操作:尝试将连接信息显式传递给azureServiceTokenProvider。现在,以下代码块假定您使用共享机密凭据登录 Azure AD,但可以扩展到此处描述的任何方法 -使用 .NET 对 Azure Key Vault 进行服务到服务身份验证

var azureServicesAuthString = $"RunAs=App;AppId={AppId};TenantId={TenantId};AppKey={ClientSecret}";
tokenProvider = new AzureServiceTokenProvider(connectionString: azureServicesAuthString);
var authResult = await azureServiceTokenProvider.GetAuthenticationResultAsync(storageResource, cancellationToken: cancellationToken);
于 2020-06-18T17:24:28.303 回答
-1

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

于 2019-07-03T20:53:36.127 回答