C# Azure KeyVault:Azure.Identity.CredentialUnavailableException:DefaultAzureCredential未能从包含的凭据中检索令牌

C# Azure KeyVault:Azure.Identity.CredentialUnavailableException:DefaultAzureCredential未能从包含的凭据中检索令牌,c#,.net,azure,asp.net-core,azure-keyvault,C#,.net,Azure,Asp.net Core,Azure Keyvault,我正在尝试将针对.net framework的aspnet核心应用程序与Azure Keyvault连接起来。在支持标识的新azure vm上,一切正常,但此应用程序托管在不支持标识的经典azure vm上。我创建了系统环境变量AzureServiceAuthConnectionString,其他几个带有Azure keyvault的.net framework应用程序已经在使用该变量,并且工作正常 查看我的标准日志,每次都会出现以下异常 Azure.Identity.CredentialUna

我正在尝试将针对.net framework的aspnet核心应用程序与Azure Keyvault连接起来。在支持标识的新azure vm上,一切正常,但此应用程序托管在不支持标识的经典azure vm上。我创建了系统环境变量AzureServiceAuthConnectionString,其他几个带有Azure keyvault的.net framework应用程序已经在使用该变量,并且工作正常

查看我的标准日志,每次都会出现以下异常

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>();
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseApplicationInsights(ConfigurationManager.AppSettings[“applicationInsightsInstrumentationKey”])
.ConfigureKestrel(选项=>options.AddServerHeader=false)
.Useii整合()
.ConfigureAppConfiguration((上下文,配置)=>
{
var vaultName=ConfigurationManager.AppSettings[“vaultName”];
如果(!string.IsNullOrEmpty(Vault名称))
{
var azureServiceTokenProvider=新azureServiceTokenProvider();
var keyVaultClient=新的keyVaultClient(
新建KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback);
config.AddAzureKeyVault(
$“https://{vaultName}.vault.azure.net/”,
KeyVault客户端,
新的DefaultKeyVaultSecretManager());
}
})
.UseStartup();
并在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>

能否验证您正在设置以下系统

AZURE\u客户端\u ID
-服务主体的应用程序ID

AZURE\u租户\u ID
-主体的AZURE Active Directory租户的ID


AZURE\u CLIENT\u SECRET
-服务负责人的一个客户端机密

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

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


在Visual Studio中,转到工具>选项。展开“Azure服务验证”>“帐户选择”。如果您看到“重新输入您的凭据”链接,请单击该链接并再次登录。如果没有,请尝试通过右上角的Visual Studio配置文件进行常规注销+登录。

我在VS2019应用程序中也遇到过这个问题。只需重新输入VS登录用户的凭据,该用户可以访问azure资源组


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

如果您在本地使用IIS而不是IIS Express运行站点,您可能需要在Azure帐户凭据下运行站点的应用程序池标识,以便在浏览器中登录到portal.Azure.com或dev.Azure.com时使用确切的凭据。你的拍拍不起作用

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

然后转到%windir%\System32\inetsrv\config\applicationHost.config

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

如果不存在,则将其添加到applicationPoolDefaults标记下,即

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


除了AZURE_租户ID之外,我拥有一切。添加它后,keyvault按预期工作。谢谢你!您在密钥库中的何处添加了此信息?很抱歉响应太晚!您在上面看到的3行信息是我将它们添加到运行应用程序的虚拟机上的环境变量中的@是的,我也这么做了。这对我来说也很有效,这里对我来说的关键是“系统”环境变量。我试着在流程级别的代码中设置它们,但没有成功。从系统对话框中设置它们有效。这在vscodelogout中似乎不起作用+在VS2019中登录有效