Итак, после долгого дня попыток решить эту проблему, я, наконец, понял, как Microsoft хочет, чтобы мы создавали собственные обработчики аутентификации для их новой установки с одним промежуточным ПО в ядре 2.0.
Просмотрев некоторую документацию в MSDN, я нашел класс, AuthenticationHandler<TOption>
который реализует IAuthenticationHandler
интерфейс.
Оттуда я нашел всю кодовую базу с существующими схемами аутентификации, расположенную по адресу https://github.com/aspnet/Security.
Внутри одного из них показано, как Microsoft реализует схему аутентификации JwtBearer. ( https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer )
Я скопировал большую часть этого кода в новую папку и удалил все, что связано с этим JwtBearer
.
В JwtBearerHandler
классе (который расширяется AuthenticationHandler<>
) есть переопределение дляTask<AuthenticateResult> HandleAuthenticateAsync()
Я добавил в наше старое промежуточное программное обеспечение для настройки утверждений через пользовательский сервер токенов, и по-прежнему сталкивался с некоторыми проблемами с разрешениями, просто выплевывая 200 OK
вместо a, 401 Unauthorized
когда токен был недействительным и не было настроено никаких требований.
Я понял, что переопределил, Task HandleChallengeAsync(AuthenticationProperties properties)
что по какой-то причине используется для установки разрешений [Authorize(Roles="")]
в контроллере.
После удаления этого переопределения код 401
заработал и успешно выдал ошибку, когда разрешения не совпадают.
Главный вывод из этого заключается в том, что теперь вы не можете использовать настраиваемое промежуточное программное обеспечение, вы должны реализовать его через, AuthenticationHandler<>
и вы должны установить DefaultAuthenticateScheme
и DefaultChallengeScheme
при использовании services.AddAuthentication(...)
.
Вот пример того, как все это должно выглядеть:
В Startup.cs / ConfigureServices () добавьте:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = "Custom Scheme";
options.DefaultChallengeScheme = "Custom Scheme";
})
.AddCustomAuth(o => { });
В Startup.cs / Configure () добавьте:
app.UseAuthentication();
Создайте новый файл CustomAuthExtensions.cs
public static class CustomAuthExtensions
{
public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<CustomAuthOptions> configureOptions)
{
return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom Scheme", "Custom Auth", configureOptions);
}
}
Создайте новый файл CustomAuthOptions.cs
public class CustomAuthOptions: AuthenticationSchemeOptions
{
public CustomAuthOptions()
{
}
}
Создайте новый файл CustomAuthHandler.cs
internal class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
public CustomAuthHandler(IOptionsMonitor<CustomAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
{
}
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
return AuthenticateResult.NoResult();
}
}