В моем методе 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));
}
...
}