Aracılığıyla paylaş


Güvenli ASP.NET Core sunucu tarafı Blazor uygulamaları

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Uyarı

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Bu makalede, ASP.NET Core uygulamaları olarak sunucu tarafı Blazor uygulamalarının güvenliğini sağlama açıklanmaktadır.

Sunucu tarafı Blazor uygulamalar, ASP.NET Core uygulamalarıyla aynı şekilde güvenlik için yapılandırılır. Daha fazla bilgi için, ASP.NET Core güvenlik konuları altındaki makalelere bakın.

Kimlik doğrulama bağlamı yalnızca uygulama başlatıldığında oluşturulur; bu, uygulamanın WebSocket'e ilk bağlandığı zamandır. Kimlik doğrulama bağlamı, bağlantı hattının ömrü boyunca korunur. Uygulamalar, her 30 dakikada bir kullanıcının kimlik doğrulama durumunu düzenli aralıklarla yeniden doğrular.

Uygulamanın özel hizmetler için kullanıcıları yakalaması veya kullanıcı güncelleştirmelerine tepki vermesi gerekiyorsa bkz . Sunucu tarafı ASP.NET Çekirdek Blazor ek güvenlik senaryoları.

Blazor her sayfa gezintisinde tanımlama bilgileriyle yeni HTTP isteklerinde bulunan geleneksel sunucu tarafından işlenen web uygulamalarından farklıdır. Gezinti olayları sırasında kimlik doğrulaması denetlendi. Ancak tanımlama bilgileri dahil değildir. Tanımlama bilgileri yalnızca bir sunucuya HTTP isteği gönderildiğinde gönderilir. Bu, kullanıcı uygulamada Blazor gezindiğinde böyle olmaz. Gezinti sırasında kullanıcının kimlik doğrulama durumu bağlantı hattı içinde Blazor denetlenerek özetini kullanarak RevalidatingAuthenticationStateProvider sunucuda istediğiniz zaman güncelleştirebilirsiniz.

Önemli

Gezinti sırasında kimlik doğrulamasını gerçekleştirmek için özel NavigationManager uygulama önerilmez. Uygulamanın gezinti sırasında özel kimlik doğrulama durumu mantığı yürütmesi gerekiyorsa, özel AuthenticationStateProviderbir kullanın.

Not

Bu makaledeki kod örnekleri, .NET 6 veya sonraki sürümlerindeki ASP.NET Core'da desteklenen null atanabilir başvuru türlerini (NTS) ve .NET derleyici null durum statik analizini benimser. ASP.NET Core 5.0 veya önceki sürümleri hedeflerken, bu makaledeki örneklerden null tür atamasını (?) kaldırın.

Proje şablonu

ASP.NET CoreBlazor için Araç oluşturma başlığındaki yönergeleri izleyerek yeni bir sunucu tarafı Blazor uygulaması oluşturun.

Sunucu tarafı uygulama şablonunu seçtikten ve projeyi yapılandırdıktan sonra Kimlik doğrulama türü altında uygulamanın kimlik doğrulamasını seçin:

  • Hiçbiri (varsayılan): Kimlik doğrulaması yok.
  • Bireysel Hesaplar: Kullanıcı hesapları, ASP.NET Core Identitykullanılarak uygulama içinde depolanır.

BlazorIdentity Kullanıcı Arabirimi (Bireysel Hesaplar)

Blazor, Tek Tek Hesaplar için kimlik doğrulama seçeneğini belirlediğinizde tam Blazortabanlı Identity kullanıcı arabirimi oluşturmayı destekler.

Şablon, Blazor Web App SQL Server veritabanı için kod iskelesi oluşturur Identity . Komut satırı sürümü SQLite kullanır ve için Identitybir SQLite veritabanı içerir.

