Azure Key Vault returns 秘密,即使在禁用设置后也是如此

Azure Key Vault returns secret even after disabling setup

我正在为一个业余项目试验 Azure Key Vault。起初,我在本地开发,但现在我的数据库在 Azure 中。所以我希望这个连接字符串在 Key Vault 中是安全的。我设法通过 visual studio 中的连接服务选项做到了。连接已建立,一切都按预期工作。 不过,现在我想在开发中使用 appsettings.json 中的配置值访问本地数据库。我认为通过将设置包装在 program.cs 中的 ConfigureAppConfiguration 委托中,如下所示将绕过 Key Vault 并转到本地应用程序设置。但是当 运行 这段代码时,我仍然得到 Key Vault 秘密值(并且在调试中跳过代码(因此 IsDevelopment 为真)

            if (!context.HostingEnvironment.IsDevelopment())
            {
                var builtConfig = config.Build();
                var keyVaultEndpoint = GetKeyVaultEndpoint();
                if (!string.IsNullOrEmpty(keyVaultEndpoint))
                {
                    var azureServiceTokenProvider = new AzureServiceTokenProvider();
                    var keyVaultClient = new KeyVaultClient(
                        new KeyVaultClient.AuthenticationCallback(
                            azureServiceTokenProvider.KeyVaultTokenCallback));
                    config.AddAzureKeyVault(
                        keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
                }
            }

所以我的问题是;

  1. 还有其他人遇到过这种奇怪的行为吗?
  2. 如何正确处理关闭本地计算机上的密钥保管库

为此,我通常使用环境变量而不是访问 Program class 中的托管环境。由于 keyvault 可能会更改,因此我将 keyvault 存储为生产中的环境变量。我现在可以将函数定义为:

string GetKeyVaultEndpoint() => Environment.GetEnvironmentVariable("KeyVaultURL");

这里"KeyVaultURL"是存储URL端点的环境变量名。一旦你的函数是这样定义的,你可以简单地检查它是否 returns null。如果它 returns null 您可以跳过密钥保管库设置。这样,即使您将网站移动到您选择使用其他东西而不是密钥保管库的位置,即使在生产环境中也不会有任何问题。

事实证明,这毕竟不是代码和密钥库。在实施 keyvault 之前,我已经对用户机密进行了试验,结果证明这仍然在我的配置提供程序中执行。当我调试时,我查看了 IConfiguration.Providers 的内容,发现我的设置存在于位于我计算机上的 secrets.json 中。

C:\Users\Username\AppData\Roaming\Microsoft\UserSecrets\e53d8827-fdcb-496d-8290-9ff7fcf0ec04

我希望遇到这个问题的其他人不用再研究代码了