首页 > 解决方案 > 用于控制台应用程序 Web 作业的 Azure Key Vault

问题描述

我使用 MSI 让 Azure Key Vault 与我的 Web 应用程序一起工作。现在我正在为我的 webjobs 设置 KV,它们只是运行 .Net Framework 4.7.2 的控制台应用程序。当我尝试将“使用 Azure Key Vault 保护”作为连接服务包括在内时,它不会显示在列表中。我正在运行最新版本的 Visual Studio 2019 Professional。我已经更新甚至重新安装了VS,但它仍然没有显示。控制台应用程序是否不允许拥有 Key Vault?

Web 作业如何使用 MSI 与 Key Vault 配合使用?

标签: azureazure-webjobsazure-keyvault

解决方案


当然,您可以使用 Azure Web 应用程序 MSI 在 Azure 控制台应用程序 Web 作业中访问您的密钥保管库。我实现了一个简单的控制台应用程序 webjobs 演示,它为您从密钥库中读取一个秘密,请尝试以下代码:

using Microsoft.Azure.KeyVault;
using Microsoft.Azure.KeyVault.Models;
using Microsoft.Azure.Services.AppAuthentication;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace kvtest
{
    class Program
    {
        static void Main(string[] args)
        {
            var keyVaultName = "<your key vault name>";
            var secretName = "<your secret name>";
            Console.WriteLine("Get " + secretName + " from key vault :" + GetSecret(secretName, keyVaultName).GetAwaiter().GetResult());
        }

        public static async Task<string> GetSecret(string secretName,string keyVaultName)
        {
            try
            {
                return (await GetClient().GetSecretAsync("https://"+ keyVaultName + ".vault.azure.net/", secretName)).Value;
            }

            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        public static async Task<string> GetAccessTokenAsync()
        {
            AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
            return await azureServiceTokenProvider.GetAccessTokenAsync("https://vault.azure.net");
        }

        private static KeyVaultClient GetClient()
        {
            AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
            KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
            return keyVaultClient;
        }
    }
}

发布到 Azure webapp 并手动运行它,检查它的日志,我们可以看到它已经成功地从 Key vault 中获取了秘密值:

在此处输入图像描述

顺便说一句,在运行此演示之前,请确保您已为您的 Azure webapp 启用 MSI,并且您已在 Azure 密钥库中为其配置了访问策略。

如果您有任何进一步的疑虑,请随时告诉我。


推荐阅读