Şablon:

  • Kimliği doğrulanmış kullanıcılarla etkileşimli sunucu tarafı işleme (etkileşimli SSR) ve istemci tarafı işleme (CSR) senaryolarını destekler.
  • Kullanıcıları oturum açma ve kapatma gibi rutin kimlik doğrulama görevleri için bileşenler ve ilgili mantık eklerIdentityRazor. Identity Bileşenler, hesap onayı ve parola kurtarma ve üçüncü taraf bir uygulama kullanarak çok faktörlü kimlik doğrulaması gibi gelişmiş Identity özellikleri de destekler. Bileşenlerin etkileşimleri Identity desteklemediğini unutmayın.
  • Identityİlgili paketleri ve bağımlılıkları ekler.
  • içindeki paketlere Identity başvurur _Imports.razor.
  • Özel bir kullanıcı Identity sınıfı (ApplicationUser) oluşturur.
  • Bir EF Core veritabanı bağlamı (ApplicationDbContext) oluşturur ve kaydeder.
  • Yerleşik Identity uç noktalar için yönlendirmeyi yapılandırılır.
  • Doğrulamayı ve iş mantığını içerir Identity .

Çerçevenin Blazor Identity bileşenlerini incelemek için, bunlara proje şablonundaki Pages klasörün ve Shared klasörlerinde Account Blazor Web App (başvuru kaynağı) erişin.

Etkileşimli WebAssembly veya Etkileşimli Otomatik işleme modlarını seçtiğinizde, sunucu tüm kimlik doğrulama ve yetkilendirme isteklerini işler ve Identity bileşenler'in ana projesindeki Blazor Web Appsunucuda statik olarak işlenir.

Çerçeve, kullanıcının kimlik doğrulama durumunu tarayıcıya akışı için hem sunucu hem de istemci (.Client) projelerinde özel AuthenticationStateProvider bir özellik sağlar. sunucu projesi öğesini çağırırken AddAuthenticationStateSerializationistemci projesi de öğesini çağırır AddAuthenticationStateDeserialization. İstemci yerine sunucuda kimlik doğrulaması, uygulamanın ön kayıt sırasında ve .NET WebAssembly çalışma zamanı başlatılmadan önce kimlik doğrulama durumuna erişmesine olanak tanır. Özel AuthenticationStateProvider uygulamalar, kimlik doğrulama durumunu HTML açıklamalarına seri hale getirmek ve ardından yeni AuthenticationState bir örnek oluşturmak için WebAssembly'den geri okumak için Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanır. Daha fazla bilgi için s bölümündeki Kimlik doğrulama durumunu Blazor Web Appyönetme bölümüne bakın.

Yalnızca Etkileşimli Sunucu çözümleri için ( IdentityRevalidatingAuthenticationStateProvider başvuru kaynağı), etkileşimli bir bağlantı hattının bağlı olduğu her 30 dakikada bir bağlı kullanıcı için güvenlik damgasını yeniden belirten bir sunucu tarafıdır AuthenticationStateProvider .

Etkileşimli WebAssembly veya Etkileşimli Otomatik işleme modlarını seçtiğinizde, sunucu tüm kimlik doğrulama ve yetkilendirme isteklerini işler ve Identity bileşenler'in ana projesindeki Blazor Web Appsunucuda statik olarak işlenir. Proje şablonu, sunucu ve tarayıcı arasında kullanıcının kimlik doğrulama durumunu eşitlemek için projeye bir PersistentAuthenticationStateProvider sınıf (başvuru kaynağı) .Client içerir. sınıfı özel bir uygulamasıdır AuthenticationStateProvider. Sağlayıcı, kimlik doğrulama durumunu önceden yüklemek ve sayfada kalıcı hale getirmek için Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanır.

ana projesindeBlazor Web App, kimlik doğrulama durumu sağlayıcısı (başvuru kaynağı) (Yalnızca sunucu etkileşim çözümleri) veyaPersistingRevalidatingAuthenticationStateProvider (başvuru kaynağı) (WebAssembly veya Otomatik etkileşim çözümleri) olarak adlandırılır IdentityRevalidatingAuthenticationStateProvider .

BlazorIdentity, bir fabrika tarafından oluşturulmayan örneklere bağlıdırDbContext. Bu durum, proje şablonunun Identity bileşenlerinin etkileşimi desteklemeden statik olarak işlenmesi için yeterli olduğu için kasıtlı DbContext olarak gerçekleştirilir.

