Aracılığıyla paylaş


ASP.NET Core Blazor kimlik doğrulaması ve yetkilendirme

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 9 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 9 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 9 sürümüne bakın.

Bu makalede, Blazor uygulamalardaki güvenlik yapılandırması ve yönetimi için ASP.NET Core desteği açıklanmaktadır.

Blazor, kullanıcının kimliğini oluşturmak için mevcut ASP.NET Core kimlik doğrulama mekanizmalarını kullanır. Tam mekanizma, uygulamanın nasıl Blazor barındırıldığına, sunucu tarafında veya istemci tarafında olmasına bağlı olarak değişir.

Güvenlik senaryoları, uygulamalarda sunucu tarafı ve istemci tarafı Blazor çalıştıran yetkilendirme kodu arasında farklılık gösterir. Sunucuda çalışan yetkilendirme kodu için, yetkilendirme denetimleri uygulamanın ve bileşenlerin alanları için erişim kuralları uygulayabilir. İstemci tarafı kod yürütmesi üzerinde oynanabildiğinden, istemcide yürütülen yetkilendirme koduna, erişim kurallarını kesin şekilde uygulamak veya istemci tarafı içeriğin görüntülenmesini kontrol etmek için tam olarak güvenilemez.

Yetkilendirme kuralı uygulamasının garanti edilmesi gerekiyorsa, istemci tarafı kodunda yetkilendirme denetimleri uygulamayın. Yalnızca sunucu tarafı işlemeye (SSR) dayalı yetkilendirme denetimleri ve kural zorlamasını gerçekleştirecek bir Blazor Web App inşa et.

Yetkilendirme kuralı uygulama ve veri ve kod güvenliği garanti edilmesi gerekiyorsa, istemci tarafı uygulaması geliştirmeyin. Blazor Server uygulaması oluştur.

Razor Sayfa yetkilendirme kuralları yönlendirilebilir Razor bileşenler için geçerli değildir. yönlendirilemeyen bir Razor bileşeni Razor Sayfaları uygulamasının bir sayfasına eklenmişse, sayfanın yetkilendirme kuralları, sayfanın içeriğinin geri kalanıyla birlikte Razor bileşenini dolaylı olarak etkiler.

ASP.NET Core Identity , genellikle uygulama istemci-sunucu iletişim modeli olmayan Blazor HTTP isteği ve yanıt iletişimi bağlamında çalışacak şekilde tasarlanmıştır. ASP.NET Core Identity'yi kullanıcı yönetimi için kullanan ASP.NET Core uygulamaları, kullanıcı kaydı, oturum açma, oturumu kapatma ve diğer kullanıcı yönetimi görevleri gibi Razor ile ilgili kullanıcı arayüzü için Razor Bileşenleri yerine Identity Sayfalarını kullanmalıdır. Görevleri doğrudan işleyen Razor bileşenler oluşturmak Identity çeşitli senaryolar için mümkündür, ancak Microsoft tarafından önerilmez veya desteklenmez.

SignInManager<TUser> ve UserManager<TUser> gibi ASP.NET Core soyutlamaları Razor bileşenlerinde desteklenmez. Daha fazla bilgi için, ile ASP.NET Core kullanma konusuna bakınız: ASP.NET Core sunucu tarafı uygulamasına iskele oluşturma.

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. .NET 5 veya önceki sürümleri hedeflerken, bu makaledeki örneklerden null tür atamasını (?) kaldırın.

Hassas verileri ve kimlik bilgilerini güvenli bir şekilde koruma

