我的问题是关于透明地读取 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,所以这个问题与这些无关)
您可以执行以下操作。
您的本地机密应该在您的
。右键单击您的项目:“管理用户机密”。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;
}
}