当前位置: 首页 > 知识库问答 >
问题:

在构建主机之前从KeyVault获取Azure WebJobs连接字符串

蒋健
2023-03-14

实际上,我试图在Azure密钥存储库秘密后面保护用于AzureWebJobsDashboard和AzureWebJobsStorage的存储连接字符串。我无法使用注入的KeyVault服务来获取它,因为我的服务容器尚未构建。所以我发现(通过上面的链接)我可以在配置中使用“@microsoft.keyvault()”表达式来表达这个意图。下面是一个示例,我将配置移到内联代码中,以保持简洁:

.ConfigureHostConfiguration(configurationBuilder =>
{
    configurationBuilder
        .AddConfiguration(configuration)
        .AddInMemoryCollection(new Dictionary<string, string>
        {
            ["ConnectionStrings:AzureWebJobsDashboard"] = "@Microsoft.KeyVault(SecretUri=https://host.vault.azure.net/secrets/secret-name/ec545689445a40b199c0e0a956f16fca)",
            ["ConnectionStrings:AzureWebJobsStorage"] = "@Microsoft.KeyVault(SecretUri=https://host.vault.azure.net/secrets/secret-name/ec545689445a40b199c0e0a956f16fca)",
        });
})

如果我运行这个,我会得到:

FormatException:找不到有效的帐户信息组合。

共有1个答案

锺离明煦
2023-03-14

我浏览了大量在线资源,所有内容似乎都表明,特殊修饰的@microsoft.keyvault设置仅在Azure门户上的AppSettings中的值起作用,而不是在本地配置中。有人请让我知道如果这是一个不正确的评估。

因此,为了解决这个问题,我提出了一个解决方案,老实说,这个解决方案感觉有点笨拙,因为我依赖于这样一个事实,即连接字符串在主机运行之前(不是在构建期间)不会从本地配置读取/缓存。基本上,这个想法是构建一个配置提供程序,我可以在构建主机后为它设置一个值。例如:

public class DelayedConfigurationSource : IConfigurationSource
{
    private IConfigurationProvider Provider { get; } = new DelayedConfigurationProvider();

    public IConfigurationProvider Build(IConfigurationBuilder builder) => Provider;

    public void Set(string key, string value) => Provider.Set(key, value);

    private class DelayedConfigurationProvider : ConfigurationProvider
    {
        public override void Set(string key, string value)
        {
            base.Set(key, value);
            OnReload();
        }
    }
}

在宿主生成器构造过程中添加对此类型的引用:

var delayedConfigurationSource = new DelayedConfigurationSource();

var hostBuilder = new HostBuilder()
    .ConfigureHostConfiguration(configurationBuilder =>
    {
        configurationBuilder
            .AddConfiguration(configuration)
            .Add(delayedConfigurationSource);
    })
    ...
var host = hostBuilder.Build();

using (host)
{
    var secretProvider = host.Services.GetRequiredService<ISecretProvider>();
    var secret = await secretProvider.YourCodeToGetSecretAsync().ConfigureAwait(false);

    delayedConfigurationSource.Set("ConnectionStrings:AzureWebJobsStorage", secret.Value);

    await host.RunAsync().ConfigureAwait(false);
}
 类似资料:
  • 问题内容: 我需要从两个字符之间获取字符串。我有这个 并且必须在一个变量中分别返回4个字符串: 问题答案: 有。由于它接受正则表达式字符串,并且是正则表达式中的特殊字符,因此您需要对其进行转义(带有反斜杠)。而且,由于是在Java中字符串字面特殊字符,你需要逃脱 它 ,也一样,人们有时会感到迷惑。因此给出: 然后 将输出 ( 在 前三位上 有 尾随空格;如果需要,这些空格。)

  • 我正在使用Azure设备预配服务(DPS)自动向Azure IoT中心注册和预配设备。 我想得到一个特定设备的孪生设备。 我可以通过使用de DeviceClient类来管理设备双胞胎: 但是我想通过使用RegistryManager获取设备,它需要特定IoTHub的连接字符串。 是否可以从DPS、连接的设备或IoT中心名称(即结果)中获取IoT中心连接字符串。AssignedHub)?我正在使用

  • 问题内容: 我想仅匹配URL的根,而不匹配文本字符串中的整个URL。鉴于: 我想将最后2个实例解析为或域。 我听说正则表达式很慢,这将是我在页面上的第二个正则表达式表达式,因此,如果仍然需要不使用正则表达式,请告诉我。 我正在寻找此解决方案的JS / jQuery版本。 问题答案: 我建议使用npm软件包psl公共后缀列表。“公共后缀列表”是所有有效域后缀和规则的列表,不仅包括国家/地区代码顶级域

  • 我已经用SQL Server Management Studio创建了一个数据库,现在我想在我的C#应用程序中使用它。我需要连接字符串? 如何发布数据库,以便Visual Studio可以获取它?然后我就可以拉出那里的连接字符串了?

  • 问题内容: 我正在使用Retrofit1旧样式 现在,我不想获取“ User”类,但是我想要获取String响应。 以前我们使用的是“ Response”,但是在改造2中没有“ Response”, 我如何在不使用任何json解析的情况下从服务器获取字符串响应或全身响应? 问题答案: 建立这个课程 与它一起使用 编辑: 您必须将其定义为 retrofit2不支持回调,因此您必须删除它。要使其异步,

  • 问题内容: 如何使用php从字符串中获取前5个字符 结果应该是这样的 问题答案: 对于单字节字符串(例如US-ASCII,ISO8859系列等),请使用;对于多字节字符串(例如UTF-8,UTF-16等),请使用: