ASP.NET Core 2.0 kimlik doğrulama ara yazılımı


91

Core 1.1 ile @ blowdart'ın tavsiyesini takip etti ve özel bir ara yazılım uyguladı:

https://stackoverflow.com/a/31465227/29821

Şu şekilde çalıştı:

  1. Ara yazılım çalıştı. İstek başlıklarından bir belirteç aldı.
  2. Belirteci doğruladı ve geçerliyse, HttpContext.User.AddIdentity () aracılığıyla eklenen birden fazla talep içeren bir kimlik (ClaimsIdentity) oluşturdu;
  3. ConfigureServices using services.AddAuthorization'da ara yazılım tarafından sağlanan talebi zorunlu kılmak için bir politika ekledim.
  4. Denetleyicilerde / eylemlerde daha sonra [Yetkilendir (Roller = "ara yazılımın eklediği bazı roller")] kullanırım

Bu, simge geçerli değilse (yukarıdaki adım 2) ve iddia hiçbir zaman eklenmezse, "Hiçbir kimlik doğrulaması şeması belirtilmedi ve DefaultChallengeScheme bulunamadı" olması dışında 2.0 ile biraz çalışır.

Şimdi 2.0'da kimlik doğrulamasının değiştiğini okuyorum:

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x

Aynı şeyi ASP.NET Core 2.0'da yapmam için doğru yol nedir? Gerçekten özel kimlik doğrulaması yapmak için bir örnek görmüyorum.



bir bakabilmemiz için kodunuzu ekleyebilir misiniz? Core2.0'da JWT ile ilgili sorunlar yaşadığımı biliyorum - onu başlangıçta hareket ettirme
durumuydu

Yanıtlar:


198

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>, IAuthenticationHandlerarabirimi 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 JwtBearerHandlersı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 OKyerine 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 401izinler 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 DefaultAuthenticateSchemeve DefaultChallengeSchemekullanı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 =>
{
    // the scheme name has to match the value we're going to use in AuthenticationBuilder.AddScheme(...)
    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)
    {
        // store custom services here...
    }
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // build the claims and put them in "Context"; you need to import the Microsoft.AspNetCore.Authentication package
        return AuthenticateResult.NoResult();
    }
}

1
harika gönderi, ancak kodunuzu derlerken bazı sorunlar yaşıyorum. CustomAuthOptions ve AuthenticateResult türleri eksik. Bunları gönderebilir misin?
alexb

8
Sonuçlarınızı bir Github deposundaki kodda paylaşmaya istekli misiniz?
CSharper

2
Lütfen açıklar mısınız DefaultAuthenticateSchemeve DefaultChallengeScheme? Neden ikisinin de kullanıldığını anlamıyorum? ve aralarındaki farklar nelerdir.
Muhammed Nureldin

11
"Oradan, github.com/aspnet/Security adresinde bulunan mevcut kimlik doğrulama şemalarına sahip eksiksiz bir kod tabanı buldum ." Bu (gerçekten mükemmel) yanıtı takip ederken ASP.NET ekibinin bunu nasıl yaptığına bir bakın. Herhangi birimiz bir gün MS kodu ve uygulamaları hakkında sorular soracağımızı ve cevabın "sadece kod tabanlarına bir göz atalım" olacağını hiç düşündük mü?
Marc L.

3
Daha sonra gelenler AuthExtensioniçin, Microsoft.Extensions.DependencyInjectionad alanının içinde olmanız gerekir . Bu örneğe bakın: github.com/aspnet/Security/blob/rel/2.0.0/src/…
Garry Polley

4

Referans verdiğiniz makalenin işaret ettiği gibi, Kimlik alanında Core 1.x'ten Core 2.0'a önemli değişiklikler var. En önemli değişiklik, ara yazılım yaklaşımından uzaklaşmak ve özel hizmetleri yapılandırmak için bağımlılık enjeksiyonu kullanmaktır. Bu, daha karmaşık uygulamalar için Identity'yi özelleştirmede çok daha fazla esneklik sağlar. Yani yukarıda bahsettiğiniz ara yazılım yaklaşımından uzaklaşmak ve hizmetlere doğru ilerlemek istiyorsunuz. Bu hedefe ulaşmak için atıfta bulunulan makaledeki geçiş adımlarını izleyin. Değiştirerek başlayın app.UseIdentity ile app.UseAuthentication . UseIdentity amortismana tabi tutulmuştur ve gelecekteki sürümlerde desteklenmeyecektir. Özel bir talep dönüşümünün nasıl ekleneceğine ve talep üzerinde yetkilendirmenin nasıl gerçekleştirileceğine ilişkin eksiksiz bir örnek içinbu blog gönderisini görüntüleyin .


12
Bunun bir WebAPI uygulamasıyla nasıl kullanılacağına dair bir örnek var mı?
alexb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.