azure - 用于控制台应用程序 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 配合使用?
解决方案
当然,您可以使用 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 密钥库中为其配置了访问策略。
如果您有任何进一步的疑虑,请随时告诉我。
推荐阅读
- c# - 同一个方法多次执行时如何获取 ScenarioContext?
- android - 未找到与给定名称匹配的资源(位于“layout_above”,值为“@id/adView”)。即使在 AdView 拥有该 ID 之后
- google-chrome - Chrome 谷歌云消息
- c++ - 是否可以在 C++ 中在运行时构建变量名?
- node.js - 使用 NodeJS 进行 Active Directory 身份验证
- c# - 如何根据asp.net中的第一个文本框日期在第二个文本框中设置日期
- sql - SQL 有什么方法可以提高多列上“like”查询的性能?
- reactjs - 单击 react-wavesurfer 中的按钮时删除 1 个区域
- python - 如何在python的嵌套json中保存多维列表的元素
- batch-file - 批量获取for循环的所有结果(%%a %%b %%c ... %%z)