asp.net-core - 如何使用自定义服务在 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
}
}
解决方案
我看到您的代码已经注册了 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>();
推荐阅读
- python - 在 Django 中显示来自 Id 的 img
- python - lmfit does not fit the only parameter on a simple example that returns a single scalar value
- sql-server - Windows 操作系统升级后应用程序的 SQL Server 2017 文件流失败
- python - 在 Python 中安装 qmcpy
- php - if($_SERVER['REQUEST_METHOD'] == 'POST') 不起作用
- r - 包或命名空间加载失败,vctrs 包未正确安装
- python - 如何使用 sage 找到 spqr 树?
- javascript - 根据用户模型中的变量添加 CCS 类
- windows - Robocopy /mov 记录目标文件夹中的所有文件?
- c# - 为 AppShell.xaml 中指定的页面之外的页面定义路由并导航到这些页面