Uygulama gizli dizilerini, bağlantı dizelerini, kimlik bilgilerini, parolaları, kişisel kimlik numaralarını (PIN'ler), özel .NET/C# kodunu veya özel anahtarları/belirteçleri her zaman güvenli olmayan istemci tarafı kodunda depolamayın. İstemci tarafı Blazor kodu, denetlediğiniz güvenli bir web API'si aracılığıyla güvenli hizmetlere ve veritabanlarına erişmelidir.

Test/hazırlama ve üretim ortamlarında, sunucu tarafı Blazor kod ve web API'leri, proje kodu veya yapılandırma dosyalarında kimlik bilgilerinin korunmasını önleyen güvenli kimlik doğrulama akışları kullanmalıdır. Yerel geliştirme testlerinin dışında, ortam değişkenleri en güvenli yaklaşım olmadığından hassas verileri depolamak için ortam değişkenlerinin kullanılmasından kaçınmanızı öneririz. Yerel geliştirme testinde gizli verilerin güvenliğini sağlamak için Gizli Dizi Yöneticisi aracı önerilir. Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

İstemci tarafı ve sunucu tarafı yerel geliştirme ve test için gizli kimlik bilgilerinin güvenliğini sağlamak için Gizli Dizi Yöneticisi aracını kullanın.

Microsoft Azure hizmetleri için yönetilen kimlikler

Microsoft Azure hizmetleri için yönetilen kimlikleri kullanmanızı öneririz. Yönetilen kimlikler, kimlik bilgilerini uygulama kodunda depolamadan Azure hizmetlerinde güvenli bir şekilde kimlik doğrulaması yapar. Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

Sahtecilik önleme desteği

Şablon Blazor :

Bileşen AntiforgeryToken , bir kötü amaçlı yazılımdan koruma belirtecini gizli bir alan olarak işler ve bu bileşen form (EditForm) örneklerine otomatik olarak eklenir. Daha fazla bilgi için bkz . ASP.NET Core Blazor formlara genel bakış.

Hizmet, AntiforgeryStateProvider geçerli oturumla ilişkili bir sahtecilik önleme belirtecine erişim sağlar. Hizmeti enjekte edin ve geçerli GetAntiforgeryToken() elde etmek için AntiforgeryRequestToken yöntemini çağırın. Daha fazla bilgi için bkz. ASP.NET Core Blazor uygulamasından web API'sini çağırma.

Blazor istek belirteçlerini bileşen durumunda depolar. Bu, isteğe erişimi olmasa bile, kötü amaçlı yazılımdan koruma belirteçlerinin etkileşimli bileşenler tarafından kullanılabildiğini garanti eder.

Not

Sahtecilik önleme, yalnızca form verileri application/x-www-form-urlencoded, multipart/form-data veya text/plain olarak kodlanmış şekilde sunucuya gönderildiğinde gereklidir çünkü bunlar tek geçerli form kodlama türleridir.

Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

Sunucu tarafı Blazor kimlik doğrulaması

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 Temel 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 istemciyle bir SignalR bağlantı üzerinden WebSocket'e ilk bağlandığı zamandır. Kimlik doğrulaması bir cookie veya başka bir taşıyıcı belirteci temel alabilir, ancak kimlik doğrulaması SignalR hub üzerinden ve tamamen bağlantı hattı içinde yönetilir. 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. ASP.NET Çekirdek sunucu tarafı ve Blazor Web App ek güvenlik senaryoları.

Blazor her sayfa geziniminde tanımlama bilgileri kullanarak yeni HTTP istekleri yapan geleneksel sunucu tarafından işlenen web uygulamalarından farklıdır. Gezinti olayları sırasında kimlik doğrulaması denetlenir. Ancak tanımlama bilgileri işin içinde değil. Tanımlama bilgileri yalnızca bir sunucuya HTTP isteği gönderildiğinde gönderilir, ancak bu, kullanıcı Blazor uygulamasında gezinirken gerçekleşmez. Gezinti sırasında kullanıcının kimlik doğrulama durumu Blazor devresi içinde denetlenir ve sunucuda RevalidatingAuthenticationStateProvider soyutlamasını kullanarak istediğiniz zaman güncelleyebilirsiniz.

Ö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ığını yürütmesi gerekiyorsa, özel bir AuthenticationStateProvider 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. .NET 5 veya önceki sürümleri hedeflerken, bu makaledeki örneklerden null tür atamasını (?) kaldırın.

Yerleşik veya özel AuthenticationStateProvider hizmet, ASP.NET Core'un HttpContext.Userkimlik doğrulama durumu verilerini alır. Kimlik doğrulama durumu, mevcut ASP.NET Core kimlik doğrulama mekanizmalarıyla entegre edilir.

Sunucu tarafı kimlik doğrulaması hakkında daha fazla bilgi için bkz. ASP.NET Çekirdek Blazor kimlik doğrulaması ve yetkilendirme.

Paylaşılan durum

Sunucu tarafı Blazor uygulamalar sunucu belleğinde yer alır ve aynı işlem içinde birden çok uygulama oturumu barındırılır. Her uygulama oturumu için, Blazor kendi bağımlılık ekleme kapsayıcısıyla bir dağıtım zinciri başlatır; bu nedenle, kapsama alınan hizmetler her Blazor oturumu için benzersizdir.

Uyarı

Devreler arasında kullanıcı durumunun sızması gibi güvenlik açıklarına neden olabileceğinden, çok dikkatli olunmadığı sürece tekli hizmetleri kullanan aynı sunucu paylaşım durumundaki uygulamaları önermeyiz.

Özellikle bunun için tasarlanan Blazor uygulamalarında, durum bilgisi olan tekil hizmetleri kullanabilirsiniz. Örneğin, bir bellek önbelleği belirli bir girdiye erişmek için bir anahtar gerektirdiğinden tekil bellek önbelleği kullanımı kabul edilebilir. Kullanıcıların önbellekle birlikte kullanılan önbellek anahtarları üzerinde denetimi olmadığı varsayıldığında, önbellekte depolanan durum devreler arasında sızmaz.

Durum yönetimi hakkında genel yönergeler için bkz. ASP.NET Çekirdek Blazor durum yönetimi.

Hassas verilerin ve kimlik bilgilerinin sunucu tarafı güvenliği

Test/hazırlama ve üretim ortamlarında, sunucu tarafı Blazor kod ve web API'leri, proje kodu veya yapılandırma dosyalarında kimlik bilgilerinin korunmasını önleyen güvenli kimlik doğrulama akışları kullanmalıdır. Yerel geliştirme testlerinin dışında, ortam değişkenleri en güvenli yaklaşım olmadığından hassas verileri depolamak için ortam değişkenlerinin kullanılmasından kaçınmanızı öneririz. Yerel geliştirme testinde gizli verilerin güvenliğini sağlamak için Gizli Dizi Yöneticisi aracı önerilir. Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

İstemci tarafı ve sunucu tarafı yerel geliştirme ve test için gizli kimlik bilgilerinin güvenliğini sağlamak için Gizli Dizi Yöneticisi aracını kullanın.

Proje şablonu

ASP.NET Core için Blazor Araçlar Blazor kılavuzundaki adımları izleyerek yeni bir sunucu tarafı uygulama 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.

Blazor Identity Kullanıcı Arabirimi (Bireysel Hesaplar)

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

Şablon, SQL Server veritabanı için Blazor Web App kod iskeleti oluşturur Identity. Komut satırı sürümü SQLite kullanır ve Identity için bir 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ın oturum açma ve kapatma gibi rutin kimlik doğrulama görevleri için IdentityRazor bileşenlerini ve ilgili mantığı ekler. Identity bileşenleri ayrıca, hesap onayı ve parola kurtarma gibi gelişmiş Identity özelliklerinin yanı sıra, üçüncü parti bir uygulama kullanarak çok faktörlü kimlik doğrulama gibi özellikleri de destekler. Şunu unutmayın ki Identity bileşenlerinin kendileri etkileşimi desteklemez.
  • Identityİlgili paketleri ve bağımlılıkları ekler.
  • Identity içindeki paketlere _Imports.razor başvurur.
  • Ö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ır.
  • Doğrulamayı ve iş mantığını içerir Identity .

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

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, Blazor Web App sunucusunun ana projesinde statik olarak işlenir.

Çerçeve, kullanıcının kimlik doğrulama durumunu tarayıcıya aktarmak için hem sunucu hem de istemci projelerinde özel bir AuthenticationStateProvider sağlar. Sunucu projesi AddAuthenticationStateSerialization çağırır, istemci projesi de AddAuthenticationStateDeserialization çağırır. İ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 uyarlamalar, kimlik doğrulama durumunu HTML yorumlarına serileştirir ve ardından WebAssembly'den geri alarak bir yeni örneği oluşturmak için PersistentComponentState (AuthenticationState) 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 (IdentityRevalidatingAuthenticationStateProviderbaşvuru kaynağı), etkileşimli bir devre bağlandığında her 30 dakikada bir bağlı kullanıcı için güvenlik damgasını yeniden doğrulayan sunucu tarafıdırAuthenticationStateProvider.

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, Blazor Web App sunucusunun ana projesinde 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, AuthenticationStateProvider'nin özel bir uygulamasıdır. 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 projenin Blazor Web App, kimlik doğrulama durumu sağlayıcısı, yalnızca sunucu etkileşim çözümleri için IdentityRevalidatingAuthenticationStateProvider(başvuru kaynağı) veya WebAssembly veya Otomatik etkileşim çözümleri için PersistingRevalidatingAuthenticationStateProvider(başvuru kaynağı) olarak adlandırılır.

Blazor Identity, özellikle bir fabrika tarafından oluşturulmamış örneklere bağlıdır, çünkü bu, proje şablonundaki DbContext bileşenlerinin etkileşimi desteklemeden statik olarak işlenmesi için yeterlidir.

Genel etkileşimli işleme modlarının non-Identity bileşenlere nasıl uygulandığını ve aynı zamanda Identity bileşenler için statik SSR'nin nasıl zorunlu kılındığını açıklayan bir tanım için bkz . ASP.NET Core Blazor işleme modları.

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

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 için etiket 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 dosyasında, sunucu tarafı tarafından döndürülen 'yi Kalıcı Bileşen Durumu hizmeti kullanarak seri hale getiren fonksiyonu çağırın ():

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, sunucu tarafındaki çağrıda SerializeAllClaims'yi true olarak ayarlayın AddAuthenticationStateSerialization.

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

İstemci (.Client) projesinin Program dosyasında, AddAuthenticationStateDeserialization kullanılarak sunucudan seri durumdan çıkarılan AuthenticationStateProvider öğesinin eklendiği AuthenticationState, AuthenticationStateData aracılığıyla çağrılır ve Kalıcı Bileşen Durumu hizmeti (PersistentComponentState) kullanılır. Sunucu projesinde, AddAuthenticationStateSerialization'e karşılık gelen bir çağrı 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 için etiket 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 dosyası oluşturma hakkında daha fazla bilgi için ASP.NET Core projelerinde oluşturma 'e bakın.

Sunucu tarafı Identity uygulamasına iskele Blazor 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'da dış sağlayıcılardan gelen ek talepler ve belirteçleri kalıcı hale getirme.

Linux üzerinde Identity Server ile 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 bir Web API arka ucunu güvenceye almak için Identity kullanma.

Bileşene özgü hizmetler için enjeksiyon yap AuthenticationStateProvider

Özel bir kapsam içinde AuthenticationStateProvider çözümlemeye çalışmayın, çünkü bu, doğru başlatılmamış yeni bir AuthenticationStateProvider örneğinin oluşturulmasıyla sonuçlanır.

Bir bileşene AuthenticationStateProvider enjekt ederek ve parametre olarak hizmete geçirerek, bir bileşen kapsamındaki bir hizmette AuthenticationStateProvider'a erişin. Bu yaklaşım, her kullanıcı uygulaması örneği için doğru, başlatılmış AuthenticationStateProvider örneğinin 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 belirli bir kapsamda 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.ConfigureServicesiçindeStartup.cs:

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 bağımlılık enjeksiyonu konusunda rehberliğine bakın.

Özelleştirilmiş bir AuthenticationStateProvider ile önceden render yaparken yetkisiz içerik görüntüleniyor.

Bir bileşendekiAuthorizeView içerik gibi yetkisiz içeriklerin, özel bir AuthenticationStateProvider ile önceden render edilirken gösterilmesini önlemek için aşağıdaki yaklaşımlardan birini benimseyin:

  • Ön işleme özelliğini devre dışı bırakın: Uygulamanın bileşen hiyerarşisinde kök bileşen olmayan en üst düzey bileşende prerender parametresi false olarak ayarlanarak 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 şablonuna dayanan uygulamalar için, Blazor Web App bileşeni Routes bileşeninde kullanıldığında, App ön-işleme 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ı.

  • Önyükleme dönüşümünü devre dışı bırakma: _Host.cshtml dosyasını açın ve Bileşen Etiket Yardımcısı'nın render-mode özniteliğini şu değere değiştirin:

    <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ülemeye gerçekten yetkili olmadığında gösterilir.

Kullanıcı durumu yönetimi

Addaki "state" sözcüğüne rağmen, AuthenticationStateProvidergenel 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 Blazor akışına yönlendirilir. ASP.NET Core Identity makaleleri ve öğreticilerindeki Identity yönergeleri izleyerek uygulamanın Blazor bölümlerinde özelliklerin etkili olmasını sağlayın.

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 için etiket 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ındaki 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. Bir sekmede oturum kapandığında, kullanıcıyı tüm tarayıcı sekmelerinde proaktif olarak kapatmak için kısa süreli bir RevalidatingServerAuthenticationStateProvider ve bir (RevalidationInterval) 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 için etiket 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 seçeneğini, sunucu tarafı işleme tarafından Blazor yayılan geçici yeniden yönlendirme URL'leri için ASP.NET Core Veri Koruması geçerliliğinin ömrünü almak veya ayarlamak amacıyla 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 kaymasına izin verecek şekilde yeterince 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));

İstemci tarafı Blazor kimlik doğrulaması

İstemci tarafı Blazor uygulamalarda, tüm istemci tarafı kodları kullanıcılar tarafından değiştirilebildiği için istemci tarafı kimlik doğrulama denetimleri atlanabilir. JavaScript SPA çerçeveleri ve herhangi bir işletim sistemi için yerel uygulamalar da dahil olmak üzere tüm istemci tarafı uygulama teknolojileri için de aynı durum geçerlidir.

Şunu ekleyin:

Kimlik doğrulamasını işlemek için yerleşik veya özel AuthenticationStateProvider hizmeti kullanın.

İstemci tarafı kimlik doğrulaması hakkında daha fazla bilgi için bkz . Secure ASP.NET Core Blazor WebAssembly.

Etkileşimli Otomatik görüntü işleme ile Blazor Web App'lerdeki verilerin güvenliğini sağlama

bir Blazor Web App , bileşenler için sunucu tarafı işleme (SSR) ve istemci tarafı işlemeyi (CSR) veya Etkileşimli Otomatik işleme modunu belirten bir uygulamanın tamamını benimsediğinde, bileşenlere ve verilere erişim yetkisi iki yerde uygulanır. Bileşen, bileşenin tanım dosyasındaki (@attribute [Authorize]) yetkilendirme özniteliği nedeniyle sunucuda işlendiğinde kendisine (ve elde ettiği tüm verilere) erişimi kısıtlar. Bileşen istemcide işlendiğinde, istemciden çağrılan sunucu web API'si uç noktaları aracılığıyla verilere erişim kısıtlanır. Yanlış veri erişimini önlemek için her iki konumda da veri erişiminin güvenliği sağlandığında dikkatli olunmalıdır.

Bir bileşen tarafından güvenli hava durumu verilerinin görüntülendiği aşağıdaki senaryoyu göz önünde bulundurun. Aşağıdaki yaklaşımlardan bazılarının tanıtımları, GitHub deposundaki BlazorWebAppEntra/BlazorWebAppEntraBfförnekler (.NET 9 veya üzeri) veyaBlazorWebAppOidc/BlazorWebAppOidcBfförnekler (.NET 8 veya üzeri) (Blazordotnet/blazor-samplesnasıl indirilir) kullanılarak değerlendirilebilir ve test edilebilir.

İstemci projesi, hava durumu verilerini tutmak için bir WeatherForecast sınıfı tutar:

public sealed class WeatherForecast(DateOnly date, int temperatureC, string summary)
{
    public DateOnly Date { get; set; } = date;
    public int TemperatureC { get; set; } = temperatureC;
    public string? Summary { get; set; } = summary;
    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

İstemci projesinin IWeatherForecaster arabirimi, hava durumu verilerini almak için bir GetWeatherForecastAsync yöntemi tanımlar:

public interface IWeatherForecaster
{
    Task<IEnumerable<WeatherForecast>> GetWeatherForecastAsync();
}

İstemci projesinin ClientWeatherForecaster hizmeti, IWeatherForecaster'i uygular. GetWeatherForecastAsync yöntemi, hava durumu verileri için /weather-forecast uç noktasındaki sunucu projesinde bir web API'sini çağırır:

internal sealed class ClientWeatherForecaster(HttpClient httpClient) 
    : IWeatherForecaster
{
    public async Task<IEnumerable<WeatherForecast>> GetWeatherForecastAsync() =>
        await httpClient.GetFromJsonAsync<WeatherForecast[]>("/weather-forecast") ??
            throw new IOException("No weather forecast!");
}

İstemci projesi Weather bileşenini içerir.

@page "/weather"
@using Microsoft.AspNetCore.Authorization
@using BlazorWebAppEntra.Client.Weather
@attribute [Authorize]
@inject IWeatherForecaster WeatherForecaster

<PageTitle>Weather</PageTitle>

<h1>Weather</h1>

<p>This component demonstrates showing data.</p>

@if (Forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Date</th>
                <th aria-label="Temperature in Celsius">Temp. (C)</th>
                <th aria-label="Temperature in Fahrenheit">Temp. (F)</th>
                <th>Summary</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var forecast in Forecasts)
            {
                <tr>
                    <td>@forecast.Date.ToShortDateString()</td>
                    <td>@forecast.TemperatureC</td>
                    <td>@forecast.TemperatureF</td>
                    <td>@forecast.Summary</td>
                </tr>
            }
        </tbody>
    </table>
}

@code {
    [SupplyParameterFromPersistentComponentState]
    public IEnumerable<WeatherForecast>? Forecasts { get; set; }

    protected override async Task OnInitializedAsync()
    {
        Forecasts ??= await WeatherForecaster.GetWeatherForecastAsync();
    }
}
@page "/weather"
@using Microsoft.AspNetCore.Authorization
@using BlazorWebAppEntra.Client.Weather
@attribute [Authorize]
@implements IDisposable
@inject PersistentComponentState ApplicationState
@inject IWeatherForecaster WeatherForecaster

<PageTitle>Weather</PageTitle>

<h1>Weather</h1>

<p>This component demonstrates showing data.</p>

@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Date</th>
                <th aria-label="Temperature in Celsius">Temp. (C)</th>
                <th aria-label="Temperature in Fahrenheit">Temp. (F)</th>
                <th>Summary</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var forecast in forecasts)
            {
                <tr>
                    <td>@forecast.Date.ToShortDateString()</td>
                    <td>@forecast.TemperatureC</td>
                    <td>@forecast.TemperatureF</td>
                    <td>@forecast.Summary</td>
                </tr>
            }
        </tbody>
    </table>
}

