Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET Core 3.0中的ConfigureServices期间使用AddAuthentication时,如何利用所需(作用域)服务?_C#_Asp.net Core_Dependency Injection - Fatal编程技术网

C# 在ASP.NET Core 3.0中的ConfigureServices期间使用AddAuthentication时,如何利用所需(作用域)服务?

C# 在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(),正在创建更多的单例实例 我想知道是否有更好的方法可以将这些数据库存储

在我的ASP.NET Core 3.0
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));
    }

...
}