即使禁用设置,Azure Key Vault也会返回秘密

时间:2019-01-28 20:34:59

标签: azure .net-core azure-keyvault

我正在尝试使用Azure Key Vault进行一项业余项目。最初,我是在本地开发的,但是现在我的数据库在Azure中。因此,我希望此连接字符串在Key Vault中安全。我设法通过Visual Studio中的连接服务选项进行操作。建立连接,一切正常。 仍然,现在我想在开发中使用来自appsettings.json的config值访问本地数据库。我认为,通过将设置包装在program.cs中的ConfigureAppConfiguration委托中,如下所示将绕过Key Vault并转到本地appsettings。但是在运行此代码时,我仍然会获得Key Vault的机密值(并且在调试时,代码会被跳过(因此IsDevelopment为true)

            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. 如何正确处理在本地计算机上切换密钥库的问题

2 个答案:

答案 0 :(得分:0)

为此,我通常不使用Program类中的Hosting环境,而使用环境变量。由于密钥库可能会更改,因此我将密钥库存储为生产环境变量。我现在可以将函数定义为:

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

此处“ KeyVaultURL”是存储URL端点的环境变量名称。这样定义函数后,您只需检查它是否返回null。如果返回null,则可以跳过密钥库设置。这样,即使您将网站移动到选择使用其他方式(而不是密钥库)的位置,即使在生产环境中也不会出现问题。

答案 1 :(得分:0)

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

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

我希望其他有此问题的人可以免于挖掘代码