Genel etkileşimli işleme modlarının bileşenler dışındakiIdentity bileşenlere nasıl uygulandığına ve aynı zamanda bileşenler için statik SSR'ye nasıl uygulandığına Identity ilişkin bir açıklama için bkz . ASP.NET Çekirdek Blazor işleme modları.

Önceden oluşturulmuş durumu kalıcı hale döndürme hakkında daha fazla bilgi için bkz . Prerender ASP.NET Core Razor bileşenleri.

Kullanıcı arabirimi hakkında BlazorIdentity daha fazla bilgi ve dış oturum açma bilgilerini sosyal web siteleri aracılığıyla tümleştirme yönergeleri için bkz. .NET 8'deki yenilikleridentity.

Not

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

s içinde Blazor Web Appkimlik doğrulama durumunu yönetme

Bu bölüm, şunları benimseyenler için Blazor Web Appgeçerlidir:

  • Tek Tek Hesaplar
  • İstemci tarafı işleme (CSR, WebAssembly tabanlı etkileşim).

İstemci tarafı kimlik doğrulama durumu sağlayıcısı yalnızca içinde Blazor kullanılır ve ASP.NET Core kimlik doğrulama sistemiyle tümleşik değildir. Ön kayıt sırasında, Blazor sayfada tanımlanan meta verileri dikkate alır ve kullanıcının kimliğinin doğrulanıp doğrulanmadığını belirlemek için ASP.NET Core kimlik doğrulama sistemini kullanır. Kullanıcı bir sayfadan diğerine geçtiğinde, istemci tarafı kimlik doğrulama sağlayıcısı kullanılır. Kullanıcı sayfayı yenilediğinde (tam sayfa yeniden yükleme), istemci tarafı kimlik doğrulama durumu sağlayıcısı sunucudaki kimlik doğrulama kararına dahil olmaz. Kullanıcının durumu sunucu tarafından kalıcı olmadığından, istemci tarafında tutulan herhangi bir kimlik doğrulama durumu kaybolur.

Bunu ele almak için en iyi yaklaşım, ASP.NET Core kimlik doğrulama sisteminde kimlik doğrulaması gerçekleştirmektir. İstemci tarafı kimlik doğrulama durumu sağlayıcısı yalnızca kullanıcının kimlik doğrulama durumunu yansıtmayı üstlenir. Bunu kimlik doğrulama durumu sağlayıcılarıyla gerçekleştirmeye yönelik örnekler proje şablonu tarafından Blazor Web App gösterilmiştir ve aşağıda açıklanmıştır.

Sunucu projesinin Program dosyasında, Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanarak sunucu tarafı AuthenticationStateProvider tarafından döndürülenleri seri hale AuthenticationState getiren öğesini çağırınAddAuthenticationStateSerialization:

builder.Services.AddRazorComponents()
    .AddInteractiveWebAssemblyComponents()
    .AddAuthenticationStateSerialization();

API yalnızca sunucu tarafı adını ve rol taleplerini tarayıcıda erişim için serileştirir. Tüm talepleri dahil etmek için true sunucu tarafı çağrısında olarak AddAuthenticationStateSerializationayarlayınSerializeAllClaims:

builder.Services.AddRazorComponents()
    .AddInteractiveWebAssemblyComponents()
    .AddAuthenticationStateSerialization(
        options => options.SerializeAllClaims = true);

İstemci () projesinin Program dosyasında çağrısıAddAuthenticationStateDeserialization, öğesini çağırarak ve Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanarak AuthenticationStateData sunucudan seri durumdan çıkarıldığı yeri AuthenticationState AuthenticationStateProvider ekler..Client Sunucu projesinde öğesine karşılık gelen bir çağrı AddAuthenticationStateSerialization olmalıdır.

builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();

Not

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

İskele Identity

Sunucu tarafı bir uygulamada iskele oluşturma Identity hakkında daha fazla bilgi için bkz. ASP.NET Core projelerinde iskeleIdentity.Blazor

Sunucu tarafı Blazor uygulamasına iskele Identity oluşturun:

Dış sağlayıcılardan gelen ek talepler ve belirteçler

