Bu sorunu çözmeye çalıştığım uzun bir günün ardından nihayet Microsoft'un bizden çekirdek 2.0'daki yeni tek ara yazılım kurulumları için özel kimlik doğrulama işleyicileri yapmamızı istediğini anladım.
MSDN'deki bazı belgelere baktıktan sonra AuthenticationHandler<TOption>
, IAuthenticationHandler
arabirimi uygulayan bir sınıf buldum .
Oradan, https://github.com/aspnet/Security adresinde bulunan mevcut kimlik doğrulama şemalarına sahip tam bir kod tabanı buldum
Bunlardan birinin içinde, Microsoft'un JwtBearer kimlik doğrulama şemasını nasıl uyguladığını gösterir. ( https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer )
Bu kodun çoğunu yeni bir klasöre kopyaladım ve bununla ilgili her şeyi temizledim JwtBearer
.
Gelen JwtBearerHandler
sınıfı (uzandığı AuthenticationHandler<>
) için bir geçersiz kılma varTask<AuthenticateResult> HandleAuthenticateAsync()
Özel bir belirteç sunucusu aracılığıyla talepler oluşturmak için eski ara yazılımımıza ekledim ve hala izinlerle ilgili bazı sorunlarla karşılaşıyordum, bir jeton geçersiz olduğunda ve hiçbir talep kurulmadığında a 200 OK
yerine a tükürüyordum 401 Unauthorized
.
Task HandleChallengeAsync(AuthenticationProperties properties)
Hangi nedenle olursa olsun [Authorize(Roles="")]
, bir denetleyici aracılığıyla izinleri ayarlamak için kullanılanı geçersiz kıldığımı fark ettim .
Bu geçersiz kılmayı kaldırdıktan sonra, kod çalışmış ve 401
izinler eşleşmediğinde başarılı bir şekilde bir atmıştır .
Bundan ana çıkarım, artık özel bir ara yazılım kullanamayacağınız, onu aracılığıyla uygulamanız AuthenticationHandler<>
ve DefaultAuthenticateScheme
ve DefaultChallengeScheme
kullanırken ayarlamanız gerektiğidir services.AddAuthentication(...)
.
İşte tüm bunların nasıl görünmesi gerektiğine dair bir örnek:
Startup.cs / ConfigureServices () içinde şunu ekleyin:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = "Custom Scheme";
options.DefaultChallengeScheme = "Custom Scheme";
})
.AddCustomAuth(o => { });
Startup.cs / Configure () içinde şunu ekleyin:
app.UseAuthentication();
Yeni bir dosya CustomAuthExtensions.cs oluşturun
public static class CustomAuthExtensions
{
public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<CustomAuthOptions> configureOptions)
{
return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom Scheme", "Custom Auth", configureOptions);
}
}
Yeni bir dosya CustomAuthOptions.cs oluşturun
public class CustomAuthOptions: AuthenticationSchemeOptions
{
public CustomAuthOptions()
{
}
}
Yeni bir dosya CustomAuthHandler.cs oluşturun
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();
}
}