如何在部署到 Azure 应用服务的 ASP.NET Core Web 应用程序中以“透明配置值”的形式访问 Azure Key Vault 机密?

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

我的问题是关于透明地读取 Key Vault 中存储的机密作为配置的 C# 代码。例如,目前我有这个 appsettings.json:

"AzureAd": {
 "Instance": "https://login.microsoftonline.com/",
 "Domain": "mydomain.com",
 "TenantId": "...coming from Connected Services/Secrets",
 "ClientId": "...coming from Connected Services/Secrets",
 "ClientSecret": "...coming from Connected Services/Secrets",
 "CallbackPath": "/signin-oidc",
 "Scopes": "access_as_user"

},

在开发时,这些机密是使用服务/机密配置的,因此这些机密不会推送到存储库。

如何在发布版本中使用和配置配置读取器,以透明地从我的 Azure Key Vault 读取这些配置值? 显然,我的意思是,应用程序本身不知道配置的秘密来自哪里?

例如,我有这样的声明

builder.Configuration.GetSection("AzureAd")
,我希望这项工作透明......

(我确实知道如何将 ASP.NET Core 应用程序部署到 Azure 应用程序服务、如何在 Azure Key Vault 中创建机密以及如何将对已部署的应用程序服务的访问权限授予 Key Vault,所以这个问题与这些无关)

asp.net-core configuration azure-keyvault appsettings
1个回答
0
投票

您可以执行以下操作。

您的本地机密应该在您的

secrets.json
。右键单击您的项目:“管理用户机密”。

向您的

IS_LOCAL
引入一个
launchSettings.json
旗帜:

 "Your project Local": {
     "commandName": "Project",
 "launchBrowser": true,
     "applicationUrl": "https://localhost:5000",
     "launchUrl": "api/v2/swagger",
 "environmentVariables": {
     "ASPNETCORE_ENVIRONMENT": "Development",
     "IS_LOCAL": "true"                      
 }

然后在您的

Startup.cs
Program.cs
中:

  if (!env.IsLocal())
  {
      configuration.AddAzureKeyVault(
          new Uri(configuration.GetValue<string>("YourKeyToAzureKeyVaultSetting")),
          new DefaultAzureCredential());
  }

还有你的

Program.cs

 services.Configure<YourConfigurationClass>(configuration);

YourConfiguration
类应该如下所示:

public class YourConfiguration 
{
    public SecretConfiguration Secrets { get; set; }
}

SecretConfiguration
只是一个 POCO 类:

 public class SecretConfiguration
 {
     public string Secret1{ get; set; }
     public string Secret2{ get; set; }
 }

现在您可以在您的服务中透明地注入

YourConfiguration
类 - 它会在本地模式下使用您的
secrets.json
或服务器上的
Azure Key Vault

public class ServiceA (IOptionsSnapshot<YourConfiguration> configuration)
{
      public void SomeMethod()
      {
           var secret1 = configuration.Value.Secrets.Secret1;   
      }
}
© www.soinside.com 2019 - 2024. All rights reserved.