C# 在AddOpenIdConnect中获取ServiceProvider,而不使用BuildServiceProvider()

C# 在AddOpenIdConnect中获取ServiceProvider,而不使用BuildServiceProvider(),c#,asp.net-core,dependency-injection,openid-connect,asp.net-core-3.1,C#,Asp.net Core,Dependency Injection,Openid Connect,Asp.net Core 3.1,有没有一种好方法可以让AddOpenIdConnect、或中的服务提供者稍后在完全设置DI容器的地方配置ClientSecret?(例如,在配置(IApplicationBuilder应用程序)中) 我们从其他地方获得客户机密,我们喜欢使用DI 目前我们正在这样做,但我确实希望删除services.BuildServiceProvider() //此方法由运行时调用。使用此方法向容器中添加服务。 public void配置服务(IServiceCollection服务) { services.A

有没有一种好方法可以让
AddOpenIdConnect
中的
服务提供者
稍后在完全设置DI容器的地方配置ClientSecret?(例如,在
配置(IApplicationBuilder应用程序)
中)

我们从其他地方获得客户机密,我们喜欢使用DI

目前我们正在这样做,但我确实希望删除
services.BuildServiceProvider()

//此方法由运行时调用。使用此方法向容器中添加服务。
public void配置服务(IServiceCollection服务)
{
services.AddOpenIdConnect(AuthenticationScheme,选项=>
{
ServiceProvider ServiceProvider=services.BuildServiceProvider();//我们希望防止这种情况发生
options.ClientSecret=serviceProvider.GetRequiredService().GetClientSecret();
笔记 对于像
OnValidatePrincipal
这样的事件,我们可以从
CookieValidatePrincipalContext.HttpContext.RequestServices

使用
services.BuildServiceProvider()
将发出以下警告:

警告“从应用程序代码调用'BuildServiceProvider'会导致创建一个额外的单例服务副本”


身份验证的配置系统使用。这意味着以下方法将具有与问题中所示方法类似的效果:

services.AddAuthentication()
    .AddOpenIdConnect(AuthenticationScheme, options =>
    {
        // ...
    });

services.Configure<OpenIdConnectOptions>(AuthenticationScheme, options =>
{
    options.ClientSecret = "ClientSecret";
});
services.AddAuthentication()
.AddOpenIdConnect(AuthenticationScheme,选项=>
{
// ...
});
配置(AuthenticationScheme,选项=>
{
options.ClientSecret=“ClientSecret”;
});
这是很有用的,因为选项模式使用了如下内容:

services.AddOptions<OpenIdConnectOptions>(AuthenticationScheme)
    .Configure<ISecretRetriever>((options, secretRetriever) =>
    {
        options.ClientSecret = secretRetriever.GetClientSecret();
    });
services.AddOptions(AuthenticationScheme)
.Configure((选项,secretRetriever)=>
{
options.ClientSecret=secretRetriever.GetClientSecret();
});
要访问与DI一起使用的
Configure
方法,必须首先调用
AddOptions
。在本例中,
Configure
提供一个单一类型的参数,该参数表示所需的依赖项。该参数作为
OpenIdConnectOptions之后的第二个参数传递到配置回调中正在配置的实例