问题描述
我正在访问存储在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
将在本地自动使用环境变量,因此,当然,如果您设置了环境变量,它将起作用。如果环境变量不可用,它将尝试ManagedIdentityCredential
,
SharedTokenCacheCredential
,
InteractiveBrowserCredential
,当您将代码部署到您提到的环境时,它们都不可用,因此您将得到错误。
在这种情况下,如果要将代码部署到不同的环境,则需要使用ClientSecretCredential
,将参数直接传递给ClientSecretCredential(String,String,String)
,这样代码就可以在任何地方使用。
public ClientSecretCredential (string tenantId,string clientId,string clientSecret);