Dış sağlayıcılardan gelen ek talepleri depolamak için, bkz. ASP.NET Core dış sağlayıcılardan gelen ek talepleri ve belirteçleri kalıcı hale getirme.

Identity Server ile Linux üzerinde Azure App Service

Identity Server ile Linux üzerinde Azure App Service dağıtılırken sertifikayı vereni açıkça belirtin. Daha fazla bilgi için bkz. SPA'lar için Web API arka ucu güvenliğini sağlamak için kullanmaIdentity.

Kapsamı bir bileşen olan hizmetler için ekleme AuthenticationStateProvider

Doğru başlatılmamış yeni bir örneğinin AuthenticationStateProvider oluşturulmasıyla sonuçlanan özel bir kapsam içinde çözümlemeye AuthenticationStateProvider çalışma.

Kapsamı bir bileşen olan bir hizmet içinde öğesine erişmek AuthenticationStateProvider için, yönergesini @inject veya [Inject] özniteliğini ekleyin AuthenticationStateProvider ve bunu bir parametre olarak hizmete geçirin. Bu yaklaşım, doğru, başlatılan örneğinin AuthenticationStateProvider her kullanıcı uygulaması örneği için kullanılmasını sağlar.

ExampleService.cs:

public class ExampleService
{
    public async Task<string> ExampleMethod(AuthenticationStateProvider authStateProvider)
    {
        var authState = await authStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity is not null && user.Identity.IsAuthenticated)
        {
            return $"{user.Identity.Name} is authenticated.";
        }
        else
        {
            return "The user is NOT authenticated.";
        }
    }
}

Hizmeti kapsamlı olarak kaydedin. Sunucu tarafı Blazor bir uygulamada, kapsamı belirlenmiş hizmetlerin ömrü istemci bağlantı devresinin süresine eşittir.

Program dosyasında:

builder.Services.AddScoped<ExampleService>();

Startup.csiçindeStartup.ConfigureServices:

services.AddScoped<ExampleService>();

Aşağıdaki InjectAuthStateProvider bileşeninde:

InjectAuthStateProvider.razor:

@page "/inject-auth-state-provider"
@inherits OwningComponentBase
@inject AuthenticationStateProvider AuthenticationStateProvider

<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>

<p>@message</p>

@code {
    private string? message;
    private ExampleService? ExampleService { get; set; }

    protected override async Task OnInitializedAsync()
    {
        ExampleService = ScopedServices.GetRequiredService<ExampleService>();

        message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
    }
}
@page "/inject-auth-state-provider"
@inject AuthenticationStateProvider AuthenticationStateProvider
@inherits OwningComponentBase

<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>

<p>@message</p>

@code {
    private string? message;
    private ExampleService? ExampleService { get; set; }

    protected override async Task OnInitializedAsync()
    {
        ExampleService = ScopedServices.GetRequiredService<ExampleService>();

        message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
    }
}

Daha fazla bilgi için ASP.NET Core Blazor bağımlılık ekleme kılavuzuna OwningComponentBase bakın.

Özel bir içerikle önceden giriş yaparken yetkisiz içerik görüntüleniyor AuthenticationStateProvider

