Как реализовать пользовательский AuthenticationHandler, который проверяет базу данных, требуется ли аутентификация и, если это так, делегирует существующую схему аутентификации AzureAD?
Требуется сделать аутентификацию переключаемой с использованием флага в базе данных (независимо от того, выполняется ли она или нет). в режиме разработки или производства).
Если аутентификация включена, следует использовать схему аутентификации AzureAD.
На приведенной ниже схеме показан запрос, поступающий в конвейер промежуточного программного обеспечения.
- Обработчик Custom AuthN сначала проверяет таблицу базы данных, если вход в систему включен.
- В этом случае управление передается схеме аутентификации AzureAD.
В противном случае управление передается следующему компоненту промежуточного программного обеспечения (пропуск аутентификации).
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));
}
}
}
Вопросы
- Как реализовать такой пользовательский обработчик аутентификации?
- В частности: как вызвать обработчик аутентификации AzureAD из пользовательского обработчика?