我设法使以下代码能够正常工作(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:对象引用未设置为 对象的实例。
答案 0 :(得分:2)
在 Azure DevOps 中创建服务连接时,您会看到(截至撰写本文时)4 个选项。
发布配置文件是一种 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);