@code {
    private IEnumerable<WeatherForecast>? forecasts;
    private PersistingComponentStateSubscription persistingSubscription;

    protected override async Task OnInitializedAsync()
    {
        if (!ApplicationState.TryTakeFromJson<IEnumerable<WeatherForecast>>(
            nameof(forecasts), out var restoredData))
        {
            forecasts = await WeatherForecaster.GetWeatherForecastAsync();
        }
        else
        {
            forecasts = restoredData!;
        }

        // Call at the end to avoid a potential race condition at app shutdown
        persistingSubscription = ApplicationState.RegisterOnPersisting(PersistData);
    }

    private Task PersistData()
    {
        ApplicationState.PersistAsJson(nameof(forecasts), forecasts);

        return Task.CompletedTask;
    }

    void IDisposable.Dispose() => persistingSubscription.Dispose();
}

Sunucu projesi, IWeatherForecaster'yi ServerWeatherForecaster olarak uygular, GetWeatherForecastAsync yöntemi üzerinden hava durumu verilerini oluşturur ve döndürür.

internal sealed class ServerWeatherForecaster() : IWeatherForecaster
{
    public readonly string[] summaries =
    [
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", 
        "Sweltering", "Scorching"
    ];

    public async Task<IEnumerable<WeatherForecast>> GetWeatherForecastAsync()
    {
        // Simulate asynchronous loading to demonstrate streaming rendering
        await Task.Delay(500);

        return Enumerable.Range(1, 5).Select(index =>
            new WeatherForecast
            (
                DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                Random.Shared.Next(-20, 55),
                summaries[Random.Shared.Next(summaries.Length)]
            ))
        .ToArray();
    }
}

