Aracılığıyla paylaş


Güvenli .NET Mikro Hizmetleri ve Web Uygulamaları Oluşturma

İpucu

Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmetler Mimarisi e-Kitabı'ndan bir alıntıdır.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Mikro hizmetlerde ve web uygulamalarında güvenlikle ilgili o kadar çok özellik vardır ki, konu bunun gibi birkaç kitabı kolayca alabilir. Bu nedenle bu bölümde kimlik doğrulaması, yetkilendirme ve uygulama gizli dizilerine odaklanacağız.

.NET mikro hizmetlerinde ve web uygulamalarında kimlik doğrulamasını uygulama

Genellikle bir hizmet tarafından yayımlanan kaynakların ve API'lerin belirli güvenilen kullanıcılar veya istemciler ile sınırlı olması gerekir. Bu tür API düzeyinde güven kararları vermenin ilk adımı kimlik doğrulamasıdır. Kimlik doğrulaması, bir kullanıcının kimliğini güvenilir bir şekilde doğrulama işlemidir.

Mikro hizmet senaryolarında kimlik doğrulaması genellikle merkezi olarak işlenir. API Gateway kullanıyorsanız, Şekil 9-1'de gösterildiği gibi ağ geçidi kimlik doğrulaması için iyi bir yerdir. Bu yaklaşımı kullanırsanız, ağ geçidinden gelen veya gelmeyen iletilerin kimliğini doğrulamak için ek güvenlik sağlanmadığı sürece tek tek mikro hizmetlere doğrudan (API Gateway olmadan) ulaşılamadığından emin olun.

Diagram showing how the client mobile app interacts with the backend.

Şekil 9-1. API Gateway ile merkezi kimlik doğrulaması

API Gateway kimlik doğrulamasını merkezileştirdiğinde, istekleri mikro hizmetlere iletirken kullanıcı bilgilerini ekler. Hizmetlere doğrudan erişilebiliyorsa, kullanıcıların kimliğini doğrulamak için Azure Active Directory gibi bir kimlik doğrulama hizmeti veya güvenlik belirteci hizmeti (STS) olarak davranan ayrılmış bir kimlik doğrulama mikro hizmeti kullanılabilir. Güven kararları, güvenlik belirteçleri veya tanımlama bilgileriyle hizmetler arasında paylaşılır. (Bu belirteçler gerekirse tanımlama bilgisi paylaşımı uygulanarak ASP.NET Core uygulamalar arasında paylaşılabilir.) Bu desen Şekil 9-2'de gösterilmiştir.

Diagram showing authentication through backend microservices.

Şekil 9-2. Kimlik mikro hizmeti tarafından kimlik doğrulaması; güven, yetkilendirme belirteci kullanılarak paylaşılır

Mikro hizmetlere doğrudan erişildiğinde, kimlik doğrulaması ve yetkilendirme içeren güven, mikro hizmetler arasında paylaşılan ayrılmış bir mikro hizmet tarafından verilen bir güvenlik belirteci tarafından işlenir.

ASP.NET Core Kimliği ile kimlik doğrulaması

ASP.NET Core'da bir uygulamanın kullanıcılarını tanımlamaya yönelik birincil mekanizma, ASP.NET Core Kimliği üyelik sistemidir. ASP.NET Core Identity, kullanıcı bilgilerini (oturum açma bilgileri, roller ve talepler dahil) geliştirici tarafından yapılandırılan bir veri deposunda depolar. Genellikle ASP.NET Core Identity veri deposu, pakette Microsoft.AspNetCore.Identity.EntityFrameworkCore sağlanan bir Entity Framework deposudur. Ancak, kimlik bilgilerini Azure Tablo Depolama, CosmosDB veya diğer konumlarda depolamak için özel depolar veya diğer üçüncü taraf paketleri kullanılabilir.

İpucu

ASP.NET Core 2.1 ve üzeri, Razor Sınıf Kitaplığı olarak ASP.NET Core Kimliği sağlar, bu nedenle önceki sürümlerde olduğu gibi projenizde gerekli kodun büyük bir kısmını görmezsiniz. Kimlik kodunu gereksinimlerinize uyacak şekilde özelleştirme hakkında ayrıntılı bilgi için bkz. ASP.NET Core projelerinde yapı iskelesi kimliği.

Aşağıdaki kod, tek tek kullanıcı hesabı kimlik doğrulaması seçili ASP.NET Core Web Uygulaması MVC 3.1 proje şablonundan alınır. Yönteminde Entity Framework Core kullanarak ASP.NET Core Kimliğini yapılandırmayı Startup.ConfigureServices gösterir.

public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddRazorPages();
    //...
}

ASP.NET Core Kimliği yapılandırıldıktan sonra, hizmetin Startup.Configure yönteminde aşağıdaki kodda gösterildiği gibi ve endpoints.MapRazorPages() öğesini ekleyerek app.UseAuthentication() etkinleştirebilirsiniz:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //...
    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
    //...
}

Önemli

Kimlik'in düzgün çalışması için önceki koddaki satırlar GÖSTERİLEN DÜZENDE OLMALIDIR .

ASP.NET Core Kimliği'nin kullanılması çeşitli senaryolara olanak tanır:

  • UserManager türünü (userManager.CreateAsync) kullanarak yeni kullanıcı bilgileri oluşturun.

  • SignInManager türünü kullanarak kullanıcıların kimliğini doğrulayın. Doğrudan oturum açmak veya signInManager.PasswordSignInAsync kullanıcının parolasının doğru olduğunu onaylamak ve ardından oturum açmak için kullanabilirsinizsignInManager.SignInAsync.

  • Tarayıcıdan gelen sonraki isteklerin oturum açmış bir kullanıcının kimliğini ve taleplerini içermesi için bir kullanıcıyı tanımlama bilgisinde depolanan bilgilere (ASP.NET Core Kimlik ara yazılımı tarafından okunur) göre tanımlayın.

ASP.NET Core Kimliği iki öğeli kimlik doğrulamasını da destekler.

Yerel bir kullanıcı veri deposu kullanan ve tanımlama bilgilerini kullanan istekler arasında kimliği kalıcı hale getiren (MVC web uygulamalarında olduğu gibi) kimlik doğrulama senaryoları için ASP.NET Core Identity önerilen bir çözümdür.

Dış sağlayıcılarla kimlik doğrulaması

ASP.NET Core, kullanıcıların OAuth 2.0 akışları aracılığıyla oturum açmasına izin vermek için dış kimlik doğrulama sağlayıcılarının kullanılmasını da destekler. Bu, kullanıcıların Microsoft, Google, Facebook veya Twitter gibi sağlayıcılardan gelen mevcut kimlik doğrulama işlemlerini kullanarak oturum açabileceği ve bu kimlikleri uygulamanızda ASP.NET Core bir kimlikle ilişkilendirebileceği anlamına gelir.

Dış kimlik doğrulamasını kullanmak için, daha önce belirtildiği gibi kimlik doğrulama ara yazılımının yanı sıra yöntemini kullanarak app.UseAuthentication() dış sağlayıcıyı da aşağıdaki örnekte gösterildiği gibi içinde Startup kaydetmeniz gerekir:

public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddAuthentication()
        .AddMicrosoftAccount(microsoftOptions =>
        {
            microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
            microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
        })
        .AddGoogle(googleOptions => { ... })
        .AddTwitter(twitterOptions => { ... })
        .AddFacebook(facebookOptions => { ... });
    //...
}

Popüler dış kimlik doğrulama sağlayıcıları ve ilişkili NuGet paketleri aşağıdaki tabloda gösterilmiştir:

Sağlayıcı Paket
Microsoft Microsoft.AspNetCore.Authentication.MicrosoftAccount
Google Microsoft.AspNetCore.Authentication.Google
Facebook Microsoft.AspNetCore.Authentication.Facebook
Twitter Microsoft.AspNetCore.Authentication.Twitter

