繁体   English   中英

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

[英]Unable to Access Azure Key Vault from Function - Returns Forbidden

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

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

操作返回了无效的状态代码'Forbidden'。

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

以下是我在Azure函数(v2)中使用KeyVaultClient 我有一个方法,根据为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);

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

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

我还发现,使用PowerShell脚本分配标识非常简单,因此它可能比在门户中多次启用和禁用MSI更好:

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

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

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

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

虽然我实现的是App Service而不是Azure Functions,但我遇到了类似的问题。

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

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

我忽略了授予“List”秘密的权限(除了“获取”秘密)。 以下问题引起了我的注意: https//github.com/aspnet/Extensions/issues/856

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM