Azure KeyVault:Azure.Identity.CredentialUnavailableException:DefaultAzureCredential 无法从包含的凭据中检索令牌
Posted
技术标签:
【中文标题】Azure KeyVault:Azure.Identity.CredentialUnavailableException:DefaultAzureCredential 无法从包含的凭据中检索令牌【英文标题】:Azure KeyVault: Azure.Identity.CredentialUnavailableException: DefaultAzureCredential failed to retrieve a token from the included credentials 【发布时间】:2020-10-30 04:40:27 【问题描述】:我正在尝试将面向 .net 框架的 aspnet 核心应用程序与 Azure Keyvault 连接。在支持身份的新 azure vm 上一切正常,但此应用程序托管在不支持身份的经典 azure vm 上。我创建了系统环境变量 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>
【问题讨论】:
【参考方案1】:您能否确认您正在设置以下系统environment variables?
AZURE_CLIENT_ID
- 服务主体的应用 ID
AZURE_TENANT_ID
- 主体的 Azure Active Directory 租户的 ID
AZURE_CLIENT_SECRET
- 服务主体的客户端机密之一
【讨论】:
我什么都有,除了 AZURE_TENANT_ID。添加后,密钥库按预期工作。谢谢! 您在密钥保管库的哪个位置添加了这些信息? 抱歉回复晚了!您在上面看到的 3 行信息是我将它们添加到运行应用程序的虚拟机上的环境变量中的。 @Coderun 是的,我也这样做了。它也对我有用 对我来说这里的关键是“系统”环境变量。我尝试在进程级别将它们设置在代码中,但它没有那样工作。从系统对话框设置它们是有效的。【参考方案2】:如果 Visual Studio 因某种原因失去其 Azure 服务身份验证连接或您的实际 AD 凭据已更改(例如密码更改),也会发生此错误。
在这种情况下,只需再次登录即可为我解决此问题:
在 Visual Studio 中,转到工具 > 选项。展开“Azure 服务身份验证”>“帐户选择”。如果您看到“重新输入您的凭据”链接,请单击它并再次登录。如果没有,请尝试通过右上角的 Visual Studio 配置文件进行常规注销 + 登录。
【讨论】:
【参考方案3】:我在 VS 2019 应用程序中也遇到过这个问题。只需重新输入 VS 登录用户的凭据,该用户可以访问 azure 资源组。
我希望它能解决问题。
【讨论】:
【参考方案4】:如果您使用 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>
【讨论】:
我遇到了 KeyVault 连接问题。添加 Azure ClientID、TenantId 和 Client Secreat 的环境变量后,它就起作用了 如何在您的 Azure 帐户凭据下运行站点的应用程序池标识? 我能够在 localhost 中对 azure keyvault 进行身份验证,但在 IIS 中出现多个身份验证错误【参考方案5】:对我来说,这只是第一个例外,进一步深入研究(继续 => 继续 => 继续)我最终得到了真正的例外:
''az' 未被识别为内部或外部命令'
原来我忘记在我的机器上安装 Azure CLI!
一旦我这样做了,我仍然得到了原始的“CredentialUnavailableException”,但它被处理了(不知道为什么我的调试器会中断它,但这是另一个故事)并且一切正常。
This *** link helped.
【讨论】:
以上是关于Azure KeyVault:Azure.Identity.CredentialUnavailableException:DefaultAzureCredential 无法从包含的凭据中检索令牌的主要内容,如果未能解决你的问题,请参考以下文章
使用 Azure.Security.KeyVault.Secrets 的网络核心密钥保管库配置
Azure Keyvault 通过 ARM 添加 Function MSI
使用 KeyVault 和 Azure PowerShell 证书身份验证创建 Azure AD 应用程序
Azure 函数和 Azure KeyVault 通过服务端点进行通信
Azure KeyVault:Azure.Identity.CredentialUnavailableException:DefaultAzureCredential 无法从包含的凭据中检索令牌