Uygulamanın hava durumu verilerini almak için bir dış web API'sini çağırması gerekiyorsa, verileri istemek için bir HTTP istemcisi (HttpClient) ekleyebilirsiniz:

internal sealed class ServerWeatherForecaster(HttpClient httpClient, 
    IHttpContextAccessor httpContextAccessor) : IWeatherForecaster
{
    public async Task<IEnumerable<WeatherForecast>> GetWeatherForecastAsync()
    {
        var httpContext = httpContextAccessor.HttpContext ??
            throw new InvalidOperationException("No HttpContext!");
        var accessToken = await httpContext.GetTokenAsync("access_token") ??
            throw new InvalidOperationException("No access_token was saved");
        using var request = 
            new HttpRequestMessage(HttpMethod.Get, "/weather-forecast");
        request.Headers.Authorization = new("Bearer", accessToken);
        using var response = await httpClient.SendAsync(request);
        response.EnsureSuccessStatusCode();

        return await response.Content.ReadFromJsonAsync<WeatherForecast[]>() ??
            throw new IOException("No weather forecast!");
    }
}

Başka bir yaklaşımda, bir HTTP istemci fabrikasını IHttpClientFactory içine enjekte edebilir ve belirteç işleme mekanizması ile adlandırılmış bir HTTP İstemci kullanarak dış web API'sine çağrı yapabilirsiniz. Daha fazla bilgi için bkz. ASP.NET Core Blazor uygulamasından web API'sini çağırma.

Uygulama Microsoft Entra Id için Microsoft Identity Web paketleriyle Microsoft kimlik platformunu kullanıyorsa (bkz. ASP.NET Core Blazor uygulamasından web API'si çağırma), aşağıda ServerWeatherForecaster dış web API çağrısı yapma işlemi gösterilmektedir. Erişim belirteci isteğe otomatik olarak eklenir.

internal sealed class ServerWeatherForecaster(IDownstreamApi downstreamApi) : IWeatherForecaster
{
    public async Task<IEnumerable<WeatherForecast>> GetWeatherForecastAsync()
    {
        using var response = await downstreamApi.CallApiForUserAsync("DownstreamApi",
            options =>
            {
                options.RelativePath = "/weather-forecast";
            });

        return await response.Content.ReadFromJsonAsync<WeatherForecast[]>() ??
            throw new IOException("No weather forecast!");
    }
}

ServerWeatherForecaster tarafından verinin elde edilme yaklaşımından bağımsız olarak, sunucu projesi, istemci hava durumu verisi çağrıları için güvenli bir web API uç noktası barındırır. Bu uç nokta sunucuda bir ServerWeatherForecaster.GetWeatherForecastAsync çağrıya neden olur:

app.MapGet("/weather-forecast", (
    [FromServices] IWeatherForecaster WeatherForecaster) =>
{
    return WeatherForecaster.GetWeatherForecastAsync();
}).RequireAuthorization();

Yukarıdaki yaklaşımı kullanarak, kullanıcıya güvenli hava durumu verileri sağlamak için iki sistem vardır:

  • Weather Bileşen sunucuda işlendiğinde, ServerWeatherForecaster hizmetin GetWeatherForecastAsync yöntemi doğrudan hava durumu verilerini almak için kullanılır. Verilerin güvenliği, bileşene ait [Authorize] özniteliği tarafından sağlanır. Özetle, hava durumu verilerinin güvenliği bileşen tarafından sağlanır.
  • Weather bileşeni istemcide işlendiğinde, ClientWeatherForecaster hizmeti, /weather-forecast uzantı metodunu uygulayan güvenli RequireAuthorization uç noktaya bir web API çağrısı yapmak için kullanılır. Kullanıcının hava durumu verilerine erişme yetkisi varsa, uç nokta ServerWeatherForecasterçağırmak için GetWeatherForecastAsync hizmetini kullanır. Veriler istemciye döndürülür. Özetle, hava durumu verilerinin güvenliği sunucu uygulamasının web API uç noktası tarafından sağlanır.

Yukarıdaki yaklaşım, web API'sinin güvenlik gereksinimleri bileşenin güvenlik gereksinimleriyle eşleştiğinde düzgün çalışır. Örneğin, aynı yetkilendirme ilkesi hem web API uç noktasına hem de bileşene uygulanabilir.

Karmaşık senaryolar için ek planlama ve uygulama gerekir. Örneğin, farklı erişim izinlerine sahip birden çok çağıranı olan bir sunucu web API'si, daha gelişmiş bir yetkilendirme ilkesi, bir veya daha fazla ek ilke veya farklı erişim gereksinimlerine sahip ek uç noktalar gerektirir.

Etkileşimli Otomatik işlemeyi benimseyen uygulamalarda güvenlik oluştururken, sunucunun web API'si uç noktaları için uygulanan güvenliğin sunucuda bir bileşen işlenirken kullanılan ve hizmet üzerinden verilere erişen sunucunun hizmet uygulamasının güvenliğini sağlamadığını unutmayın. SSR sırasında sunucudaki verilere erişim ile CSR sırasında istemci web API'sinin isteğindeki verilere erişim arasındaki farkı dikkatle değerlendirin. Uygunsuz veri erişimini önlemek için güvenliği stratejik olarak uygulayın.

Bu bölümde açıklanan yaklaşımı gösteren örnekler GitHub örnek deposunda (): nasıl indirilir

  • BlazorWebAppOidc
  • BlazorWebAppOidcBff
  • BlazorWebAppEntra
  • BlazorWebAppEntraBff

AuthenticationStateProvider hizmet

AuthenticationStateProvider bileşen AuthorizeView ve basamaklı kimlik doğrulama hizmetleri tarafından bir kullanıcının kimlik doğrulama durumunu elde etmek için kullanılan temel hizmettir.

AuthenticationStateProvider, AuthorizeView bileşeni ve CascadingAuthenticationState bileşeni tarafından bir kullanıcının kimlik doğrulama durumunu elde etmek için kullanılan temel hizmettir.

Genellikle doğrudan AuthenticationStateProvider kullanmazsınız. Bu makalede daha sonra açıklanan bileşenini veya yaklaşımlarını kullanın. Doğrudan AuthenticationStateProvider kullanmanın temel dezavantajı, temel kimlik doğrulaması durumu verileri değiştiğinde, bileşenin otomatik olarak bilgilendirilmemesidir.

Özel bir AuthenticationStateProvider uygulamak için, kullanıcı kimlik doğrulama durumu değişiklik bildirimlerini uygulama kılavuzlarını içeren ASP.NET Core Blazor kimlik doğrulama durumu'na bakın.

Kullanıcının kimlik verilerini alma

AuthenticationStateProvider hizmeti, aşağıdaki örnekte gösterildiği gibi geçerli kullanıcının ClaimsPrincipal verilerini sağlayabilir.

ClaimsPrincipalData.razor:

@page "/claims-principal-data"
@using System.Security.Claims
@inject AuthenticationStateProvider AuthenticationStateProvider

<h1>ClaimsPrincipal Data</h1>

<button @onclick="GetClaimsPrincipalData">Get ClaimsPrincipal Data</button>

<p>@authMessage</p>

@if (claims.Any())
{
    <ul>
        @foreach (var claim in claims)
        {
            <li>@claim.Type: @claim.Value</li>
        }
    </ul>
}

<p>@surname</p>

@code {
    private string? authMessage;
    private string? surname;
    private IEnumerable<Claim> claims = Enumerable.Empty<Claim>();

    private async Task GetClaimsPrincipalData()
    {
        var authState = await AuthenticationStateProvider
            .GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity is not null && user.Identity.IsAuthenticated)
        {
            authMessage = $"{user.Identity.Name} is authenticated.";
            claims = user.Claims;
            surname = user.FindFirst(c => c.Type == ClaimTypes.Surname)?.Value;
        }
        else
        {
            authMessage = "The user is NOT authenticated.";
        }
    }
}

Yukarıdaki örnekte:

  • ClaimsPrincipal.Claims kullanıcı arabiriminde görüntülenmek üzere kullanıcının taleplerini (claims) döndürür.
  • Kullanıcının soyadını (surname) alan satır, kullanıcının taleplerini filtrelemek için bir kontrol ifadesiyle ClaimsPrincipal.FindAll'i çağırır.
@page "/claims-principal-data"
@using System.Security.Claims
@inject AuthenticationStateProvider AuthenticationStateProvider

<h1>ClaimsPrincipal Data</h1>

<button @onclick="GetClaimsPrincipalData">Get ClaimsPrincipal Data</button>

<p>@authMessage</p>

@if (claims.Any())
{
    <ul>
        @foreach (var claim in claims)
        {
            <li>@claim.Type: @claim.Value</li>
        }
    </ul>
}

<p>@surname</p>

@code {
    private string? authMessage;
    private string? surname;
    private IEnumerable<Claim> claims = Enumerable.Empty<Claim>();

    private async Task GetClaimsPrincipalData()
    {
        var authState = await AuthenticationStateProvider
            .GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity is not null && user.Identity.IsAuthenticated)
        {
            authMessage = $"{user.Identity.Name} is authenticated.";
            claims = user.Claims;
            surname = user.FindFirst(c => c.Type == ClaimTypes.Surname)?.Value;
        }
        else
        {
            authMessage = "The user is NOT authenticated.";
        }
    }
}

user.Identity.IsAuthenticated ise true ve kullanıcı bir ClaimsPrincipal olduğu için talepler numaralandırılabilir ve rollerdeki üyelik değerlendirilebilir.

Bağımlılık ekleme (DI) ve hizmetler hakkında daha fazla bilgi için bkz. ASP.NET Core Blazor bağımlılık ekleme ve ASP.NET Core'da bağımlılık ekleme. Özel AuthenticationStateProvideruygulama hakkında bilgi için bkz. ASP.NET Çekirdek Blazor kimlik doğrulama durumu.

Kimlik doğrulaması durumunu basamaklı parametre olarak kullanıma sunma

Eğer kullanıcı tarafından tetiklenen bir eylem gerçekleştirildiğinde yordamsal mantık için kimlik doğrulama durumu verilerine ihtiyaç varsa, aşağıdaki örnekte gösterildiği gibi tanımlayarak kimlik doğrulama durumu verilerini alın.

CascadeAuthState.razor:

@page "/cascade-auth-state"

<h1>Cascade Auth State</h1>

<p>@authMessage</p>

@code {
    private string authMessage = "The user is NOT authenticated.";

    [CascadingParameter]
    private Task<AuthenticationState>? authenticationState { get; set; }

    protected override async Task OnInitializedAsync()
    {
        if (authenticationState is not null)
        {
            var authState = await authenticationState;
            var user = authState?.User;

            if (user?.Identity is not null && user.Identity.IsAuthenticated)
            {
                authMessage = $"{user.Identity.Name} is authenticated.";
            }
        }
    }
}
@page "/cascade-auth-state"

<h1>Cascade Auth State</h1>

<p>@authMessage</p>

@code {
    private string authMessage = "The user is NOT authenticated.";

    [CascadingParameter]
    private Task<AuthenticationState>? authenticationState { get; set; }

    protected override async Task OnInitializedAsync()
    {
        if (authenticationState is not null)
        {
            var authState = await authenticationState;
            var user = authState?.User;

            if (user?.Identity is not null && user.Identity.IsAuthenticated)
            {
                authMessage = $"{user.Identity.Name} is authenticated.";
            }
        }
    }
}

user.Identity.IsAuthenticated true ise, talepler numaralandırılabilir ve rollerdeki üyelik değerlendirilebilir.

Basamaklı kimlik doğrulama durumu hizmetlerini ve Task< kullanarak AuthenticationState>AuthorizeRouteView ayarlayın.

Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden bir Blazor uygulaması oluşturduğunuzda, uygulama aşağıdaki örnekte gösterilen Blazor ve AuthorizeRouteView çağrısını içerir. İstemci tarafı Blazor uygulaması gerekli hizmet kayıtlarını da içerir. Ek bilgiler Yetkisiz içeriği Router bileşeni ile özelleştirin bölümünde sunulmuştur.

<Router ...>
    <Found ...>
        <AuthorizeRouteView RouteData="routeData" 
            DefaultLayout="typeof(Layout.MainLayout)" />
        ...
    </Found>
</Router>

Program Dosyasında, basamaklı kimlik doğrulama durumu hizmetlerini kaydedin:

builder.Services.AddCascadingAuthenticationState();

Task< AuthenticationState > Basamaklı parametreyi, AuthorizeRouteView ve CascadingAuthenticationState bileşenlerini kullanarak ayarlayın.

Kimlik doğrulaması etkinleştirilmiş proje şablonlarından biriyle bir Blazor uygulama oluşturduğunuzda, uygulama aşağıdaki örnekte gösterilen Blazor ve AuthorizeRouteView bileşenlerini içerir. İstemci tarafı Blazor uygulaması gerekli hizmet kayıtlarını da içerir. Ek bilgiler Yetkisiz içeriği Router bileşeni ile özelleştirin bölümünde sunulmuştur.

<CascadingAuthenticationState>
    <Router ...>
        <Found ...>
            <AuthorizeRouteView RouteData="routeData" 
                DefaultLayout="typeof(MainLayout)" />
            ...
        </Found>
    </Router>
</CascadingAuthenticationState>

Not

.NET 5.0.1 sürümünün çıkışı ve ek 5.x sürümleri için, Router bileşeni PreferExactMatches parametresini @true olarak ayarlayacaktır. Daha fazla bilgi için bkz. ASP.NET Core 3.1'den .NET 5'e geçiş.

İstemci tarafı Blazor uygulamasında, dosyaya Program yetkilendirme hizmetleri ekleyin:

builder.Services.AddAuthorizationCore();

İstemci tarafı Blazor uygulamasında dosyaya Program seçenekler ve yetkilendirme hizmetleri ekleyin:

builder.Services.AddOptions();
builder.Services.AddAuthorizationCore();

Sunucu tarafı Blazor bir uygulamada, seçenekler ve yetkilendirme hizmetleri zaten vardır, bu nedenle başka adım gerekmez.

Yetkilendirme

Kullanıcının kimliği doğrulandıktan sonra, kullanıcının neler yapabileceğini denetlemek için yetkilendirme kuralları uygulanır.

Erişim genellikle şunlara bağlı olarak verilir veya reddedilir:

  • Kullanıcının kimliği doğrulandı (oturum açtı).
  • Bir kullanıcı rolündedir.
  • Kullanıcının bir talebi vardır.
  • bir ilke karşılandı.

Bu kavramların her biri bir ASP.NET Core MVC veya Razor Sayfalar uygulamasındaki kavramlarla aynıdır. ASP.NET Core güvenliği hakkında daha fazla bilgi için ASP.NET Core Security ve Identityaltındaki makalelere bakın.

