将应用程序发布到 Azure 应用服务时连接到 Key Vault 时出现问题

问题描述 投票:0回答:1

我正在尝试将 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())”并进行了更改,以便它仅在生产时连接到我的密钥保管库(并从中获取机密)。

这非常适合本地开发和调试。但是现在,当我尝试发布我的应用程序时,实体框架迁移设置中有一行如下所示,导致它在发布时再次失败:

它正在尝试从密钥保管库获取数据库连接字符串(正如它正确应该的那样),但它当然不能这样做,因为:

  1. 我必须对其进行更改,以便它在处于开发模式时不会运行连接到密钥保管库的代码,并且
  2. 即使它确实运行了密钥保管库连接代码,它仍然会失败并返回 null

那么对于第 22 条军规的情况我该怎么办?理想情况下,我需要让发布者像在生产模式下一样运行,并将其连接到密钥保管库,但我不知道这是否是正确的处理方式,或者是否可能。有人可以帮忙吗?

azure-web-app-service azure-keyvault visual-studio-publish
1个回答
0
投票

这是添加的两行:

是的,当您从 Connected Services 添加 Key Vault 时,我们的应用程序将自动使用默认代码进行配置,以配置 Key Vault 以获取机密。

并在环境变量中添加 Vault URI,如下所示。

enter image description here

  • 您可以在
    Properties
    =>
    Debug
    =>
    General
    中查看相同内容 enter image description here

'Environment.GetEnvironmentVariable("VaultUri")' 失败并返回 NULL,因此我的应用程序崩溃并且无法发布。

在 Blazor 应用程序中,配置文件必须位于

wwwroot
目录中。

enter image description here

  • 我们可以通过两种方式解决这个问题

方式一:

由于 VaultURI 添加到环境变量中,该值仅适用于本地实例。

  • 在发布应用程序时,我们还需要将 VaultURI 值添加到 Azure 应用程序设置中(与添加
    ApplicaionDBContext
    的方式相同)。

enter image description here

enter image description here

方式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");

发布结果:

© www.soinside.com 2019 - 2024. All rights reserved.