Как зарегистрировать провайдера аутентификации для идентификации в ASP. NET Core 3.1, используя пользовательский сервис? - PullRequest
2 голосов
/ 07 февраля 2020

У меня есть ASP. NET Core 3.1 приложение, которое использует Identity для аутентификации пользователей. Я хотел бы настроить Identity для разрешения внешнего входа в систему от разных провайдеров, таких как 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
    }
}

1 Ответ

0 голосов
/ 07 февраля 2020

Я вижу, что ваш код уже зарегистрировал реализацию IAuthProvider, вы можете просто вызвать servcice.GetService (), чтобы получить экземпляр AuthProvider. Я не понимаю вашу точку зрения, что у вас есть другой поставщик аутентификации таким образом, в соответствии с этим документом вы можете добавить другого поставщика аутентификации в цепочку, например:

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

Любая причина, по которой вы добавляете их отдельно?

Редактировать:

Если вы просто хотите получить экземпляр IAuthProvider, просто попробуйте

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