Azure密钥保管库:访问被拒绝

我有以下代码从Azure密钥保险库获取密码:

public static async Task 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和Vault的url都没问题。 但是,我不知道我能做些什么来修复此错误,Azure门户中是否有可能阻止我读取密码的设置?

要修复拒绝访问,您需要配置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. 从Key权限下拉列表中,选择“Decrypt”,“Sign”,“Get”,“UnwrapKey”权限
  6. 保存更改

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

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

具体来自第2步:

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

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

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

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

如何以编程方式创建Azure KeyVault密钥时,如何修复“操作’设置’不允许”错误?

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

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

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

访问.Net代码中的密钥保管库Azure设置: – App Service-1-Enable-MSI(托管服务标识)-ON

密钥保管库:1 – 打开密钥保管库2 – 从密钥保管库资源刀片中选择访问策略

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;