Her durumda, satıcıya bağımlı olan ve genellikle şunları içeren bir uygulama kayıt yordamını tamamlamanız gerekir:

  1. İstemci Uygulama Kimliği alma.
  2. İstemci Uygulama Gizli Anahtarı alma.
  3. Yetkilendirme ara yazılımı ve kayıtlı sağlayıcı tarafından işlenen yeniden yönlendirme URL'sini yapılandırma
  4. İsteğe bağlı olarak, Çoklu Oturum Açma (SSO) senaryosunda oturumu kapatmayı düzgün bir şekilde işlemek için bir oturum kapatma URL'si yapılandırma.

Uygulamanızı bir dış sağlayıcı için yapılandırma hakkında ayrıntılı bilgi için ASP.NET Core belgelerindeki Dış sağlayıcı kimlik doğrulamasına bakın).

İpucu

Tüm ayrıntılar, daha önce bahsedilen yetkilendirme ara yazılımı ve hizmetler tarafından işlenir. Bu nedenle, daha önce bahsedilen kimlik doğrulama sağlayıcılarını kaydetmenin yanı sıra Şekil 9-3'te gösterildiği gibi Visual Studio'de ASP.NET Core web uygulaması projesini oluştururken Tek Tek Kullanıcı Hesabı kimlik doğrulaması seçeneğini belirlemeniz gerekir.

Screenshot of the New ASP.NET Core Web Application dialog.

Şekil 9-3. Visual Studio 2019'da bir web uygulaması projesi oluştururken dış kimlik doğrulaması kullanmak için Bireysel Kullanıcı Hesapları seçeneğini belirleme.

Daha önce listelenen dış kimlik doğrulama sağlayıcılarına ek olarak, çok daha fazla dış kimlik doğrulama sağlayıcısı kullanmak için ara yazılım sağlayan üçüncü taraf paketleri de kullanılabilir. Liste için GitHub üzerinde AspNet.Security.OAuth.Providers deposuna bakın.

Bazı özel ihtiyaçları çözmek için kendi dış kimlik doğrulama ara yazılımınızı da oluşturabilirsiniz.

Taşıyıcı belirteçlerle kimlik doğrulaması

ASP.NET Core Kimlik (veya Kimlik artı dış kimlik doğrulama sağlayıcıları) ile kimlik doğrulaması, kullanıcı bilgilerinin tanımlama bilgisinde depolanmasının uygun olduğu birçok web uygulaması senaryosunda iyi sonuç verir. Ancak diğer senaryolarda tanımlama bilgileri verileri kalıcı hale ve iletmenin doğal bir yolu değildir.

Örneğin, Tek Sayfalı Uygulamalar (SPA'lar), yerel istemciler ve hatta diğer Web API'leri tarafından erişilebilen RESTful uç noktalarını kullanıma sunan bir ASP.NET Core Web API'sinde, bunun yerine genellikle taşıyıcı belirteç kimlik doğrulaması kullanmak istersiniz. Bu tür uygulamalar tanımlama bilgileriyle çalışmaz, ancak taşıyıcı belirteci kolayca alabilir ve sonraki isteklerin yetkilendirme üst bilgisine ekleyebilir. Belirteç kimlik doğrulamasını etkinleştirmek için ASP.NET Core, OAuth 2.0 ve OpenID Bağlan kullanmaya yönelik çeşitli seçenekleri destekler.

OpenID Bağlan veya OAuth 2.0 Kimlik sağlayıcısıyla kimlik doğrulaması

Kullanıcı bilgileri Azure Active Directory veya OpenID Bağlan veya OAuth 2.0'ı destekleyen başka bir kimlik çözümünde depolanıyorsa, OpenID Bağlan iş akışını kullanarak kimlik doğrulaması yapmak için Microsoft.AspNetCore.Authentication.OpenIdConnect paketini kullanabilirsiniz. Örneğin, eShopOnContainers'da Identity.Api mikro hizmeti için kimlik doğrulaması yapmak için, ASP.NET Core bir web uygulaması aşağıdaki basitleştirilmiş örnekte Startup.csgösterildiği gibi bu paketten ara yazılımı kullanabilir:

// Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //…
    app.UseAuthentication();
    //…
    app.UseEndpoints(endpoints =>
    {
        //...
    });
}

