У меня есть следующий обработчик аутентификации:
public class CustomAuthenticationHandler : AuthenticationHandler<CustomAuthenticationSchemeOptions>
{
public CustomAuthenticationHandler (
IOptionsMonitor<CustomAuthenticationSchemeOptions> options,
ILoggerFactory logger,
UrlEncoder encoder,
ISystemClock clock) : base(options, logger, encoder, clock)
{
}
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
var data = await GetDataFromDatabase(); //heavy load
if(data.IsAuth)
{
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));
}
return Task.FromResult(AuthenticateResult.Failed("Not authenticated"));
}
}
Я регистрирую его так в ConfigureServices
:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CustomAuthenticationSchemeOptions.SchemeName;
options.DefaultChallengeScheme = CustomAuthenticationSchemeOptions.SchemeName;
})
.AddScheme<CustomAuthenticationSchemeOptions, CustomAuthenticationHandler>(CustomAuthenticationSchemeOptions.SchemeName, null);
Затем я использую его так в Configure
:
app.UseAuthentication();
У меня есть несколько Controllers
с несколькими Actions
.Некоторые из этих действий должны быть доступны только после аутентификации.
Я думал, что если я использую атрибут [Authorize]
, я требую, чтобы только аутентифицированные пользователи имели доступ к oot, поэтому мое промежуточное программное обеспечение будет вызываться с этим запросом ипротокол аутентификации выполняется (я думаю, это было бы очень элегантное и эффективное решение).
public class RegisterController: ControllerBase
{
public async Task<AsyncResult<int>>> Reg(string name)
{
//...
}
}
[Authorize]
public class DataController: Controller
{
public async Task<AsyncResult<Data>>> GetData(int dataId)
{
//...
}
}
Кажется, что я ошибся, поскольку каждое промежуточное ПО вызывается каждый раз когда приходит запрос .
Поэтому, если я не хочу выполнять поиск в базе данных после каждого запроса Action
, я должен фильтровать, когда используется промежуточное программное обеспечение.
Я вижу какое-то решение на основе условий для использования app.UseWhen
и протестируйте путь запроса и другие громоздкие способы.
Есть ли более элегантный и эффективный способ?Поскольку у меня много действий, я не могу создать проверку пути для каждого из них.