[英]Use managed identities in Azure DevOps build pipeline
我设法使以下代码工作( 完整代码在此)以使用 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, Response: {"error":"invalid_request","error_description":"Identity not found"} 参数:连接字符串:[未指定连接字符串],资源: https : //storage.azure.com/ , 权威: 。 异常消息:尝试使用 Visual Studio 获取令牌。 无法获取访问令牌。 在“C:\\Users\\VssAdministrator\\AppData\\Local.IdentityService\\AzureServiceAuth\\tokenprovider.json”中找不到 Visual Studio 令牌提供程序文件:连接字符串:[未指定连接字符串],资源: https ://storage.azure 。 com/ , 权限: . 异常消息:尝试使用 Azure CLI 获取令牌。 无法获取访问令牌。 错误:请运行“az login”来设置帐户。
TearDown : System.NullReferenceException : 未将对象引用设置为对象的实例。
在 Azure DevOps 中创建服务连接时,您会看到(截至撰写时)4 个选项。
发布配置文件是一种 Azure 应用服务特定的身份验证机制,可让你通过 Kudu 发布。
管理身份有些贴错标签。 它们用于允许运行 Azure 管道的 VM 充当该 VM 的托管标识(然后,您可以授予此托管标识访问您希望它能够在 Azure 门户中访问的资源的权限)。 这与其他身份验证方法的工作方式有些相反,但我想当您在 Azure 中的 VM 上托管自己的 Azure 管道时,这是有道理的。 此选项有此警告。
AzureServiceTokenProvider
只能在公开MSI_ENDPOINT
(又名IDENTITY_ENDPOINT
)的环境中工作。 托管的 Azure DevOps 管道不是这样的环境。
服务主体是您很可能会使用的。
服务主体有自动和手动两种。 再次贴错标签。 自动选项实际上没有任何自动功能,唯一发生的事情是它在您的 Azure AD 中为您提供服务主体。 它将授予服务主体订阅级别的贡献者角色(这意味着对订阅中除访问控制之外的所有内容的完全访问权限)。 您不应授予服务主体这种访问权限。 这是过度的。 请记住,您的服务主体仅受凭据保护,如果它们泄漏,它们将允许任何人造成无法弥补的伤害。
由于到目前为止还没有回答这个问题,你可以试试这个:尝试将连接信息明确地传递给azureServiceTokenProvider 。 现在,followig 代码块假定您使用共享机密凭据登录 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);
您需要创建一个“ 托管身份验证”类型的服务连接,才能在 DevOps 管道中使用托管身份。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.