Отже, після довгого дня спроб вирішити цю проблему, я нарешті зрозумів, як 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();
}
}