由于某種原因,我們無法在啟動時從 Azure KeyVault 檢索機密值。雖然秘密似乎在通過 IConfiguration 介面的程序中使用的方法中可用。我想我們在某處做錯了,或者可能是來自 Azure 的資料可用,僅服務初始化已完成。
我們正在使用 .net core 3.1 web api 和 Azure Key Vault Managed Identity。
這是與之相關的代碼。如果你看到任何奇怪的東西,請告訴我。
我們擁有的 KeyVault 秘密名稱:MyApp-AppSettings--Key
在 Program.cs 中
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
var configurationRoot = ConfigurationBuilder.Build();
var keyVaultUrl = configurationRoot["KeyVaultUrl"];
config.AddAzureKeyVault(new Uri(keyVaultUrl), new DefaultAzureCredential(), new PrefixKeyVaultSecretManager("myApp"));
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
我們的啟動檔案如下所示。
public class Startup
{
public Startup(IWebHostEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
ContentRootPath = env.ContentRootPath;
}
public IConfiguration Configuration { get; }
public string ContentRootPath { get; set; }
public void ConfigureServices(IServiceCollection services)
{
services.AddHsts(options =>
{
options.Preload = true;
options.IncludeSubDomains = true;
options.MaxAge = TimeSpan.FromDays(365);
});
**var conf = Configuration.GetSection("AppSettings").Get<Config>();**
**services.Configure<Config>(Configuration.GetSection("AppSettings"));**
**services.AddSingleton<IAppSettings>(c => conf);**
services.RegisterStorage(new StorageConfiguration
{
ConnectionString = "ConnectionString",
Key = Convert.FromBase64String(**conf.Key**) // conf.Key is "". Does not work
});
services.AddScoped<IProcessHandler, ProcessHandler>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHsts();
app.UseHttpsRedirection();
app.UseHttpStatusCodeExceptionMiddleware();
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
private static void LoadMediatorHandlers(IServiceCollection services)
{
foreach (var assembly in Assembly
.GetEntryAssembly()
.GetReferencedAssemblies()
.Select(Assembly.Load)
.Where(name => (name.FullName.Contains("Queries") || name.FullName.Contains("Commands"))))
{
services.AddMediatR(assembly);
}
services.AddMediatR(typeof(Startup));
services.AddScoped<IMediator, Mediator>();
}
}
當我們在程序中呼叫 ProcessXyz 方法時,該值在 IProcessHandler 中可用。這樣做是為了測驗我們是否能夠從 KeyVault 中檢索值。
public class ProcessHandler : IProcessHandler
{
private readonly IConfiguration _configuration;
public ProcessHandler(IConfiguration configuration)
{
_configuration = configuration;
}
public async Task<ClassA> ProcessXyz()
{
var KeyVaultValue = _configuration["AppSettings:Key"]; //This works
}
}
請注意:我剛剛添加了所需的代碼并替換了實際名稱以解決安全問題。
提前致謝
uj5u.com熱心網友回復:
在啟動建構式中,創建一個新的配置生成器,它具有一組有限的源并且缺少 Azure Key Vault 提供程式。因此,也許您可??以注入 DI 容器中現成的配置構建器,而不是創建一個新的配置構建器。
所以用這個改變啟動建構式。
public Startup(IWebHostEnvironment env, IConfiguration configuration)
{
Configuration = configuration;
ContentRootPath = env.ContentRootPath;
}
然后在 Program 類中準備的配置將用于將其注入到啟動設定中,從而采用所有不同的默認源配置(包括命令列源)和額外添加的源。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/438397.html
標籤:天蓝色 asp.net 核心 .net-core 天蓝色密钥库 .net-core-3.1
