无法从功能访问Azure密钥保管库-禁止返回

时间:2018-07-31 20:27:28

标签: c# azure azure-functions azure-keyvault

我正在尝试使用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;

我正在向日志输出异常,而我等待密码值的最后一行抛出此异常:

  

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

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

7 个答案:

答案 0 :(得分:2)

这是我在Azure函数(v2)中使用KeyVaultClient的方式。我有一种方法可根据应用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;
}

然后,当我实际需要访问保管库时,我调用以下构造函数:

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

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

答案 1 :(得分:1)

好的,感谢Dom,这就是我的工作方式:

我多次尝试为功能应用启用和禁用MSI。然后转到KeyVault访问策略,并为功能应用程序的相应服务主体分配所需的权限。

我还发现,使用PowerShell脚本分配标识很容易,所以它比在门户中多次启用和禁用MSI更好:

Set-AzureRmWebApp -AssignIdentity $true -Name $webappname -ResourceGroupName myResourceGroup

答案 2 :(得分:0)

还要再次检查传递给ClientCredential函数的AppId和AppSecret。我们有多个密钥保管库,并且错误的保管库凭据存储在Azure功能应用程序设置中。

答案 3 :(得分:0)

您必须将您的自动化帐户和凭据帐户添加到访问策略中,才能在Powershell的运行本中运行。这对我来说是个新闻。没意识到这是2个帐户对1个帐户。我一直被禁止,只是不知道哪个帐户需要访问。

答案 4 :(得分:0)

我有一个类似的问题。我在2个不同的Web浏览器选项卡中工作:一个用于编辑Azure函数应用程序设置,另一个用于在资源上分配角色。不知道它是否相关,但是当我关闭第二个选项卡并从单个选项卡重新配置所有内容时,一切开始正常工作。

答案 5 :(得分:0)

尽管我实施的是应用服务而不是Azure Functions,但我遇到了类似的问题。

问题的原因是,当我向Key Vault添加权限以允许我的App Service(通过Key Vault页面上的“访问策略”刀片)访问它时,我错误地为我的App Service添加了权限我的应用程序服务 Active Directory应用程序

当我导航到“添加新访问策略->选择主体”并搜索我的App Service的名称时,搜索结果包括两个项目,当尝试使用我的App Service代码时,选择错误的项目导致“禁止”访问密钥库。一旦我返回并选择了Active Directory项(一旦将其添加到访问策略列表中,便包含单词“ APPLICATION”),Key Vault便起作用了。

答案 6 :(得分:0)

我忽略了授予“列表”机密的权限(除了“获取”机密)。以下问题为我提供了线索:https://github.com/aspnet/Extensions/issues/856