public void ConfigureServices(IServiceCollection services)
{
    var identityUrl = Configuration.GetValue<string>("IdentityUrl");
    var callBackUrl = Configuration.GetValue<string>("CallBackUrl");
    var sessionCookieLifetime = Configuration.GetValue("SessionCookieLifetimeMinutes", 60);

    // Add Authentication services

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddCookie(setup => setup.ExpireTimeSpan = TimeSpan.FromMinutes(sessionCookieLifetime))
    .AddOpenIdConnect(options =>
    {
        options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.Authority = identityUrl.ToString();
        options.SignedOutRedirectUri = callBackUrl.ToString();
        options.ClientId = useLoadTest ? "mvctest" : "mvc";
        options.ClientSecret = "secret";
        options.ResponseType = useLoadTest ? "code id_token token" : "code id_token";
        options.SaveTokens = true;
        options.GetClaimsFromUserInfoEndpoint = true;
        options.RequireHttpsMetadata = false;
        options.Scope.Add("openid");
        options.Scope.Add("profile");
        options.Scope.Add("orders");
        options.Scope.Add("basket");
        options.Scope.Add("marketing");
        options.Scope.Add("locations");
        options.Scope.Add("webshoppingagg");
        options.Scope.Add("orders.signalrhub");
    });
}

Bu iş akışını kullandığınızda, ASP.NET Core Kimliği ara yazılımı gerekli değildir, çünkü tüm kullanıcı bilgileri depolama alanı ve kimlik doğrulaması Kimlik hizmeti tarafından işlenir.

ASP.NET Core hizmetinden güvenlik belirteçleri verme

Dış kimlik sağlayıcısı kullanmak yerine yerel ASP.NET Core Kimlik kullanıcıları için güvenlik belirteçleri vermek isterseniz, bazı iyi üçüncü taraf kitaplıklarından yararlanabilirsiniz.

IdentityServer4 ve OpenIddict, ASP.NET Core hizmetinden güvenlik belirteçleri vermenizi sağlamak için ASP.NET Core Identity ile kolayca tümleşen OpenID Bağlan sağlayıcılarıdır. IdentityServer4 belgelerinde kitaplığı kullanmaya yönelik ayrıntılı yönergeler bulunur. Ancak, belirteçleri vermek için IdentityServer4 kullanmanın temel adımları aşağıda verilmiştir.

  1. Uygulamayı çağırırsınız. Uygulamanın HTTP isteği işleme işlem hattına IdentityServer4 eklemek için Startup.Configure yöntemindeki UseIdentityServer. Bu, kitaplığın /connect/token gibi OpenID Bağlan ve OAuth2 uç noktalarına istek sunabilmesini sağlar.

  2. Hizmetlere çağrı yaparak Startup.ConfigureServices içinde IdentityServer4'i yapılandırabilirsiniz. AddIdentityServer.

  3. Kimlik sunucusunu yapılandırmak için aşağıdaki verileri ayarlarsınız:

    • İmzalama için kullanılacak kimlik bilgileri .

    • Kullanıcıların erişim isteyebileceği Kimlik ve API kaynakları :

      • API kaynakları, bir kullanıcının erişim belirteci ile erişebileceği korumalı verileri veya işlevleri temsil eder. API kaynağına örnek olarak yetkilendirme gerektiren bir web API'si (veya API kümesi) gösterilebilir.

      • Kimlik kaynakları, bir kullanıcıyı tanımlamak için bir istemciye verilen bilgileri (talepleri) temsil eder. Talepler kullanıcı adını, e-posta adresini vb. içerebilir.

    • Belirteç istemek için bağlanacak istemciler .

    • ASP.NET Core Kimliği veya alternatif gibi kullanıcı bilgileri için depolama mekanizması.

