访问Azure Keyvault的问题-DefaultAzureCredential无法检索令牌

问题描述

我正在访问存储在Azure keyvault中的值。使用Visual Studio进行开发时,我可以毫无问题地从keyvault获取数据。但是,当将代码部署到Test或Stage等不同环境时,会出现错误

我用来访问keyvault的凭据存储在项目的环境变量中。

Visual Studio>项目>右键单击属性>调试>环境变量

环境变量包含:

  • Azure_Client_Id
  • Azure_Tenant_Id
  • Azure_Client_Secret

下面是访问keyvault的代码,当通过Visual Studio使用时,它可以正常工作。

var keyvaultData = new Azure.Security.keyvault.Secrets.SecretClient(vaultUri: new Uri(@"https://{VaultName}.vault.azure.net/"),credential: new Azure.Identity.DefaultAzureCredential());

但是,当将其部署到其他环境时,出现以下错误

发生异常-Azure.Identity.CredentialUnavailableException:DefaultAzureCredential无法从包含的凭据中检索令牌。 EnvironmentCredential身份验证不可用。环境变量未完全配置。 ManagedIdentityCredential身份验证不可用,找不到托管身份端点。 SharedTokenCacheCredential身份验证不可用。在缓存中找不到帐户。

我没有访问Azure的权限,但被告知所有设置均已正确设置。

非常感谢您提供帮助解决此问题。

编辑: 基于给定解决方案的新代码

const string tenantId = "-----"; 
const string clientId = "-----";
const string clientSecret = "-----";  
var keyvaultCredentials = new ClientSecretCredential(tenantId,clientId,clientSecret); 
var keyvaultData= new SecretClient(new Uri(@"https://{VaultName}.vault.azure.net/"),keyvaultCredentials);

解决方法

DefaultAzureCredential将在本地自动使用环境变量,因此,当然,如果您设置了环境变量,它将起作用。如果环境变量不可用,它将尝试ManagedIdentityCredentialSharedTokenCacheCredentialInteractiveBrowserCredential,当您将代码部署到您提到的环境时,它们都不可用,因此您将得到错误。

在这种情况下,如果要将代码部署到不同的环境,则需要使用ClientSecretCredential,将参数直接传递给ClientSecretCredential(String,String,String),这样代码就可以在任何地方使用。

public ClientSecretCredential (string tenantId,string clientId,string clientSecret);