Bir AuthenticationStateProviderbileşendekiAuthorizeView içerik gibi yetkisiz içeriklerin özel bir içerikle ön oturum açma sırasında gösterilmesini önlemek için aşağıdaki yaklaşımlardan birini benimseyin:

  • Ön kayıt özelliğini devre dışı bırakma: Uygulamanın bileşen hiyerarşisinde kök bileşen olmayan en üst düzey bileşende olarak ayarlanmış false parametreyle prerender işleme modunu belirtin.

    Not

    Kök bileşeni etkileşimli hale getirme (bileşen gibi App ) desteklenmez. Bu nedenle, prerendering bileşeni tarafından App doğrudan devre dışı bırakılamaz.

    Proje şablonunu temel alan uygulamalar için, bileşenin Blazor Web App bileşeninde App (Components/App.razor) kullanıldığı ön Routes kayıt genellikle devre dışı bırakılır:

    <Routes @rendermode="new InteractiveServerRenderMode(prerender: false)" />
    

    Ayrıca, bileşen için HeadOutlet ön kayıt özelliğini devre dışı bırakın:

    <HeadOutlet @rendermode="new InteractiveServerRenderMode(prerender: false)" />
    

    Bileşen örneğine uygulanan Routes işleme modunu seçmeli olarak denetleyebilirsiniz. Örneğin bkz . ASP.NET Çekirdek Blazor işleme modları.

  • Ön kayıt özelliğini devre dışı bırakma: Dosyayı açın _Host.cshtml ve Bileşen Etiketi Yardımcısı'nın özniteliğini olarak Serverdeğiştirinrender-mode:

    <component type="typeof(App)" render-mode="Server" />
    
  • Uygulama başlamadan önce kullanıcının kimliğini doğrulama: Bu yaklaşımı benimsemek için, uygulamanın kullanıcının ilk isteğine tabanlı oturum açma sayfasıyla Identityyanıt vermesi veya kimlik doğrulaması yapılana kadar uç noktalara Blazor yönelik istekleri görüntülemesi ve engellemesi gerekir. Daha fazla bilgi için bkz . Yetkilendirmeyle korunan kullanıcı verileriyle ASP.NET Core uygulaması oluşturma. Kimlik doğrulamasından sonra, önceden oluşturulmuş Razor bileşenlerdeki yetkisiz içerik yalnızca kullanıcının içeriği görüntüleme yetkisinin gerçekten yetkisi olmadığında gösterilir.

Kullanıcı durumu yönetimi

Addaki "state" sözcüğüne rağmen, AuthenticationStateProvider genel kullanıcı durumunu depolamak için değildir. AuthenticationStateProvider yalnızca kullanıcının uygulamada kimlik doğrulama durumunu, uygulamada oturum açıp açmadığını ve kim olarak oturum açtığını gösterir.

Kimlik doğrulaması, Sayfalar ve MVC uygulamalarıyla aynı ASP.NET Core Identity kimlik doğrulamasını Razor kullanır. ASP.NET Core Identity için depolanan kullanıcı durumu, uygulamaya ek kod eklemeden akışı Blazor yapılır. Özelliklerin uygulamanın bölümlerinde etkili olması için Identity ASP.NET Core Identity makalelerindeki ve öğreticilerindeki Blazor yönergeleri izleyin.

ASP.NET Core Identitydışında genel durum yönetimi hakkında yönergeler için bkz . ASP.NET Core Blazor durum yönetimi.

Ek güvenlik soyutlamaları

Kimlik doğrulama durumunu yönetmeye iki ek soyutlama daha katılır:

Not

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

Oturum kapatma sırasında kimlik doğrulama durumu yönetimi

Sunucu tarafı Blazor , tarayıcı sekmeleri de dahil olmak üzere bağlantı hattının kullanım ömrü boyunca kullanıcı kimlik doğrulama durumunu kalıcı hale gelir. Kullanıcı bir sekmede oturumu kapattığında bir kullanıcıyı tarayıcı sekmeleri arasında proaktif olarak kapatmak için kısa bir RevalidationIntervalile bir RevalidatingServerAuthenticationStateProvider (başvuru kaynağı) uygulamanız gerekir.

Not

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

Geçici yeniden yönlendirme URL'si geçerlilik süresi

Bu bölüm s için Blazor Web Appgeçerlidir.

RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration Sunucu tarafı işleme tarafından Blazor yayılan geçici yeniden yönlendirme URL'leri için ASP.NET Çekirdek Veri Koruması geçerliliğinin ömrünü almak veya ayarlamak için seçeneğini kullanın. Bunlar yalnızca geçici olarak kullanıldığından, yalnızca bir istemcinin URL'yi alması ve gezinmeye başlaması için yaşam süresi yeterli olmalıdır. Ancak, sunucular arasında saat dengesizliği için izin verecek kadar uzun olmalıdır. Varsayılan değer beş dakikadır.

Aşağıdaki örnekte değer yedi dakikaya uzatılır:

builder.Services.AddRazorComponents(options => 
    options.TemporaryRedirectionUrlValidityDuration = 
        TimeSpan.FromMinutes(7));

Ek kaynaklar