IdentityServer4 için kullanılacak istemcileri ve kaynakları belirttiğinizde, bellek içi istemci veya kaynak depolarını alan yöntemlere uygun türde bir IEnumerable<T> koleksiyon geçirebilirsiniz. Ya da daha karmaşık senaryolar için Bağımlılık Ekleme aracılığıyla istemci veya kaynak sağlayıcısı türleri sağlayabilirsiniz.

Özel bir IClientStore türü tarafından sağlanan bellek içi kaynakları ve istemcileri kullanmak üzere IdentityServer4 için örnek bir yapılandırma aşağıdaki örneğe benzer olabilir:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    //...
    services.AddSingleton<IClientStore, CustomClientStore>();
    services.AddIdentityServer()
        .AddSigningCredential("CN=sts")
        .AddInMemoryApiResources(MyApiResourceProvider.GetAllResources())
        .AddAspNetIdentity<ApplicationUser>();
    //...
}

Güvenlik belirteçlerini kullanma

OpenID Bağlan uç noktasında kimlik doğrulaması veya kendi güvenlik belirteçlerinizi verme bazı senaryoları kapsar. Peki ya erişimi farklı bir hizmet tarafından sağlanan geçerli güvenlik belirteçlerine sahip kullanıcılarla sınırlamak için gereken bir hizmete ne olacak?

Bu senaryo için JWT belirteçlerini işleyen kimlik doğrulama ara yazılımı Microsoft.AspNetCore.Authentication.JwtBearer paketinde kullanılabilir. JWT, "JSON Web Belirteci" anlamına gelir ve güvenlik taleplerini iletmek için ortak bir güvenlik belirteci biçimidir (RFC 7519 tarafından tanımlanır). Bu tür belirteçleri kullanmak için ara yazılımların nasıl kullanılacağına ilişkin basitleştirilmiş bir örnek, eShopOnContainers'ın Ordering.Api mikro hizmetinden alınan bu kod parçası gibi görünebilir.

// Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //…
    // Configure the pipeline to use authentication
    app.UseAuthentication();
    //…
    app.UseEndpoints(endpoints =>
    {
        //...
    });
}

public void ConfigureServices(IServiceCollection services)
{
    var identityUrl = Configuration.GetValue<string>("IdentityUrl");

    // Add Authentication services

    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme;

    }).AddJwtBearer(options =>
    {
        options.Authority = identityUrl;
        options.RequireHttpsMetadata = false;
        options.Audience = "orders";
    });
}

Bu kullanımdaki parametreler şunlardır:

  • Audience gelen belirtecin alıcısını veya belirtecin erişim iznini veren kaynağı temsil eder. Bu parametrede belirtilen değer belirteçteki parametreyle eşleşmiyorsa belirteç reddedilir.

  • Authority , belirteç veren kimlik doğrulama sunucusunun adresidir. JWT taşıyıcı kimlik doğrulaması ara yazılımı, belirtecin imzasını doğrulamak için kullanılabilecek ortak anahtarı almak için bu URI'yi kullanır. Ara yazılım, belirteçteki parametrenin iss bu URI ile eşleşdiğini de onaylar.

Başka bir parametre olan RequireHttpsMetadata, test amacıyla kullanışlıdır; sertifikanız olmayan ortamlarda test edebilmeniz için bu parametreyi false olarak ayarlarsınız. Gerçek dünya dağıtımlarında JWT taşıyıcı belirteçleri her zaman yalnızca HTTPS üzerinden geçirilmelidir.

Bu ara yazılım kullanılırken, JWT belirteçleri yetkilendirme üst bilgilerinden otomatik olarak ayıklanır. Daha sonra seri durumdan çıkarılır, doğrulanır (ve Authority parametrelerindeki Audience değerler kullanılarak) ve daha sonra MVC eylemleri veya yetkilendirme filtreleri tarafından başvurulacak kullanıcı bilgileri olarak depolanır.

JWT taşıyıcı kimlik doğrulama ara yazılımı, yetkili yoksa belirteci doğrulamak için yerel sertifika kullanma gibi daha gelişmiş senaryoları da destekleyebilir. Bu senaryo için nesnede JwtBearerOptions bir TokenValidationParameters nesne belirtebilirsiniz.

Ek kaynaklar