AuthorizeView bileşeni

AuthorizeView bileşeni, kullanıcının yetkilendirilip yetkilendirilmediğine bağlı olarak kullanıcı arabirimi içeriğini, seçmeli olarak görüntüler. Bu yaklaşım, yalnızca kullanıcının verilerini görüntülemeniz gerektiğinde ve yordamsal mantıkta kullanıcının kimliğini kullanmanız gerekmeyen durumlarda kullanışlıdır.

Bileşen, oturum açmış kullanıcı hakkındaki bilgilere erişmek için kullanabileceğiniz türde context (AuthenticationStatesöz diziminde@context) bir Razor değişken sunar:

<AuthorizeView>
    <p>Hello, @context.User.Identity?.Name!</p>
</AuthorizeView>

Ayrıca, kullanıcı ve Authorized parametrelerinin NotAuthorized bir bileşimiyle yetkilendirilmediyse görüntüleme için farklı içerik sağlayabilirsiniz:

<AuthorizeView>
    <Authorized>
        <p>Hello, @context.User.Identity?.Name!</p>
        <p><button @onclick="HandleClick">Authorized Only Button</button></p>
    </Authorized>
    <NotAuthorized>
        <p>You're not authorized.</p>
    </NotAuthorized>
</AuthorizeView>

@code {
    private void HandleClick() { ... }
}

Kullanıcının yetkilendirme durumuna göre öğelerin görünürlüğünü AuthorizeView bileşeni denetlese de, güvenliği olay işleyicisinin kendisinde uygulanmaz. Yukarıdaki örnekte, HandleClick yöntem yalnızca yetkili kullanıcılar tarafından görülebilen bir düğmeyle ilişkilendirilir, ancak bu yöntemin başka yerlerden çağrılmasını engelleyen bir şey yoktur. Yöntem düzeyinde güvenlik sağlamak için işleyicinin içinde veya ilgili API'de ek yetkilendirme mantığı uygulayın.

Sunucu tarafında yetkilendirme başarısız olduğunda, statik sunucu tarafı işleme (statik SSR) sırasında RazorBlazor Web App bileşenleri hiçbir zaman içerik görüntülemez <NotAuthorized>. Sunucu tarafı ASP.NET Core işlem hattı, sunucuda yetkilendirmeyi işler. Yetkisiz istekleri işlemek için sunucu tarafı tekniklerini kullanın. Daha fazla bilgi için bkz . ASP.NET Core Blazor işleme modları.

Uyarı

İstemci tarafı işaretlemesi ve AuthorizeView ile ilişkilendirilmiş yöntemler, yalnızca istemci tarafı uygulamalarında işlenen kullanıcı arabiriminde görüntüleme ve yürütmeye karşı korunur. İstemci tarafında Blazoryetkili içeriği ve güvenli yöntemleri korumak için, içerik genellikle bir sunucu API'sine güvenli, yetkili bir web API'si çağrısı tarafından sağlanır ve hiçbir zaman uygulamada depolanmaz. Daha fazla bilgi için bkz. ASP.NET Core Blazor uygulamasından web API'sini çağırma ve ASP.NET Core Blazor WebAssembly ek güvenlik senaryoları.

ve Authorized içeriğiNotAuthorized, diğer etkileşimli bileşenler gibi rastgele öğeler içerebilir.

Kullanıcı arabirimi seçeneklerini veya erişimini denetleyen roller veya ilkeler gibi yetkilendirme koşulları Yetkilendirme bölümünde ele alınmıştır.

Yetkilendirme koşulları belirtilmezse, AuthorizeView varsayılan ilkeyi kullanır:

  • Kimliği doğrulanmış (oturum açmış) kullanıcılar yetkilendirilir.
  • Kimliği doğrulanmamış (oturum kapatılmış) kullanıcılar yetkisizdir.

AuthorizeView bileşeni, NavMenu bileşeni içindeki Shared/NavMenu.razor bileşeni (NavLink) görüntülemek için kullanılabilir ancak bu yaklaşımın yalnızca işlenen çıktıdan liste öğesini kaldırdığını unutmayın. Bu, kullanıcının bileşene geçmesini engellemez. Yetkilendirmeyi hedef bileşende ayrı olarak uygulayın.

Rol tabanlı ve ilke tabanlı yetkilendirme

Bileşen AuthorizeView rol tabanlı veya ilke tabanlı yetkilendirmeyi destekler.

Rol tabanlı yetkilendirme için parametresini Roles kullanın. Aşağıdaki örnekte, kullanıcının ya Admin ya da Superuser rolü için bir rol talebi olmalıdır.

<AuthorizeView Roles="Admin, Superuser">
    <p>You have an 'Admin' or 'Superuser' role claim.</p>
</AuthorizeView>

Bir kullanıcının hem Admin hem de Superuser rol taleplerine sahip olmasını istemek için, AuthorizeView bileşenlerini iç içe yerleştirin:

<AuthorizeView Roles="Admin">
    <p>User: @context.User</p>
    <p>You have the 'Admin' role claim.</p>
    <AuthorizeView Roles="Superuser" Context="innerContext">
        <p>User: @innerContext.User</p>
        <p>You have both 'Admin' and 'Superuser' role claims.</p>
    </AuthorizeView>
</AuthorizeView>

Önceki kod, bir bağlam çakışmasını önlemek için iç Context bileşeni için bir AuthorizeView kurar. Dış AuthenticationState bağlamına AuthorizeView ve standart bağlama erişim yaklaşımı (@context.User) ile erişilir. İsimlendirilmiş AuthorizeView bağlamı (innerContext) ile içte bulunan @innerContext.User'da bağlama erişilir.

Yapılandırma kılavuzu da dahil olmak üzere daha fazla bilgi için bkz. ASP.NET Core'da rol tabanlı yetkilendirme.

İlke tabanlı yetkilendirme için parametresini Policy tek bir ilke adıyla kullanın:

<AuthorizeView Policy="Over21">
    <p>You satisfy the 'Over21' policy.</p>
</AuthorizeView>

Kullanıcının çeşitli ilkelerden birini karşılaması gereken durumu işlemek için, kullanıcının diğer ilkeleri karşıladığını onaylayan bir ilke oluşturun.

Kullanıcının aynı anda birkaç ilkeyi karşılaması gereken durumu işlemek için aşağıdaki yaklaşımlardan birini uygulayın:

  • Kullanıcının diğer birkaç ilkeyi karşıladığını doğrulayan bir politika AuthorizeView oluşturun.

  • Politikaları birden çok AuthorizeView bileşende iç içe yerleştirin.

    <AuthorizeView Policy="Over21">
        <AuthorizeView Policy="LivesInCalifornia">
            <p>You satisfy the 'Over21' and 'LivesInCalifornia' policies.</p>
        </AuthorizeView>
    </AuthorizeView>
    

Talep tabanlı yetkilendirme, ilke tabanlı yetkilendirme için özel bir durumdur. Örneğin, kullanıcıların belirli bir talebe sahip olmasını gerektiren bir ilke tanımlayabilirsiniz. Daha fazla bilgi için bkz. ASP.NET Core'da ilke tabanlı yetkilendirme.

Her iki Roles ve Policy ayarlandığında, yetkilendirme yalnızca her iki koşul da karşılandığında başarılı olur. Başka bir ifadeyle, kullanıcının belirtilen rollerden en az birine ait olması ve ilke tarafından tanımlanan gereksinimleri karşılaması gerekir.

Ne Roles ne de Policy belirtilirse, AuthorizeView varsayılan politikayı kullanır:

  • Kimliği doğrulanmış (oturum açmış) kullanıcılar yetkilendirilir.
  • Kimliği doğrulanmamış (oturum kapatılmış) kullanıcılar yetkisizdir.

