简短的问题陈述:
如何从 Cloud Foundry CredHub 获得价值以在内部使用ConfigureServices(IServiceCollection services)?
现有条件:
假设我有一个SystemConfig用于保存配置值的类。我在“开发”阶段使用 json 文件和 dotnet 机密的组合来存储这些值,并且可以通过以下方式检索它们
services.Configure<SystemConfig>(Configuration.GetSection("GLOBAL"));
在“SIT”阶段,我使用 Pivotal Cloud Foundry 来托管应用程序,并使用 ConfigServer - CredHub 的组合来存储配置值。CredHub 中的值可以通过内部Configure(IApplicationBuilder app)检索
var credhub = app.ApplicationServices.GetService<IOptions<CloudFoundryServicesOptions>>().Value.Services["credhub"].First(x => x.Name.Equals("credhub-instance"));
var sysConfig = app.ApplicationServices.GetService<IOptions<SystemConfig>>().Value;
sysConfig.SAMPLE_A = credhub.Credentials[nameof(sysConfig.SAMPLE_A)].Value;
当我需要从IdentityModel.AspNetCore内部配置访问令牌管理时,就会出现问题ConfigureServices:
services.AddAccessTokenManagement(x =>
{
x.Client.Clients.Add("key_sample", new IdentityModel.Client.ClientCredentialsTokenRequest()
{
Address = "sysConfig.SAMPLE_A",
ClientId = "taken from sysConfig as well",
ClientSecret = "taken from sysConfig as well"
});
});
该方法AddAccessTokenManagement只能在内部使用,ConfigureService(IServiceCollection services)但同时我还没有来自 CredHub 的值,因为它们是在内部检索的Configure(IApplicationBuilder app)。
也不推荐使用 ,services.BuildServiceProvider()因为它会创建可能导致意外错误的单例服务的额外副本。
所以问题归结为:
- 我们可以在里面检索 CredHub 值
ConfigureService(IServiceCollection services)吗? - 如果不可能,那么我们可以以某种方式设置
AddAccessTokenManagement在里面Configure(IApplicationBuilder app)吗?