使用MSI连接到Azure Vault

Mic*_*Man 2 .net c azure shared-secret azure-security

我正在尝试使用MSI从控制台应用程序连接到Azure Vault

对于此保管库,我已将我的用户添加为“选择的原理”
,我用来连接的代码是

var azureServiceTokenProvider = new AzureServiceTokenProvider();

var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));

var secret = await keyVaultClient.GetSecretAsync("https://<vaultname>.vault.azure.net/secrets/<SecretName>").ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

我得到以下异常

Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException:参数:Connectionstring:[未指定连接字符串],资源:https : //vault.azure.net,颁发机构

在此处输入图片说明

evi*_*obu 6

  1. 在虚拟机下的“ 配置”刀片中启用托管服务身份。

在虚拟机配置刀片中启用MSI

  1. 搜索NameOfYourVM服务主体,并将其添加到“ 访问策略”下的Key Vault 。添加密钥/秘密/证书权限。

将服务主体添加到Key Vault

  1. 在您的Azure VM上,运行控制台应用程序。
class Program
{
    // Target C# 7.1+ in your .csproj for async Main
    static async Task Main()
    {
        var azureServiceTokenProvider = new AzureServiceTokenProvider();

        var keyVaultClient = new KeyVaultClient(
              new KeyVaultClient.AuthenticationCallback(
                    azureServiceTokenProvider.KeyVaultTokenCallback));

        var secret = await keyVaultClient.GetSecretAsync(
              "https://VAULT-NAME.vault.azure.net/secrets/SECRET-NAME");

        Console.WriteLine(secret.Value);
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台输出

若要在本地运行,请创建自己的Azure AD应用程序注册(使用Web App / Web API类型使其成为机密客户端),将其添加到Key Vault中,并在获取访问令牌(https:// docs)时使用其client_id和client_secret
。 microsoft.com/zh-CN/azure/key-vault/key-vault-use-from-web-application#gettoken

正如Varun在评论中提到的那样,现在有一种更好的方法可以在本地运行时获取访问令牌,而无需暴露服务主体-

https://docs.microsoft.com/zh-cn/azure/key-vault/service-to-service-authentication#local-development-authentication