33

我有以下代码用于从 Azure 密钥保管库获取机密:

public static async Task<string> GetToken(string authority, string resource, string scope)
    {
        var authContext = new AuthenticationContext(authority);
        ClientCredential clientCred = new ClientCredential(...); //app id, app secret
        AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCred);

        if (result == null)
            throw new InvalidOperationException("Failed to obtain the JWT token");

        return result.AccessToken;
    }

    public static string GetSecret(string secretName)
    {
        KeyVaultClient keyVaultClient = new KeyVaultClient(GetToken);
        try
        {
            return keyVaultClient.GetSecretAsync("my-key-vault-url", secretName).Result.Value;
        }
        catch(Exception ex)
        {
            return "Error";
        }
    }

我得到的错误是“访问被拒绝”,这(我认为)意味着 id、secret 和保管库的 url 都很好。但是,我不知道我可以采取哪些不同的方法来修复此错误,Azure 门户中是否存在阻止我阅读机密的设置?

4

6 回答 6

51

要修复拒绝访问,您需要配置 Active Directory 权限。授予对 KeyVault 的访问权限。

1. 使用 PowerShell 运行下一个命令:

Set-AzureRmKeyVaultAccessPolicy -VaultName 'XXXXXXX' -ServicePrincipalName XXXXX -PermissionsToKeys decrypt,sign,get,unwrapKey

2. 使用 Azure 门户

  1. 打开密钥库
  2. 从 Key Vault 资源边栏选项卡中选择访问策略
  3. 单击刀片顶部的 [+ 添加访问策略] 按钮
  4. 单击Select Principal以选择您之前创建的应用程序
  5. 从密钥权限下拉列表中,选择“解密”、“签名”、“获取”、“UnwrapKey”权限
  6. 保存更改

授权应用程序使用密钥或秘密

于 2016-10-18T14:55:38.327 回答
7

该问题确实指定了使用 Azure 门户,我在此处记录了为 Key Vault 访问创建服务主体。

具体从第 2 步开始:

在 Azure 门户中打开 Key Vault,然后选择“设置”下的“访问策略”边栏选项卡。单击添加新的并单击选择主体 - 您必须在搜索框中输入您在上一步中创建的注册应用程序的全名,然后它才会显示,此时您将能够选择它.

您可以从顶部下拉列表中选择适当的模板,也可以手动选择密钥、秘密或证书权限。在这个阶段不要担心授权申请。

重要提示:按 OK 按钮会将您的新策略添加到列表中,但不会保存!请务必在继续之前单击保存。

于 2018-03-29T01:57:59.493 回答
4

发生了什么 - 您的服务主体无权执行所述操作。看看这个线程。

以编程方式创建 Azure KeyVault 机密时,如何修复“不允许操作 'set'”错误?

于 2016-10-14T17:30:32.177 回答
1

如果您想授权同一个应用程序读取您的保管库中的机密,请运行以下命令:

Set-AzureRmKeyVaultAccessPolicy -VaultName 'yourKeyVaultName' -ServicePrincipalName ClientId -PermissionsToSecrets Get

在 Azure 中注册应用程序时会生成 ClientId。

于 2017-07-17T15:18:25.950 回答
1

在 .Net 代码 Azure 设置中访问 Key Vault:- App Service- 1-Enable-MSI(托管服务标识)-ON

Key Vault:1-打开 Key Vault 2-从 Key Vault 资源刀片中选择访问策略

3- 单击刀片顶部的 [+ Add new] 按钮 4-单击 Select Principal 以选择您之前创建的应用程序(App Service)

.Net 代码:- 在 .Net 代码中访问密钥库机密的代码

 var azureServiceTokenProvider = new AzureServiceTokenProvider();
        var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
        var secret = keyVaultClient.GetSecretAsync("https://test.vault.azure.net/", "clientid").Result.Value;
于 2018-08-20T11:13:14.347 回答
0

我遇到了同样的问题,我在 KeyVault 防火墙下添加了我的 IP 地址。

于 2020-02-26T13:38:36.083 回答