Azure KeyVault:Azure.Identity.CredentialUnavailableException:DefaultAzureCredential 无法从包含的凭据中检索令牌

Azure KeyVault: Azure.Identity.CredentialUnavailableException: DefaultAzureCredential failed to retrieve a token from the included credentials

我正在尝试将我的以 .net 框架为目标的 aspnet 核心应用程序与 Azure Keyvault 连接起来。在支持身份的新 azure 虚拟机上,一切正常,但此应用程序托管在不支持身份的经典 azure 虚拟机上。我创建了系统环境变量 AzureServiceAuthConnectionString,它可以切断其他带有 Azure keyvault 的 .net 框架应用程序已经在使用并且运行良好。

查看我的标准输出日志,我每次都会收到以下异常。

Azure.Identity.CredentialUnavailableException: DefaultAzureCredential failed to retrieve a token from the included credentials
EnvironmentCredential authentication unavailable. Environment variables are not fully configured
ManagedIdentityCredential authentication unavailable, the requested identity has not been assigned to this resource.

我在启动时使用了以下代码:

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)               
       .UseApplicationInsights(ConfigurationManager.AppSettings["applicationInsightsInstrumentationKey"])
                .ConfigureKestrel(options => options.AddServerHeader = false)
                .UseIISIntegration()
                .ConfigureAppConfiguration((context, config) =>
                {
                    var vaultName = ConfigurationManager.AppSettings["VaultName"];
                    if (!string.IsNullOrEmpty(vaultName))
                    {
                        var azureServiceTokenProvider = new AzureServiceTokenProvider();
                        var keyVaultClient = new KeyVaultClient(
                            new KeyVaultClient.AuthenticationCallback(
                                azureServiceTokenProvider.KeyVaultTokenCallback));

                        config.AddAzureKeyVault(
                            $"https://{vaultName}.vault.azure.net/",
                            keyVaultClient,
                            new DefaultKeyVaultSecretManager());
                    }
                })
                .UseStartup<Startup>();

并且在 web.config 以下项目中:

   <configSections>
      <section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false"/>
   </configSections>
   <configBuilders>
    <builders>
      <add name="AzureKeyVault" vaultName="<#= this.VaultName #>" type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure, Version=2.0.0.0, Culture=neutral" vaultUri="https://<#= this.VaultName #>.vault.azure.net" />
    </builders>
  </configBuilders>
  <connectionStrings configBuilders="AzureKeyVault">
      <add name="ConnectionString" connectionString="" providerName="System.Data.SqlClient"/>
  </connectionStrings>

您能否确认您正在设置以下系统 environment variables

AZURE_CLIENT_ID - 服务主体的应用程序 ID

AZURE_TENANT_ID - 主体的 Azure Active Directory 租户的 ID

AZURE_CLIENT_SECRET - 服务主体的客户端机密之一

如果 Visual Studio 由于某种原因失去了它的 Azure 服务身份验证连接,或者您的实际 AD 凭据已更改(例如密码更改),也会发生此错误。

在这种情况下,只需再次登录即可为我解决此问题:

在 Visual Studio 中,转到“工具”>“选项”。展开“Azure 服务身份验证”>“帐户选择”。如果您看到“重新输入您的凭据”link,请单击它并重新登录。如果没有,请通过右上角的 Visual Studio 个人资料尝试常规 sign-out + sign-in。

我在 VS 2019 应用程序中也遇到过这个问题。只是 re-enter VS logged-in 用户的凭据,可以访问 azure 资源组。

我希望它能解决这个问题。

如果您运行使用 IIS 而不是 IIS Express 在本地连接您的网站,您可能需要 运行 您的 Azure 帐户凭据下的网站应用程序池标识,因此确切的凭据您使用浏览器登录 portal.azure.com 或 dev.azure.com。您的 PAT 将不起作用。

设置完成后,回收应用程序池。

然后去 %windir%\System32\inetsrv\config\applicationHost.config

搜索“setProfileEnvironment”。如果设置为“false”,请将其更改为“true”。

如果不存在,请将其添加到 applicationPoolDefaults 标签下,即

<applicationPoolDefaults managedRuntimeVersion="v4.0">
    <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="true" />
</applicationPoolDefaults>

对我来说这只是第一个异常,进一步深入(继续 => 继续 => 继续)我最终得到了真正的异常:

''az' 未被识别为内部或外部命令'

原来我忘了在我的机器上安装 Azure CLI!

一旦我这样做了,我仍然得到了原始的 'CredentialUnavailableException' 但它得到了处理(不确定为什么我的调试器会中断它,但那是另一回事)并且一切正常。