C# 在ASP.NET Core 3.0中的ConfigureServices期间使用AddAuthentication时,如何利用所需(作用域)服务?
在我的ASP.NET Core 3.0C# 在ASP.NET Core 3.0中的ConfigureServices期间使用AddAuthentication时,如何利用所需(作用域)服务?,c#,asp.net-core,dependency-injection,C#,Asp.net Core,Dependency Injection,在我的ASP.NET Core 3.0ConfigureServices方法(Startupclass)中,我需要在各种第三方身份提供程序(IDP)上添加身份验证,并将该信息存储在数据库中 我将数据库存储库添加为一个范围服务,然后定义了一个扩展方法,该扩展方法使用该repo来查找IdP配置,并将其他IdP添加到应用程序的身份验证中 下面的代码可以正常工作,但我收到了一条警告:由于使用BuildServiceProvider(),正在创建更多的单例实例 我想知道是否有更好的方法可以将这些数据库存储
ConfigureServices
方法(Startup
class)中,我需要在各种第三方身份提供程序(IDP)上添加身份验证,并将该信息存储在数据库中
我将数据库存储库添加为一个范围服务,然后定义了一个扩展方法,该扩展方法使用该repo来查找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
方法来自哪里?它是我自己的扩展方法。如果有帮助的话,我可以提供示例代码——它只是使用repo获取一些数据,然后调用AddOpenIdProvider()等方法。
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));
}
...
}