.NET string karşılaştırmaları büyük/küçük harfe duyarlı olduğundan, rol ve ilke adlarıyla eşleşmeler de büyük/küçük harfe duyarlıdır. Örneğin, Admin (büyük harf A), admin (küçük harf a) ile aynı rol olarak değerlendirilmez.

Pascal biçimi genellikle rol ve politika adları (örneğin, BillingAdministrator) için kullanılır, ancak Pascal biçimi kullanımı katı bir gereksinim değildir. Deve kasası, kebap kasası ve yılan kutusu gibi farklı kasa düzenlerine izin verilir. Rol ve ilke adlarında boşluk kullanmak olağan dışıdır ancak çerçeve tarafından izin verilir. Örneğin, billing administrator .NET uygulamalarında olağan dışı bir rol veya ilke adı biçimidir, ancak geçerli bir rol veya ilke adıdır.

Zaman uyumsuz kimlik doğrulaması sırasında görünen içerik

Blazor kimlik doğrulama durumunun zaman uyumsuz olarak belirlenmesini sağlar. Bu yaklaşımın birincil senaryosu, kimlik doğrulaması için bir dış uç noktaya istekte bulunan istemci tarafı Blazor uygulamalarındadır.

Kimlik doğrulaması devam ederken AuthorizeView herhangi bir içerik gösterilmez. Kimlik doğrulaması gerçekleşirken içeriği görüntülemek için parametresine içerik atayın Authorizing :

<AuthorizeView>
    <Authorized>
        <p>Hello, @context.User.Identity?.Name!</p>
    </Authorized>
    <Authorizing>
        <p>You can only see this content while authentication is in progress.</p>
    </Authorizing>
</AuthorizeView>

Bu yaklaşım normalde sunucu tarafı Blazor uygulamalar için geçerli değildir. Sunucu tarafı Blazor uygulamalar, durum oluşturulduğunda kimlik doğrulama durumunu bilir. Authorizing içerik bir uygulamanın AuthorizeView bileşeninde sağlanabilir, ancak içerik hiçbir zaman görüntülenmez.

[Authorize] özniteliği

[Authorize] Özniteliği bileşenlerde Razor kullanılabilir:

@page "/"
@attribute [Authorize]

You can only see this if you're signed in.

Önemli

[Authorize] yönlendirici aracılığıyla ulaşılan @page bileşenlerde yalnızca Blazor kullanın. Yetkilendirme, yalnızca yönlendirmenin bir yönü olarak gerçekleştirilir ve bir sayfada işlenen alt bileşenler için değildir. Bir sayfa içindeki belirli parçaların görüntülenmesini yetkilendirmek için, bunun yerine AuthorizeView kullanın.

[Authorize] özniteliği rol tabanlı veya ilke tabanlı yetkilendirmeyi de destekler. Rol tabanlı yetkilendirme için Roles parametresini kullanın:

@page "/"
@attribute [Authorize(Roles = "Admin, Superuser")]

<p>You can only see this if you're in the 'Admin' or 'Superuser' role.</p>

İlke tabanlı yetkilendirme için Policy parametresini kullanın:

@page "/"
@attribute [Authorize(Policy = "Over21")]

<p>You can only see this if you satisfy the 'Over21' policy.</p>

Ne Roles ne de Policy belirtilirse, [Authorize] varsayılan politikayı kullanır:

  • Kimliği doğrulanmış (oturum açmış) kullanıcılar yetkilendirilir.
  • Kimliği doğrulanmamış (oturum kapatılmış) kullanıcılar yetkisizdir.

Kullanıcı yetkilendirilmediğinde ve uygulama bileşenle Router yetkisiz içeriği özelleştirmediğinde çerçeve otomatik olarak aşağıdaki geri dönüş iletisini görüntüler:

Not authorized.

Kaynak yetkilendirmesi

Kullanıcılara kaynak yetkilendirmek için, isteğin yol verilerini Resource öğesinin AuthorizeRouteView parametresine geçirin.

İstenen bir yön için Router.Found içerik içeriğinde:

<AuthorizeRouteView Resource="routeData" RouteData="routeData" 
    DefaultLayout="typeof(MainLayout)" />

Yetkilendirme durumu verilerinin yordam mantığında nasıl geçirilip kullanıldığı hakkında daha fazla bilgi için , Kimlik doğrulama durumunu basamaklı parametre olarak kullanıma sunma bölümüne bakın.

AuthorizeRouteView, kaynağın rota verilerini aldığında, yetkilendirme ilkeleri RouteData.PageType ve RouteData.RouteValues'ye erişebilmekte ve bu da özelleştirilmiş mantıkla yetkilendirme kararları alınmasına olanak tanımaktadır.

Aşağıdaki örnekte, EditUser adlı bir ilke, AuthorizationOptions içinde, uygulamanın yetkilendirme hizmeti yapılandırması için aşağıdaki mantıkla oluşturulmuştur:

  • Bir rota değerinin id anahtarıyla var olup olmadığını belirleme. Anahtar varsa, rota değeri value içinde depolanır.
  • id adlı bir değişkende value bir dize olarak depolanır veya boş bir dize değeri (string.Empty) ayarlanır.
  • id boş bir dize değilse, dizenin değeri true ile başlıyorsa politikanın karşılandığını beyan edin (ve EMP döndürün). Aksi takdirde, ilkenin başarısız olduğunu onaylar (false döndürür).

Program dosyasında:

  • Microsoft.AspNetCore.Components ve System.Linq için ad alanları ekleme:

    using Microsoft.AspNetCore.Components;
    using System.Linq;
    
  • İlkeyi ekle.

    options.AddPolicy("EditUser", policy =>
        policy.RequireAssertion(context =>
        {
            if (context.Resource is RouteData rd)
            {
                var routeValue = rd.RouteValues.TryGetValue("id", out var value);
                var id = Convert.ToString(value, 
                    System.Globalization.CultureInfo.InvariantCulture) ?? string.Empty;
    
                if (!string.IsNullOrEmpty(id))
                {
                    return id.StartsWith("EMP", StringComparison.InvariantCulture);
                }
            }
    
            return false;
        })
    );
    

Yukarıdaki örnek, yalnızca kavramı çalışan bir örnekle göstermek için kullanılan aşırı basit bir yetkilendirme ilkesidir. Yetkilendirme ilkelerini oluşturma ve yapılandırma hakkında daha fazla bilgi için bkz. ASP.NET Core'da ilke tabanlı yetkilendirme.

Aşağıdaki EditUser bileşeninde, /users/{id}/edit konumundaki kaynağın, kullanıcının tanımlayıcısı ({id}) için bir rota parametresi bulunur. Bileşen, EditUser için rota değerinin id ile çalışmaya başlayıp başlamadığını öğrenmek için önceki EMP yetkilendirme ilkesini kullanır. id, EMP ile başlıyorsa, ilke başarılı olur ve bileşene erişim yetkisi verilir. id, EMP dışında bir değerle başlıyorsa veya id boş bir dize ise, ilke başarısız olur ve bileşen yüklenmez.

EditUser.razor:

@page "/users/{id}/edit"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Policy = "EditUser")]

<h1>Edit User</h1>

<p>The "EditUser" policy is satisfied! <code>Id</code> starts with 'EMP'.</p>

@code {
    [Parameter]
    public string? Id { get; set; }
}
@page "/users/{id}/edit"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Policy = "EditUser")]

<h1>Edit User</h1>

<p>The "EditUser" policy is satisfied! <code>Id</code> starts with 'EMP'.</p>

@code {
    [Parameter]
    public string? Id { get; set; }
}

Yetkisiz içeriği Router bileşeniyle özelleştirin

Router bileşeniyle birlikte AuthorizeRouteView bileşeni, uygulamanın şu durumlarda özel içerik belirlemesine izin verir:

  • Kullanıcı, bileşene uygulanan bir [Authorize] koşulunu gerçekleştiremez. <NotAuthorized> öğesinin biçimlendirmesi görüntülenir. [Authorize] özniteliği, [Authorize] özniteliği bölümünde ele alınmıştır.
  • Asenkron kimlik doğrulama işlemi devam ediyor, bu genellikle kullanıcının kimlik doğrulama sürecinin devam ettiği anlamına gelir. <Authorizing> öğesinin biçimlendirmesi görüntülenir.

