Как использовать требуемую (ограниченную) службу при использовании AddAuthentication во время ConfigureServices в ASP.NET Core 3.0? - PullRequest
0 голосов
/ 03 октября 2019

В моем методе ASP.NET Core 3.0 ConfigureServices (класс Startup) мне нужно добавить аутентификацию на различных сторонних провайдерах идентификации (IdP) - и я храню эту информацию в базе данных.

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

Код ниже работает , но я получаю предупреждение о создании дополнительных экземпляров синглетонов из-за использования BuildServiceProvider().

Мне интересно, есть ли лучший способ для меня добавить эти IdP, хранимые в базе данных, в микс аутентификации, не вызывая этих дубликатов.

services.AddScoped<IIdentityServerRepository, IdentityServerRepository>();

var issuerUri = _config.GetValue<string>("MyIssuerUri");

var identityRepo = services.BuildServiceProvider().GetService<IIdentityServerRepository>();
services.AddAuthentication()
   .AddIdentityProviders(identityRepo, issuerUri);

Вот некоторые (не все)класса метода расширения, в котором определен AddIdentityProviders:

public static class IdentityProviderHelper
{
    public static AuthenticationBuilder AddIdentityProviders(this AuthenticationBuilder builder, 
        IIdentityServerRepository repo, string issuerUri)
    {
        builder.AddAzureAdProvider(repo);
        builder.AddOpenIdConnectProviders(repo);
        builder.AddSamlProviders(repo, issuerUri);
        return builder;
    }

    private static AuthenticationBuilder AddAzureAdProvider(this AuthenticationBuilder builder, IIdentityServerRepository repo)
    {
        var azureConfig = repo.GetProviderConfigurationByName(ProviderEnum.AzureActiveDirectory).FirstOrDefault();
        if (azureConfig == null) return builder;

        return builder.AddOpenIdConnect(azureConfig.AuthenticationType, azureConfig.Description, options => SetOidcOptions(azureConfig, options));
    }

...
}
...