Аутентификация ASP.NET Core 2.0 на основе имени хоста - PullRequest
0 голосов
/ 30 апреля 2018

Я бы сказал, что классическое приложение ASP.NET Core 2.0 с аутентификацией состоит в добавлении требуемой службы аутентификации в методе ConfigureServices в файл Startup.cs :

services.AddAuthentication().AddFacebook(facebookOptions =>
{
    facebookOptions.AppId = Configuration["Authentication:Facebook:AppId"];
    facebookOptions.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
});

Это нормально, если конфигурация аутентификации известна во время вызова метода ConfigurationServices и одинакова для всех запросов.

В нашем случае требуется другая конфигурация аутентификации, скажем, на основе имени хоста:

company1.example.com // has own authentication configuration
company2.example.com // has own (probably different) authentication

Для получения более подробной информации компания1 настроила только Facebook, а компания2 настроила только аутентификацию Google.

Вопрос : Возможно ли иметь разную аутентификацию для каждого хоста или иначе для каждого запроса? Например, когда я знаю компанию, я могу загрузить и использовать конфигурацию аутентификации, относящуюся к этому запросу.

1 Ответ

0 голосов
/ 01 мая 2018

Есть несколько способов сделать это. Включая использование вашего IConfiguration или доступ к контексту http в качестве службы в рамках вашей схемы событий facebook и google. Вот один из самых чистых способов сделать это. Вы можете сделать свою собственную схему примерно так:

public class MyCustomAuth : AuthenticationHandler<AuthenticationSchemeOptions>
{

    public const string SchemeName = "MyCustom";

    public MyCustomAuth(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory 
        logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
    {
    }

    protected override async Task HandleChallengeAsync(AuthenticationProperties properties)
    {
        if (Request.Host.Value == "")
        {
            await Context.ChallengeAsync(GoogleDefaults.AuthenticationScheme);
        }
        await Context.ChallengeAsync(FacebookDefaults.AuthenticationScheme);
    }

    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        if (Request.Host.Value == "")
        {
            return await Context.AuthenticateAsync(GoogleDefaults.AuthenticationScheme);
        }
        return await Context.AuthenticateAsync(FacebookDefaults.AuthenticationScheme);
    }
}

Вы можете добавить все в свой стартап и настроить его так:

services.AddAuthentication(MyCustomAuth.SchemeName)
        .AddCookie(...)
        .AddFacebook(...)
        .AddGoogle(...)
        .AddScheme<AuthenticationSchemeOptions, MyCustomAuth>(MyCustomAuth.SchemeName, opts => { });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...