Önemli

Blazor ve <NotAuthorized> içeriklerini görüntüleyen yönlendirici özellikleri, statik sunucu tarafı işleme (statik SSR) sırasında çalışmaz çünkü istek işleme tamamen ASP.NET Core ara yazılım işlem hattı tarafından gerçekleştirilir ve <NotFound> bileşenler yetkisiz veya hatalı istekler için hiç işlenmez. Statik SSR sırasında yetkisiz ve hatalı istekleri işlemek için sunucu tarafı tekniklerini kullanın. Daha fazla bilgi için bkz . ASP.NET Core Blazor işleme modları.

<Router ...>
    <Found ...>
        <AuthorizeRouteView ...>
            <NotAuthorized>
                ...
            </NotAuthorized>
            <Authorizing>
                ...
            </Authorizing>
        </AuthorizeRouteView>
    </Found>
</Router>

ve Authorized içeriğiNotAuthorized, diğer etkileşimli bileşenler gibi rastgele öğeler içerebilir.

Not

Yukarıdaki, uygulamanın Program dosyasında basamaklı kimlik doğrulaması durum hizmetleri kaydı gerektirir:

builder.Services.AddCascadingAuthenticationState();
<CascadingAuthenticationState>
    <Router ...>
        <Found ...>
            <AuthorizeRouteView ...>
                <NotAuthorized>
                    ...
                </NotAuthorized>
                <Authorizing>
                    ...
                </Authorizing>
            </AuthorizeRouteView>
        </Found>
    </Router>
</CascadingAuthenticationState>

, NotFoundve Authorized içeriğiNotAuthorized, diğer etkileşimli bileşenler gibi rastgele öğeler içerebilir.

İçerik belirtilmezse NotAuthorized , AuthorizeRouteView aşağıdaki geri dönüş iletisini kullanır:

Not authorized.

Kimlik doğrulaması etkin Blazor WebAssembly proje şablonundan oluşturulan bir uygulama, RedirectToLogin bileşenin içeriğine yerleştirilen <NotAuthorized> bileşeni ve Router bileşeni içerir. Kullanıcının kimliği doğrulanmamışsa (context.User.Identity?.IsAuthenticated != true ), RedirectToLogin bileşen tarayıcıyı authentication/login kimlik doğrulaması için uç noktaya yönlendirir. Kullanıcı, kimlik sağlayıcısıyla kimlik doğrulamasından sonra istenen URL'ye döndürülür.

Yordamsal mantığı

Uygulama, yordamsal mantığın bir parçası olarak yetkilendirme kurallarını denetmek için gerekliyse, kullanıcının Task< değerini elde etmek için AuthenticationState>ClaimsPrincipal türünde basamaklı bir parametre kullanın. Task< AuthenticationState > ilkeleri değerlendirmek için IAuthorizationService gibi diğer hizmetlerle birleştirilebilir.

Aşağıdaki örnekte:

  • Kimliği doğrulanmış (oturum açmış) kullanıcılar için kodu user.Identity.IsAuthenticated yürütür.
  • , user.IsInRole("admin") 'Yönetici' rolündeki kullanıcılar için kod yürütür.
  • (await AuthorizationService.AuthorizeAsync(user, "content-editor")).Succeeded 'content-editor' politikasını karşılayan kullanıcılar için kod yürütür.

Sunucu tarafı Blazor uygulama, proje şablonundan oluşturulduğunda uygun ad alanlarını içerir. İstemci taraflı Blazor uygulamada, Microsoft.AspNetCore.Authorization ve Microsoft.AspNetCore.Components.Authorization ad alanlarının bileşende veya uygulamanın _Imports.razor dosyasında mevcut olduğunu doğrulayın.

@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization

ProceduralLogic.razor:

@page "/procedural-logic"
@inject IAuthorizationService AuthorizationService

<h1>Procedural Logic Example</h1>

<button @onclick="@DoSomething">Do something important</button>

@code {
    [CascadingParameter]
    private Task<AuthenticationState>? authenticationState { get; set; }

    private async Task DoSomething()
    {
        if (authenticationState is not null)
        {
            var authState = await authenticationState;
            var user = authState?.User;

            if (user is not null)
            {
                if (user.Identity is not null && user.Identity.IsAuthenticated)
                {
                    // ...
                }

                if (user.IsInRole("Admin"))
                {
                    // ...
                }

                if ((await AuthorizationService.AuthorizeAsync(user, "content-editor"))
                    .Succeeded)
                {
                    // ...
                }
            }
        }
    }
}
@page "/procedural-logic"
@inject IAuthorizationService AuthorizationService

<h1>Procedural Logic Example</h1>

<button @onclick="@DoSomething">Do something important</button>

@code {
    [CascadingParameter]
    private Task<AuthenticationState>? authenticationState { get; set; }

    private async Task DoSomething()
    {
        if (authenticationState is not null)
        {
            var authState = await authenticationState;
            var user = authState?.User;

            if (user is not null)
            {
                if (user.Identity is not null && user.Identity.IsAuthenticated)
                {
                    // ...
                }

                if (user.IsInRole("Admin"))
                {
                    // ...
                }

                if ((await AuthorizationService.AuthorizeAsync(user, "content-editor"))
                    .Succeeded)
                {
                    // ...
                }
            }
        }
    }
}

Hataları giderme

Sık karşılaşılan hatalar:

  • Yetkilendirme, Task<AuthenticationState> türünde basamaklı bir parametre gerektirir. Bunu sağlamak için, CascadingAuthenticationState kullanmayı düşünün.

  • null için değeri alınır authenticationStateTask

Büyük olasılıkla proje, kimlik doğrulaması etkinleştirilmiş bir sunucu tarafı Blazor şablonu kullanılarak oluşturulmamıştır.

.NET 7 veya önceki sürümlerinde, örneğin yönlendiricinin etrafında olmak üzere kullanıcı arabirimi ağacının bir bölümünü bir <CascadingAuthenticationState> ile sarın.

<CascadingAuthenticationState>
    <Router ...>
        ...
    </Router>
</CascadingAuthenticationState>

.NET 8 veya sonraki sürümlerinde şu bileşeni kullanmayın CascadingAuthenticationState :

- <CascadingAuthenticationState>
      <Router ...>
          ...
      </Router>
- </CascadingAuthenticationState>

Bunun yerine, dosyadaki Program hizmet koleksiyonuna basamaklı kimlik doğrulama durumu hizmetleri ekleyin:

builder.Services.AddCascadingAuthenticationState();

CascadingAuthenticationState bileşeni (.NET 7 veya öncesi) ya da AddCascadingAuthenticationState tarafından sağlanan hizmetler (.NET 8 veya üzeri), Task<AuthenticationState> basamaklı parametresini sağlar ve bu parametre de temel AuthenticationStateProvider bağımlılık ekleme hizmetinden alınır.

Kişisel Bilgiler (PII)

Microsoft, belgelerde Kişisel Bilgiler (PII) ele alınırken 'kişisel veriler' (GDPR 4.1) için GDPR tanımını kullanır.

PII, tanımlanan veya tanımlanabilir bir gerçek kişiyle ilgili tüm bilgileri ifade eder. Tanımlanabilir bir gerçek kişi, aşağıdakilerden herhangi biriyle doğrudan veya dolaylı olarak tanımlanabilen kişidir:

  • İsim
  • Kimlik numarası
  • Konum koordinatları
  • Çevrimiçi tanımlayıcı
  • Diğer belirli faktörler
    • Fiziksel
    • Fizyolojik
    • Genetik
    • Zihinsel (psikolojik)
    • Ekonomik
    • Kültürel
    • Sosyal kimlik

Ek kaynaklar