我正在尝试将 Blazor WASM 应用程序发布到 Azure 上的 Windows 应用服务服务器,但当我尝试发布该应用程序时,我的 Azure Key Vault 遇到问题,导致其无法发布。
当我第一次在 Visual Studio 中设置发布设置时,它引导我连接到各种服务依赖项。正如您在此处看到的那样,我能够很好地连接到它们:
当我创建与 Azure Key Vault 的连接时,我注意到该过程的一部分向我的 program.cs 文件添加了 2 行代码。这是它添加的两行:
var keyVaultEndpoint = new Uri(Environment.GetEnvironmentVariable("VaultUri"));
builder.Configuration.AddAzureKeyVault(keyVaultEndpoint, new DefaultAzureCredential());
这使得我的应用程序在启动时连接到我的 Azure Key Vault,然后从那时起它从 Key Vault 而不是我的 appsettings.json 文件获取我的秘密。然而,这就是我的问题开始的地方。
第一个问题是,当我在调试模式下运行我的应用程序时,它会很好地连接到密钥保管库,但是当我运行发布工具时,“Environment.GetEnvironmentVariable("VaultUri")”行失败并返回 NULL,因此我的应用程序崩溃并且无法发布。
谁能告诉我为什么当我在 Visual Studio 调试器中运行应用程序时这条线工作正常但在发布时失败的原因?就好像发布者完全忽略了它刚刚帮助我设置的服务依赖项。为什么?
下一个问题是,我不希望我的应用程序始终从我的生产密钥库中获取机密,即使在调试时也是如此。我想在调试时使用本地机密和应用程序设置,而不是生产机密和应用程序设置。因此,我只是添加了一个“if (builder.Environment.IsDevelopment())”并进行了更改,以便它仅在生产时连接到我的密钥保管库(并从中获取机密)。
这非常适合本地开发和调试。但是现在,当我尝试发布我的应用程序时,实体框架迁移设置中有一行如下所示,导致它在发布时再次失败:
它正在尝试从密钥保管库获取数据库连接字符串(正如它正确应该的那样),但它当然不能这样做,因为:
那么对于第 22 条军规的情况我该怎么办?理想情况下,我需要让发布者像在生产模式下一样运行,并将其连接到密钥保管库,但我不知道这是否是正确的处理方式,或者是否可能。有人可以帮忙吗?
这是添加的两行:
是的,当您从 Connected Services 添加 Key Vault 时,我们的应用程序将自动使用默认代码进行配置,以配置 Key Vault 以获取机密。
并在环境变量中添加 Vault URI,如下所示。
Properties
=> Debug
=> General
中查看相同内容
'Environment.GetEnvironmentVariable("VaultUri")' 失败并返回 NULL,因此我的应用程序崩溃并且无法发布。
在 Blazor 应用程序中,配置文件必须位于
wwwroot
目录中。
方式一:
由于 VaultURI 添加到环境变量中,该值仅适用于本地实例。
ApplicaionDBContext
的方式相同)。方式2:
在
appsettings.json
文件中添加 Key Vault URI。
appsettings.json
文件:
{
"VaultURI": "https://KVName.vault.azure.net/"
}
并更改代码行
var keyVaultEndpoint = new Uri(Environment.GetEnvironmentVariable("VaultUri"));
到
var url = builder.Configuration.GetValue<string>("VaultURI");
发布结果: