Как реализовать AuthenticationHandler, который проверяет базу данных, требуется ли вход в систему и, если это так, делегирует существующую схему аутентификации? - PullRequest
0 голосов
/ 09 марта 2020

Как реализовать пользовательский AuthenticationHandler, который проверяет базу данных, требуется ли аутентификация и, если это так, делегирует существующую схему аутентификации AzureAD?

Требуется сделать аутентификацию переключаемой с использованием флага в базе данных (независимо от того, выполняется ли она или нет). в режиме разработки или производства).

Если аутентификация включена, следует использовать схему аутентификации AzureAD.

На приведенной ниже схеме показан запрос, поступающий в конвейер промежуточного программного обеспечения.

  1. Обработчик Custom AuthN сначала проверяет таблицу базы данных, если вход в систему включен.
  2. В этом случае управление передается схеме аутентификации AzureAD.
  3. В противном случае управление передается следующему компоненту промежуточного программного обеспечения (пропуск аутентификации).

            request
               +
               |
               |
               |
               v
    +-----------------------+
    |  Custom AuthN Handler |
    |                       |
    |                       |
    |   +----------+        |
    |   | DB Table |        |
    |   | Is Login |        |
    |   | Enabled  |        |
    |   | ?        |        |
    |   +----------+        |
    |     |      |          |
    |     |      |  yes     |
    |     |      v          |
    |     |   +---------+   |
    |     |   | AzureAD |   |
    |     |   | AuthN   |   |
    |     |   |         |   |
    |     |   +---------+   |
    |     |      |          |
    |     |      |          |
    |     v      v          |
    +-----------------------+
              |
              |
              |
              v
    
       rest of middleware
       pipeline
    

Вот моя попытка в коде

public class MyAuthenticationHandler : AuthenticationHandler<MyAuthenticationOptions>
{
    public POAuthenticationHandler(IOptionsMonitor<POAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
        : base(options, logger, encoder, clock)
    {

    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        if (isLoginEnabled)
        {
            //How to called AzureAD authentication here?
        }
        else
        {
            var claims = new[] { new Claim(ClaimTypes.Name, "test user") };
            var identity = new ClaimsIdentity(claims, Scheme.Name);
            var principal = new ClaimsPrincipal(identity);
            var ticket = new AuthenticationTicket(principal, Scheme.Name);

            return Task.FromResult(AuthenticateResult.Success(ticket));
        }
    }
}

Вопросы

  1. Как реализовать такой пользовательский обработчик аутентификации?
  2. В частности: как вызвать обработчик аутентификации AzureAD из пользовательского обработчика?
...