Jadi, setelah seharian mencoba memecahkan masalah ini, akhirnya saya menemukan bagaimana Microsoft ingin kami membuat penangan otentikasi khusus untuk pengaturan middleware tunggal baru mereka di inti 2.0.
Setelah melihat-lihat beberapa dokumentasi di MSDN, saya menemukan kelas yang disebut AuthenticationHandler<TOption>
yang mengimplementasikan IAuthenticationHandler
antarmuka.
Dari sana, saya menemukan seluruh basis kode dengan skema otentikasi yang ada yang terletak di https://github.com/aspnet/Security
Di dalam salah satunya, ini menunjukkan bagaimana Microsoft mengimplementasikan skema otentikasi JwtBearer. ( https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer )
Saya menyalin sebagian besar kode itu ke folder baru, dan membersihkan semua hal yang berkaitan dengannya JwtBearer
.
Di JwtBearerHandler
kelas (yang meluas AuthenticationHandler<>
), ada penggantian untukTask<AuthenticateResult> HandleAuthenticateAsync()
Saya menambahkan di middleware lama kami untuk menyiapkan klaim melalui server token khusus, dan masih mengalami beberapa masalah dengan izin, hanya mengeluarkan 200 OK
alih - alih 401 Unauthorized
ketika token tidak valid dan tidak ada klaim yang disiapkan.
Saya menyadari bahwa saya telah menimpa Task HandleChallengeAsync(AuthenticationProperties properties)
yang karena alasan apa pun digunakan untuk mengatur izin melalui [Authorize(Roles="")]
dalam pengontrol.
Setelah menghapus penggantian ini, kode telah berfungsi, dan berhasil dilempar 401
ketika izin tidak cocok.
Kesimpulan utama dari ini adalah bahwa sekarang Anda tidak dapat menggunakan middleware kustom, Anda harus mengimplementasikannya melalui AuthenticationHandler<>
dan Anda harus mengatur DefaultAuthenticateScheme
dan DefaultChallengeScheme
kapan menggunakan services.AddAuthentication(...)
.
Berikut adalah contoh tampilan semua ini:
Di Startup.cs / ConfigureServices () tambahkan:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = "Custom Scheme";
options.DefaultChallengeScheme = "Custom Scheme";
})
.AddCustomAuth(o => { });
Di Startup.cs / Configure () tambahkan:
app.UseAuthentication();
Buat file baru 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);
}
}
Buat file baru CustomAuthOptions.cs
public class CustomAuthOptions: AuthenticationSchemeOptions
{
public CustomAuthOptions()
{
}
}
Buat file baru 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();
}
}