我有一个 ASP.NET Core 3.1应用程序,它使用Identity对用户进行身份验证。我想配置身份以允许来自不同提供商(如Facebook和Twitter(的外部登录。
我在一个数据库中存储了多个外部登录提供程序。可以使用IAuthProvider
服务访问这些记录。
使用ConfigureServices()
方法配置应用程序时,我想解析IAuthProvider
实例以从数据库中获取所有可用记录,然后添加所需的登录提供程序。
下面是我的代码,我正在努力解决如何在ConfigureServices()
方法中解决IAuthProvider
实例。也许有更好的方法来配置或推迟配置提供程序,但不确定如何以及在何处配置服务器。
如何创建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
}
}
我看到你的代码已经注册了IAuthProvider的实现,你可以简单地调用servcice。GetService(( 获取 AuthProvider 的实例。 我不明白你以这种方式拥有不同的身份验证提供者的意思,根据本文档,您可以在链中添加不同的身份验证提供者,如下所示:
services.AddAuthentication()
.AddMicrosoftAccount(microsoftOptions => { ... })
.AddGoogle(googleOptions => { ... })
.AddTwitter(twitterOptions => { ... })
.AddFacebook(facebookOptions => { ... });
为什么要单独添加它们的任何原因?
编辑:
如果你只想获取IAuthProvider的实例,试试
var serviceProvider = services.BuildServiceProvider();
var provider = serviceProvider.GetService<IAuthProvider>();