Получение ServiceProvider внутри AddOpenIdConnect без BuildServiceProvider () - PullRequest
3 голосов
/ 17 июня 2020

Есть ли хороший способ получить ServiceProvider в AddOpenIdConnect, или , настроить ClientSecret позже, когда у нас полностью настроен контейнер DI? (например, в Configure(IApplicationBuilder app))

Мы получаем секрет клиента откуда-то еще, и нам нравится использовать для этого DI.

В настоящее время мы делаем это, но мне очень нравится удалять services.BuildServiceProvider()

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddOpenIdConnect(AuthenticationScheme, options =>
    {
        ServiceProvider serviceProvider = services.BuildServiceProvider(); // we like to prevent this
        options.ClientSecret = serviceProvider.GetRequiredService<ISecretRetriever>().GetClientSecret();

Примечания

Для таких событий, как OnValidatePrincipal, мы могли бы получить его из CookieValidatePrincipalContext.HttpContext.RequestServices

Использование services.BuildServiceProvider() выдаст следующее предупреждение:

предупреждение «Вызов BuildServiceProvider из кода приложения приводит к созданию дополнительной копии служб Singleton»

1 Ответ

3 голосов
/ 18 июня 2020

Система конфигурации для аутентификации использует шаблон Параметры . Это означает, что следующий подход будет иметь эффект аналогичный подходу, показанному в вашем вопросе:

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

services.Configure<OpenIdConnectOptions>(AuthenticationScheme, options =>
{
    options.ClientSecret = "ClientSecret";
});

Это полезно, потому что шаблон параметров поддерживает DI , используя что-то вроде следующего:

services.AddOptions<OpenIdConnectOptions>(AuthenticationScheme)
    .Configure<ISecretRetriever>((options, secretRetriever) =>
    {
        options.ClientSecret = secretRetriever.GetClientSecret();
    });

Чтобы получить доступ к методу Configure, который работает с DI, вы должны сначала вызвать AddOptions. В этом примере Configure дается аргумент единственного типа, который представляет необходимую зависимость. Он передается в обратный вызов конфигурации в качестве второго параметра после настраиваемого экземпляра OpenIdConnectOptions.

...