首页 > 解决方案 > 无法从函数访问 Azure Key Vault - 禁止返回

问题描述

我正在尝试使用 Azure 函数从密钥保管库中获取机密,但是当我尝试访问它时,密钥保管库返回禁止。显然我错过了一些东西,但我无法找到另一个有同样问题的帖子。下面的代码:

AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
KeyVaultClient kvClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));

//(https://keyvaultname.vault.azure.net/)
var keyVaultUrl = Environment.GetEnvironmentVariable("KeyVaultLocation"); 

//(name of the secret)
var vaultSecretKey = Environment.GetEnvironmentVariable("VaultSecretKey"); 

var value = (await kvClient.GetSecretAsync(keyVaultUrl, vaultSecretKey)).Value;

我正在向日志输出异常,而我等待秘密值的最后一行抛出了这个异常:

操作返回了无效的状态代码“禁止”。

我已经在密钥保管库的访问策略中注册了该功能并授予它获取机密的权限,并且我已经为该功能启用了托管服务标识。还有什么我想念的吗?我不知道为什么该功能无法访问保险库。

标签: c#azureazure-functionsazure-keyvault

解决方案


这是我KeyVaultClient在 Azure Function (v2) 中使用的方法。我有一个方法可以根据为 Vault 配置的应用程序 ID 和机密返回访问令牌:

/// <summary>
/// Called by the KeyVaultClient instance.
/// </summary>
/// <param name="authority"></param>
/// <param name="resource"></param>
/// <param name="scope"></param>
/// <returns></returns>
private static async Task<string> GetAccessTokenAsync(string authority, string resource, string scope)
{
    var clientCredential = new ClientCredential(Constants.Vault.AppId, Constants.Vault.AppSecret);

    var context = new AuthenticationContext(authority, TokenCache.DefaultShared);

    AuthenticationResult result = await context.AcquireTokenAsync(resource, clientCredential);

    return result.AccessToken;
}

然后,当我真正需要访问 Vault 时,我调用以下构造函数:

...
//  Pushes the encryption to the Key-Vault.
var client = new KeyVaultClient(GetAccessTokenAsync, new HttpClient());

await client.GetSecretAsync(Constants.Vault.Url, vaultSecretKey);

推荐阅读