首页 > 解决方案 > 如何使用自定义服务在 ASP.NET Core 3.1 中注册身份验证提供程序?

问题描述

我有一个使用 Identity 对用户进行身份验证的 ASP.NET Core 3.1 应用程序。我想配置身份以允许来自不同提供商(如 Facebook 和 Twitter)的外部登录。

我有多个外部登录提供程序存储在数据库中。可以使用IAuthProvider服务访问这些记录。

当使用该ConfigureServices()方法配置应用程序时,我想解析一个实例IAuthProvider以从数据库中获取所有可用记录,然后添加所需的登录提供程序。

下面是我的代码,我正在努力解决方法IAuthProvider中的实例ConfigureServices()。也许有更好的方法来配置或推迟配置提供程序,但不知道如何以及在哪里配置服务器。

如何创建一个实例IAuthProvider并正确配置身份提供程序?

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AppDbContext>(options =>
    {
        options.UseMySql(Configuration.GetConnectionString("MySql"));
    });
    services.AddScoped<IAuthProvider, AuthProvider>();
    // other services

    var providers = // Here I somehow need to resolve an instance of IAuthProvider;

    AuthenticationBuilder authBuilder = services.AddAuthentication();

    foreach (var provider in providers.All())
    {
        if (provider.Name == ExternalLoginProvider.Facebook)
        {
            authBuilder.AddFacebook(options =>
            {
                options.AppId = provider.AppId;
                options.AppSecret = provider.Secret;
            });
        }

        if (provider.Name == ExternalLoginProvider.Twitter)
        {
            authBuilder.AddTwitter(options =>
            {
                options.ConsumerKey = provider.AppId;
                options.ConsumerSecret = provider.Secret;
            });
        }
        // Other providers as needed per the records found in the database
    }
}

标签: asp.net-core.net-coreidentityasp.net-core-identityasp.net-core-3.1

解决方案


我看到您的代码已经注册了 IAuthProvider 的实现,您可以简单地调用 servcice.GetService() 来获取 AuthProvider 的实例。我不明白您以这种方式拥有不同的 authprovider,根据此文档,您可以像这样在链中添加不同的 auth provider:

services.AddAuthentication()
    .AddMicrosoftAccount(microsoftOptions => { ... })
    .AddGoogle(googleOptions => { ... })
    .AddTwitter(twitterOptions => { ... })
    .AddFacebook(facebookOptions => { ... });

有什么理由单独添加它们?

编辑:

如果您只想获取 IAuthProvider 的实例,请尝试

var serviceProvider = services.BuildServiceProvider();
var provider = serviceProvider.GetService<IAuthProvider>();

推荐阅读