1

我正在使用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不可用。环境变量未完全配置。

ManagedIdentityCredential 会引发类似的异常:CredentialUnavailableException:ManagedIdentityCredential 身份验证不可用。未找到托管身份端点。

但是,SharedTokenCacheCredential 和 VisualStudioCredential 都有效。

现在,我认为上述行为是正确的。我没有设置所需的环境变量(例如租户 ID、客户端 ID 等),并且我认为 ManagedIdentityCredential 仅在我的 Web 应用程序在 Azure 环境中运行时可用(请参阅此文档)。

现在关于这个问题。在我新安装的计算机上,我从 Visual Studio 2019 中运行了我的 Web 应用程序,但它失败了:AuthenticationFailedException: ManagedIdentityCredential authentication failed: Retry failed after 4 次尝试。

使用 EnvironmentCredential 会导致与我的旧计算机相同的异常,这是预期的。此外,使用 SharedTokenCacheCredential 和 VisualStudioCredential 就像在我的旧计算机上一样。从错误描述来看,我认为,在我的新计算机上,Web 应用程序尝试使用 ManagedIdentityCredential 并失败。是什么导致了这个问题?

4

0 回答 0