将 appsettings.json 文件中的机密存储在 Azure Key Vault 上的 .Net 控制台应用程序中

Posted

技术标签:

【中文标题】将 appsettings.json 文件中的机密存储在 Azure Key Vault 上的 .Net 控制台应用程序中【英文标题】:Store secrets from appsettings.json file in .Net Console Application on Azure Key Vault 【发布时间】:2021-12-27 15:14:39 【问题描述】:

我有一个 .Net Core 控制台应用程序,它检索原始数据,然后应用 Kusto 查询,最后将它们上传到 azure。我将客户端机密存储在 appsettings.json 文件中。但是,这不是一个好的做法,因为它们永远不应该存储在那里。我想知道如何将以下信息存储在 appsettings.json 文件中的 Azure Key Vaults(BlobConnectionString、KustoConnectionString、ClientId、ClientSecret、ApplicationInsights Instrumentation Key)上。我找到了一些关于与 .Net Core Web 应用程序相关的 azure key vault 的文档,但我没有找到与 控制台应用程序 相关的任何内容。这样做的具体步骤是什么?我应该先创建一个密钥保管库服务。还是我应该先做点什么?那么我应该如何处理 appsettings.json 中上面提到的键的值,是否有一个代码示例可用于直接检索存储在 Key Vault 中的值,所以当我执行我的代码时,它通常会像以前一样工作.

如果有人能告诉我如何做到这一点,以及是否有任何与同一主题相关的以前的代码示例,我将不胜感激。

【问题讨论】:

【参考方案1】:

可以使用AddAzureKeyVault 将KeyVault 添加到任何.net 核心应用程序,然后以与其他配置提供程序完全相同的方式访问它(文件:appsettings.json、UserSecrets、环境变量)。

完整示例:https://docs.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-6.0

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, config) =>
        
            config.AddAzureKeyVault(
               new SecretClient(
               new Uri("Your Key Vault Endpoint"),
               new DefaultAzureCredential()),
               new AzureKeyVaultConfigurationOptions())
           
               ...
           );
        )

【讨论】:

谢谢您的回答。就我而言,因为它是一个控制台应用程序,所以我没有 IHostBuilder。那么如何使用主 program.cs 文件中的 ConfigureAppConfiguration 呢? 您仍然可以在控制台应用程序中使用 Host.CreateDefaultBuilder。 我只是有一个关于 KeyVault 的问题。使用它有什么要求?我应该在天蓝色上做什么。因为我在 Azure 上没有托管应用程序。它是否仅适用于使用 keyvault 资源,还是我也应该有一个带有活动目录的注册应用程序?我将如何在我的 .NET 控制台应用程序中使用 KeyVault,以便能够将所有密码保存在那里。在您上面提到的 CreateDefaultBuilder 中,假设我有 2 个 json 文件,每个文件都包含秘密信息。如何将两者都配置为使用 keyvault? 如果您当前在 2 个单独的 appsettings.json 中有密码,那么它们都可以移动到一个密钥库中。您的程序将保持完全相同(假设您正在通过 IConfiguration/GetSection/GetValue 等读取配置)。 Json 文件、环境变量、keyvault 都只是简单的键/值存储。 能否请您提供一个有关其工作原理的示例,因为我真的对所有这些 IConfiguration 感到困惑,以便同时使用这两个 appsettings.json 文件。为了配置每个 json 文件,我应该在上面提供的代码中写什么?这个 ConfigureAppConfiguration 是如何工作的?它如何知道使用哪个 json 文件?

以上是关于将 appsettings.json 文件中的机密存储在 Azure Key Vault 上的 .Net 控制台应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

使用VS2017中的AWS无服务器应用程序读取appsettings.json文件

从 .NET Core 2 中的类中读取 appsettings.json

读取 Main Program.cs 中的 appsettings.json

将 Azure Key Vault 机密分配给 Devops 发布管道的连接字符串

用 appsettings.Production.json 中的设置覆盖 appsettings.json 中的数组设置

为 ASP.NET Core 配置引用 appsettings.json 中的另一个 json 文件