我正在使用 DefaulAzureCredential (Azure.Identity v1.2.3) 来访问 Azure 上的资源。在我的 Asp.Net Core 3.1 Web 应用程序的 Program.cs 中,我配置了 Azure 密钥保管库访问,如下所示:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder) =>
{
var secretClient = new SecretClient(
new Uri("https://MyKeyVault.vault.azure.net/"),
new DefaultAzureCredential());
builder.AddAzureKeyVault(secretClient, new KeyVaultSecretManager());
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
当我通过按 F5 从 Visual Studio 2019 调试源代码时,上面的代码在我的本地计算机上按预期工作。 从 MS 文档(上面的链接)中,我看到 DefaultAzureCredential 将尝试按以下顺序使用各种凭据:EnvironmentCredential、ManagedIdentityCredential、SharedTokenCacheCredential、VisualStudioCredential 等。我通过将 DefaultAzureCredential 替换为以上资历:
.ConfigureAppConfiguration((context, builder) =>
{
var secretClient = new SecretClient(
new Uri("https://MyKeyVault.vault.azure.net/"),
new EnvironmentCredential());
builder.AddAzureKeyVault(secretClient, new KeyVaultSecretManager());
})
上面很快抛出异常:CredentialUnavailableException: EnvironmentCredential authentication unavailable。环境变量没有配置好
ManagedIdentityCredential 抛出类似的异常:CredentialUnavailableException:ManagedIdentityCredential 身份验证不可用。找不到托管身份终结点。
但是,SharedTokenCacheCredential 和 VisualStudioCredential 都有效。
现在,我认为上面的行为是正确的。我没有设置所需的环境变量(如租户 ID、客户端 ID 等),我认为 ManagedIdentityCredential 只有在我的 Web 应用程序在 Azure 环境中运行时才可用(请参阅this doc)。
现在关于这个问题。在我新安装的计算机中,我从 Visual Studio 2019 中运行了我的 Web 应用程序,但它失败了:AuthenticationFailedException:ManagedIdentityCredential 身份验证失败:4 次尝试后重试失败。
使用 EnvironmentCredential 会导致与我的旧计算机相同的异常,这是预期的。此外,同时使用 SharedTokenCacheCredential 和 VisualStudioCredential 就像在我的旧计算机上一样。从错误描述来看,我认为,在我的新计算机上,网络应用程序以某种方式尝试使用 ManagedIdentityCredential 但失败了。是什么导致了这个问题?
你有没有在本地机器上安装 Azure Arc 代理?
这将创建一个托管服务器身份,
DefaultAzureCredential
将尝试使用它。
代理将安装在 Program Files\AzureConnectedMachineAgent 中并设置这些环境变量:
IMDS_ENDPOINT=http://localhost:40342 IDENTITY_ENDPOINT=http://localhost:40342/metadata/identity/oauth2/token
https://learn.microsoft.com/en-us/azure/azure-arc/servers/managed-identity-authentication