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

时间:2020-08-17 18:50:32

标签: azure azure-keyvault

我正在访问存储在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);

1 个答案:

答案 0 :(得分:0)

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

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

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