gpt4 book ai didi

asp.net - 使用服务标识时无法连接到 Azure Key Vault

转载 作者:行者123 更新时间:2023-12-02 14:02:03 24 4
gpt4 key购买 nike

我正在尝试在 ASPNet 4.6.2 Web 应用程序中使用服务标识从 Azure Key Vault 检索 secret 。我正在使用 article 中概述的代码。在本地,一切正常,尽管这是因为它使用了我的身份。当我将应用程序部署到 Azure 时,调用 keyVaultClient.GetSecretAsync(keyUrl) 时出现异常。

据我所知,一切都配置正确。我创建了一个用户分配的身份,以便可以重复使用它,并确保该身份可以访问 KeyVault 策略中的 secret 和 key 。

异常是AzureServiceTokenProviderException。它很详细,并概述了它如何尝试四种方法进行身份验证。我关心的信息是当它尝试使用托管服务身份时:

Tried to get token using Managed Service Identity. Access token could not be acquired. MSI ResponseCode: BadRequest, Response:

我检查了应用程序洞察,发现它尝试建立以下连接,但出现 400 结果错误:

http://127.0.0.1:41340/MSI/token/?resource=https://vault.azure.net&api-version=2017-09-01

这里有两件事很有趣:

  1. 为什么它尝试连接到本地主机地址?这似乎是错误的。
  2. 这是否会因为资源参数未转义而返回 400?
  3. 在 MsiAccessTokenProvider source ,仅当设置环境变量 MSI_ENDPOINT 和 MSI_SECRET 时,它才使用该地址形式。它们没有在应用程序设置中设置,但当我输出环境变量时,我可以在调试控制台中看到它们。

此时我不知道该怎么办。网上的例子都让它看起来很神奇,但如果我对问题根源的理解是正确的,那么就有一些模糊的自动设置需要修复。

为了完整起见,这里是我所有的相关代码:

public class ServiceIdentityKeyVaultUtil : IDisposable
{
private readonly AzureServiceTokenProvider azureServiceTokenProvider;
private readonly Uri baseSecretsUri;
private readonly KeyVaultClient keyVaultClient;


public ServiceIdentityKeyVaultUtil(string baseKeyVaultUrl)
{
baseSecretsUri = new Uri(new Uri(baseKeyVaultUrl, UriKind.Absolute), "secrets/");
azureServiceTokenProvider = new AzureServiceTokenProvider();
keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
}

public async Task<string> GetSecretAsync(string key, CancellationToken cancellationToken = new CancellationToken())
{
var keyUrl = new Uri(baseSecretsUri, key).ToString();
try
{
var secret = await keyVaultClient.GetSecretAsync(keyUrl, cancellationToken);
return secret.Value;
}
catch (Exception ex)
{
/** rethrows error with extra details */
}
}

/** IDisposable support */
}

更新 #2 (我删除了更新 #1)

我创建了一个全新的应用程序或新的服务实例,并且能够重新创建错误。 但是,在所有情况下我都使用用户分配的身份。如果我删除它并使用系统分配的身份,那么它就可以正常工作。

我不知道为什么这些会有所不同。任何人都有见解,因为我更喜欢用户分配的见解。

最佳答案

用户分配身份的主要区别之一是您可以将其分配给多个服务。它在 azure 中作为单独的 Assets 存在,而系统身份则绑定(bind)到与其配对的服务的生命周期。

From the docs :

直接在 Azure 服务实例上启用系统分配的托管标识。启用标识后,Azure 会在实例订阅信任的 Azure AD 租户中为实例创建一个标识。创建身份后,将凭证配置到实例上。系统分配标识的生命周期直接与其启用的 Azure 服务实例相关联。如果实例被删除,Azure 会自动清除 Azure AD 中的凭据和身份。

用户分配的托管标识作为独立的 Azure 资源创建。通过创建过程,Azure 在 Azure AD 租户中创建一个受正在使用的订阅信任的身份。创建身份后,可以将该身份分配给一个或多个 Azure 服务实例。用户分配的标识的生命周期与其所分配到的 Azure 服务实例的生命周期分开管理。

用户分配的身份仍处于应用服务预览阶段。请参阅文档 here 。它可能仍处于私有(private)预览版(即 Microsoft 必须在您的订阅中明确启用它),它可能在您选择的区域不可用,或者可能是一个缺陷。

enter image description here

关于asp.net - 使用服务标识时无法连接到 Azure Key Vault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54368973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com