【问题标题】:How to use Azure Key-vault to retrieve connection string then set to AzureWebJobsServiceBus for ServiceBusTrigger如何使用 Azure Key-vault 检索连接字符串,然后为 ServiceBusTrigger 设置为 AzureWebJobsServiceBus
【发布时间】:2019-09-17 20:34:40
【问题描述】:

如果我在 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;
    }));
}

【问题讨论】:

    标签: azure azure-functions connection-string servicebus azure-keyvault


    【解决方案1】:

    这实际上比您尝试的要简单得多;)请参阅here。 KeyVault 与 Azure Functions / App Services 原生集成,用于安全存储设置。

    在您的 local.settings.json 中,您按原样使用连接字符串(以纯文本形式)。此文件从未签入。

    在 Azure 中,您有一个同名的应用程序设置,但不是放置纯文本连接字符串,而是将引用放置在 KeyVault 设置中,如下所示:

    @Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931)
    

    您唯一需要做的就是启用函数的托管身份并在 KeyVault 中授予该身份读取权限。

    【讨论】:

    • 我尝试在 local.settings.json 中添加 [ "AzureWebJobsServiceBus": @Microsoft.KeyVault(SecretUri=xxx.vault.azure.net/secrets/ServiceBus/xxxxxx) ] 但还有另一个错误:在 local.settings.json 中缺少 AzureWebJobsStorage 的值.这对于除 HTTP 之外的所有触发器都是必需的。您可以运行“func azure functionapp fetch-app-settings ”或在 local.settings.json 中指定连接字符串。
    • 您需要启用托管标识并向您的函数应用授予 get secret 权限
    • 正如我在答案中所写:在 local.settings.json 中,您不得使用 KeyVault 引用的版本。仅在 Azure AppSettings 中。
    猜你喜欢
    • 2019-08-11
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2021-04-29
    • 2019-12-17
    • 2020-02-09
    相关资源
    最近更新 更多