Azure密钥库:Azure.身份.凭据不可用异常:DefaultAzureCredential无法从包含的凭据中检索令牌

aiqt4smr  于 2022-12-14  发布在  其他
关注(0)|答案(8)|浏览(287)

我正在尝试将面向.net framework的aspnet核心应用程序与Azure Keyvault连接。在支持标识的新Azure虚拟机上,一切都运行正常,但此应用程序托管在不支持标识的经典Azure虚拟机上。我创建了系统环境变量AzureServiceAuthConnectionString,其他具有Azure Keyvault的.net framework应用程序已经在使用该变量,并且运行正常。
查看我的stdout日志时,我每次都会遇到以下异常。
Azure.身份.凭据不可用异常:DefaultAzureCredential无法从包含的凭据中检索令牌环境凭据身份验证不可用。环境变量未完全配置ManagedIdentityCredential身份验证不可用,请求的身份尚未分配给此资源。
我在启动中使用了下面的代码:

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>
6ie5vjzr

6ie5vjzr1#

如果Visual Studio由于某种原因丢失了Azure服务身份验证连接,或者你的实际AD凭据已更改(例如密码更改),也可能发生此错误。
在这种情况下,只需再次登录即可解决此问题:
在Visual Studio中,转到"工具“〉”选项“。展开“Azure服务身份验证”〉“帐户选择”。如果看到“重新输入凭据”链接,请单击该链接并再次登录。如果没有,请尝试通过右上角的Visual Studio配置文件进行常规注销+登录。

bvn4nwqk

bvn4nwqk2#

能否验证您正在设置以下系统环境变量?
AZURE_CLIENT_ID-服务主体的应用程序ID
AZURE_TENANT_ID-主体的Azure Active Directory租户的ID
AZURE_CLIENT_SECRET-服务主体的客户端机密之一

tuwxkamq

tuwxkamq3#

在VS 2019应用中,对我来说,可以重新输入VS登录用户的凭据,该用户可以访问Azure资源组。

rnmwe5a2

rnmwe5a24#

如果您使用IIS而不是IIS Express在本地运行站点,则可能需要在您的Azure帐户凭据下运行站点的应用程序池标识,以便使用您在浏览器中登录www.example.com或dev.azure.com所使用的确切凭据portal.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>
pu82cl6c

pu82cl6c5#

对我来说,这只是第一个异常,进一步深入(Continue =〉Continue =〉Continue),我最终得到了真实的的异常:
'az'未被识别为内部或外部命令'
原来我忘了在我的机器上安装Azure CLI!
一旦我这样做了,我仍然得到了原来的'CredentialUnavailableException',但它的处理(不知道为什么我的调试器是打破了它,但这是另一个故事)和一切工作。
This StackOverflow link helped.

lqfhib0f

lqfhib0f6#

我按照下面的步骤修复了这个问题。请确保您有Azure门户的访问权限和所需的资源。
1.安装Azure客户端
1.以管理员身份打开PowerShell
1.使用az login命令登录Azure
1.以管理员身份打开Visual Studio

vzgqcmou

vzgqcmou7#

这意味着IDE无法从您的构建环境/容器中找到Azure凭据。如果注销/登录方法不起作用,则从您的终端:
az login
使用您的凭据登录并重新运行程序。

zqdjd7g9

zqdjd7g98#

调试IIS中承载的Web服务时,请记住将应用程序池标识设置为您自己的帐户。
经过几个小时的尝试,我偶然发现了这个,下面的代码确实把我推向了正确的方向。

var credential = new DefaultAzureCredential(
            new DefaultAzureCredentialOptions
            {
                VisualStudioTenantId = "xxx",
                ExcludeVisualStudioCodeCredential = true,
                ExcludeEnvironmentCredential = true,
                ExcludeManagedIdentityCredential = true,
                ExcludeVisualStudioCredential = false,
                ExcludeAzureCliCredential = true,
                ExcludeAzurePowerShellCredential = true,
                ExcludeSharedTokenCacheCredential = true
            });
        var token = credential.GetToken(new Azure.Core.TokenRequestContext(new[] { "https://database.windows.net/.default" }));

无法在以下位置访问Visual Studio令牌提供程序:c:\windows\system32\inetsrv.IdentityService\AzureServiceAuth\tokenprovider.json
当然,这是默认应用程序池身份系统:(

相关问题