【问题标题】:Azure key vault: access deniedAzure 密钥保管库:访问被拒绝
【发布时间】:2016-10-13 15:50:20
【问题描述】:

我有以下代码用于从 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 门户中是否存在阻止我读取机密的设置?

【问题讨论】:

    标签: c# azure azure-keyvault


    【解决方案1】:

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

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

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

    2。使用 Azure 门户

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

    Authorize the application to use the key or secret

    【讨论】:

    • 有没有办法通过 Azure 门户(用户界面)做到这一点?
    • 是的,你可以从 Azure 门户中制作这个,编辑我的答案。
    • 或者,您可以使用az keyvault set-policy --name MyKeyVault --certificate-permissions get list --key-permissions get list decrypt unwrapKey verify --object-id [your app's guid] --secret-permissions get list
    【解决方案2】:

    问题确实使用 Azure 门户指定,我已经记录了为 Key Vault 访问 here 创建服务主体。

    特别是从第 2 步开始:

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

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

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

    【讨论】:

      【解决方案3】:

      发生了什么 - 您的服务主体无权执行上述操作。看看这个帖子。

      How do I fix an "Operation 'set' not allowed" error when creating an Azure KeyVault secret programmatically?

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          在 .Net 代码中访问 Key Vault 天蓝色设置:- 应用服务- 1-启用-MSI(托管服务标识)-开启

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

          3- 单击刀片顶部的 [+ 添加新] 按钮 4-单击选择主体以选择您之前创建的应用程序(应用服务)

          .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;
          

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 2020-06-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-10-13
              • 1970-01-01
              相关资源
              最近更新 更多