简短的问题陈述:
如何从 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)
吗?