azure - 如何使用 Azure Key-vault 检索连接字符串,然后为 ServiceBusTrigger 设置为 AzureWebJobsServiceBus
问题描述
如果我在 local.settings.json 中设置 AzureWebJobsServiceBus 的连接字符串,则没有错误。但是,我想使用 Azure Key-vault 来防止泄露连接字符串。
以下是我的错误:
Microsoft.Azure.WebJobs.Host:索引方法“MyAzureFunc.Run”出错。Microsoft.ServiceBus:服务总线连接字符串不是预期的格式。字符串中存在意外属性或格式不正确。请检查之前的字符串。再试一次。
这是我的代码:
public static class MyAzureFunc
{
private static readonly SettingsContext _settings;
static MyAzureFunc()
{
_settings = new SettingsContext(new Settings
{
BaseUrl = Environment.GetEnvironmentVariable("BaseUrl"),
ServiceBusConnectionString = Environment.GetEnvironmentVariable("ServiceBus"),
certThumbprint = Environment.GetEnvironmentVariable("CertThumbprint"),
keyVaultClientId = Environment.GetEnvironmentVariable("KeyVaultClientId"),
ServiceBusSecretUrl = Environment.GetEnvironmentVariable("ServiceBusSecretUrl")
});
Environment.SetEnvironmentVariable("AzureWebJobsServiceBus", _settings.ServiceBusConnectionString);
}
[FunctionName("Func")]
public static async Task Run([ServiceBusTrigger(ServiceBusContext.MyQueueName)] BrokeredMessage msg, TraceWriter log)
{
......
}
}
public SettingsContext(Settings settings)
{
new MapperConfiguration(cfg => cfg.CreateMap<Settings, SettingsContext>()).CreateMapper().Map(settings, this);
if (!string.IsNullOrEmpty(settings.certThumbprint) && !string.IsNullOrEmpty(settings.keyVaultClientId))
{
var cert = Helpers.GetCertificate(settings.certThumbprint);
var assertionCert = new ClientAssertionCertificate(settings.keyVaultClientId, cert);
KeyVaultClient = GetKeyVaultClient(assertionCert);
if (ServiceBusConnectionString == "nil" && !string.IsNullOrEmpty(settings.ServiceBusSecretUrl))
{
ServiceBusConnectionString = KeyVaultClient.GetSecretAsync(settings.ServiceBusSecretUrl).Result.Value;
}
}
}
private static KeyVaultClient GetKeyVaultClient(ClientAssertionCertificate assertionCert)
{
return new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(async (string authority, string resource, string scope) =>
{
var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
var result = await context.AcquireTokenAsync(resource, assertionCert);
return result.AccessToken;
}));
}
解决方案
这实际上比您尝试的要简单得多;)请参见此处。KeyVault 与 Azure Functions / App Services 原生集成,用于安全存储设置。
在您的 local.settings.json 中,您按原样使用连接字符串(以纯文本形式)。此文件从未签入。
在 Azure 中,您有一个具有相同名称的应用程序设置,但不是放置纯文本连接字符串,而是将引用放置在您的 KeyVault 设置中,如下所示:
@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931)
您唯一需要做的就是启用函数的托管身份并在 KeyVault 中授予该身份读取权限。
推荐阅读
- android - Google Ad 暴民广告未在 Play 商店构建中显示
- javascript - 过滤 JSON 数组中的数据
- jquery - Angular 6 ngOnInit 第一次不工作
- laravel - Laravel 一页中的所有最新活动
- php - laravel Form::open 和 Form::model 有什么区别
- node.js - 使用 node-imap,我如何将电子邮件移动到另一个文件夹?
- angular - 在 azure 中部署时未在 cookie 中设置防伪令牌
- angular - ngx-datatable cellClass 作为 templateRef 中的函数
- php - 突出显示搜索词
- c# - 读取 MassTransit Response-Request 中的响应标头