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 identitykimliğ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ılır, sunucu tarafı veya istemci tarafı bağlıdır.

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ı zorunlu kılmak veya istemci tarafı içeriğin görüntülenmesini denetlemek için güvenilmez.

Yetkilendirme kuralı uygulamasının garanti edilmesi gerekiyorsa, istemci tarafı kodunda yetkilendirme denetimleri uygulamayın. Yetkilendirme denetimleri ve kural zorlama için yalnızca sunucu tarafı işlemeye (SSR) dayalı bir Blazor Web App derleme.

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

Razor Sayfa yetkilendirme kuralları , yönlendirilebilir Razor bileşenlerine uygulanmaz. Yönlendirilebilir Razor olmayan bir bileşen Sayfalar uygulamasının Razorbir sayfasına eklenmişse, sayfanın yetkilendirme kuralları, sayfanın içeriğiyle Razor birlikte bileşeni dolaylı olarak etkilerrest.

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. Kullanıcı yönetimi için ASP.NET Core Identity 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ı arabirimi Razor bileşenleri yerine Identity Pages 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. ile ASP.NET Core Identity kullanma hakkında daha fazla bilgi için bkzBlazor iskeleleştirme.

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.

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

Uygulama gizli dizilerini, bağlantı dizesi'leri, 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:

Antiforgery 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 kötü amaçlı yazılımdan koruma belirtecine erişim sağlar. Hizmeti ekleyin ve geçerli GetAntiforgeryToken()almak için yöntemini çağırınAntiforgeryRequestToken. 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

Kötü amaçlı yazılımdan koruma azaltma, yalnızca , application/x-www-form-urlencodedolarak multipart/form-datakodlanmış sunucuya form verileri gönderirken veya text/plain bunlar tek geçerli form enktype'ları olduğundan gereklidir.

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

  • ASP.NET Core'da Siteler Arası İstek Sahteciliği (XSRF/CSRF) saldırılarını önleme: Bu makale, sunucu tarafıBlazor Server, s sunucu projesi ve Blazor Web App MVC/Blazor Pages ile tümleştirme için geçerli olan konuyla ilgili birincil ASP.NET Core makalesidirRazor.
  • ASP.NET Core Blazor formlarına genel bakış: Makalenin Blazor bölümü, antiforgery desteği oluşturur.

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 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 istemciyle bir SignalR bağlantı üzerinden WebSocket'e ilk bağlandığı zamandır. Kimlik doğrulaması bir veya başka bir cookie taşıyıcı belirteci temel alabilir, ancak kimlik doğrulaması hub üzerinden SignalR 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 Core sunucu tarafı ve Blazor Web App 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 özetiniRevalidatingAuthenticationStateProvider 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.

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

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

IHttpContextAccessor / HttpContextbileşenlerde Razor

IHttpContextAccessor geçerli HttpContext bir kullanılabilir değer olmadığından etkileşimli işlemeden kaçınılmalıdır.

IHttpContextAccessor sunucuda statik olarak işlenen bileşenler için kullanılabilir. Ancak mümkünse bundan kaçınmanızı öneririz.

HttpContext, üst bilgileri veya bileşendeki diğer özellikleri () inceleme ve değiştirme gibi genel görevler için yalnızca statik olarak işlenmiş kök bileşenlerdeApp basamaklı parametreComponents/App.razorkullanılabilir. Değer her zaman null etkileşimli işleme içindir.

[CascadingParameter]
public HttpContext? HttpContext { get; set; }

öğesinin HttpContext etkileşimli bileşenlerde gerekli olduğu senaryolar için verileri sunucudan kalıcı bileşen durumu aracılığıyla akışla aktarmanızı öneririz. Daha fazla bilgi için bkz . ASP.NET Core sunucu tarafı ve Blazor Web App ek güvenlik senaryoları.

Sunucu tarafı uygulamaların bileşenlerinde doğrudan veya dolaylı olarak kullanmayınIHttpContextAccessor./HttpContextRazorBlazor Blazor uygulamalar ASP.NET Core işlem hattı bağlamının dışında çalışır. HttpContext içinde kullanılabilir IHttpContextAccessorolması garanti edilmez ve HttpContext uygulamayı başlatan Blazor bağlamı tutması garanti edilmez.

İstek durumunu Blazor uygulamaya geçirmek için önerilen yaklaşım, uygulamanın ilk işlemesi sırasında kök bileşen parametrelerinden geçer. Alternatif olarak uygulama, kök bileşenin uygulama genelinde kullanılmak üzere başlatma yaşam döngüsü olayında verileri kapsamlı bir hizmete kopyalayabilir. Daha fazla bilgi için bkz . ASP.NET Core sunucu tarafı ve Blazor Web App ek güvenlik senaryoları.

Sunucu tarafı Blazor güvenliğinin kritik bir yönü, belirli bir bağlantı hattına bağlı olan kullanıcının, bağlantı hattı oluşturulduktan sonra Blazor bir noktada güncelleştirilebilir ancak IHttpContextAccessorgüncelleştirilmeyebilir. Özel hizmetlerle bu durumu ele alma hakkında daha fazla bilgi için bkz . ASP.NET Core sunucu tarafı ve Blazor Web App ek güvenlik senaryoları.

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 kendi Blazor bağımlılık ekleme kapsayıcı kapsamına sahip bir bağlantı hattı başlatır, bu nedenle kapsamlı hizmetler oturum başına Blazor 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.

Özel olarak tasarlanmış olan uygulamalarda durum bilgisi olan tekil hizmetleri Blazor 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 CoreBlazoryönergeleri izleyerek yeni bir sunucu tarafı 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.

Blazor Identity Kullanıcı Arabirimi (Bireysel Hesaplar)

Blazor, Tek Tek HesaplarBlazorkimlik doğrulama seçeneğini belirlediğinizde tam Identitytabanlı 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 Identity gibi gelişmiş ö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 BlazorIdentity bileşenlerini incelemek için, bunlara proje şablonundaki Pages klasörün ve Shared klasörlerinde AccountBlazor 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 (AuthenticationStateProvider) projelerinde özel .Client 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 bir örnek oluşturmak için WebAssembly'den geri okumak için Kalıcı Bileşen Durumu hizmetiniAuthenticationState. 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 hizmetiniPersistentComponentState.

ana projesindeBlazor Web App, kimlik doğrulama durumu sağlayıcısı (başvuru kaynağı) (Yalnızca sunucu etkileşim çözümleri)PersistingRevalidatingAuthenticationStateProvider .

Blazor Identity, bir fabrikaDbContextörneklere bağlıdır. Bu durum, proje şablonunun DbContext bileşenlerinin etkileşimi desteklemeden statik olarak işlenmesi için yeterli olduğu için kasıtlı Identity 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.

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 hizmetiniAuthenticationStatesunucu tarafı AuthenticationStateProvider tarafından döndürülenleri seri hale getiren öğesini çağırınPersistentComponentState:

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 SerializeAllClaims sunucu tarafı çağrısında olarak trueayarlayınAddAuthenticationStateSerialization:

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

İstemci () projesinin .Client dosyasında çağrısıProgram, öğesini çağırarak ve Kalıcı Bileşen Durumu hizmetiniAuthenticationStateProviderAuthenticationState sunucudan seri durumdan çıkarıldığı yeri AuthenticationStateData ekler.PersistentComponentState 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 bkzBlazor iskeleIdentity.

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 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 bkzIdentity için Web API arka ucu güvenliğini sağlamak için kullanma.

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] ekleyin 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.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 OwningComponentBase bağımlılık eklemeBlazor bakın.

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

Bir AuthorizeViewbileşendekiAuthenticationStateProvideriç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ış prerender parametreyle false 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 Routes (App) kullanıldığı ön Components/App.razor 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 render-mode özniteliğini olarak değiştirinServer:

    <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 RevalidatingServerAuthenticationStateProviderile 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ü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));

İ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.

AuthenticationStateProvider hizmeti

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

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

Genellikle doğrudan AuthenticationStateProvider kullanmazsınız. Bu makalenin ilerleyen bölümlerinde açıklanan AuthorizeView bileşenini veya Task<AuthenticationState> 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 AuthenticationStateProviderbir uygulamak için bkz . ASP.NET Core Blazor kimlik doğrulama durumu, kullanıcı kimlik doğrulaması durumu değişiklik bildirimlerini uygulama yönergelerini içerir.

Kullanıcının talep sorumlusu verilerini alma

Hizmet, AuthenticationStateProvider 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 koşulla çağrılar ClaimsPrincipal.FindAll .
@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ığı 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

Kullanıcı tarafından tetiklenen bir eylemi gerçekleştirirken olduğu gibi yordamsal mantık için kimlik doğrulama durumu verileri gerekiyorsa, aşağıdaki örnekte gösterildiği gibi türündeTask<AuthenticationState basamaklı bir > 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.

ve basamaklı kimlik doğrulama durumu hizmetlerini kullanarak basamaklı parametresini ayarlayınTask<AuthenticationState>.AuthorizeRouteView

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

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

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

builder.Services.AddCascadingAuthenticationState();

ve Task< bileşenlerini kullanarak basamaklı parametreyi AuthenticationStateCascadingAuthenticationState.

Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden uygulama Blazor oluşturduğunuzda, uygulama aşağıdaki örnekte gösterilen ve Blazor bileşenlerini içerirAuthorizeRouteView.CascadingAuthenticationState İstemci tarafı Blazor uygulaması gerekli hizmet kayıtlarını da içerir. Ek bilgiler, Yetkisiz içeriği bileşenle özelleştirme Router bölümünde sunulur.

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

Not

ASP.NET Core 5.0.1 sürümünün yayınlanmasıyla ve diğer 5. x sürümleri için Router bileşeni, PreferExactMatches olarak ayarlanan @true parametresini içerir. Daha fazla bilgi için, bkz. ASP.NET Core 3.1'den 5.0'a 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ı bir rolde.
  • Kullanıcının bir talebi var.
  • İlke 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üvenlik hakkında daha fazla bilgi için ASP.NET Core Güvenliği ve Identity altı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 kullanıcının yordam mantığını kullanmanız gerekmeyen identity 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() { ... }
}

Bileşen, kullanıcının yetkilendirme durumuna göre öğelerin görünürlüğünü denetlese AuthorizeView de, olay işleyicisinin kendisinde güvenliği zorlamaz. 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.

Razor Blazor Web Appbileşenleri, statik sunucu tarafı işleme (statik SSR) sırasında yetkilendirme sunucu tarafında başarısız olduğunda 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 ile AuthorizeView ilişkilendirilmiş yöntemler yalnızca istemci tarafı uygulamalarında işlenen kullanıcı arabirimindeBlazor 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, bir Shared/NavMenu.razor (NavLink) göstermek için bileşeninde (NavLink) kullanılabilir, ancak bu yaklaşımın yalnızca oluşturulan çı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

AuthorizeView bileşeni rol tabanlı ya da ilke tabanlı yetkilendirmeyi destekler.

Rol tabanlı yetkilendirme için parametresini Roles kullanın. Aşağıdaki örnekte, kullanıcının veya Admin rolleri için Superuser 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 hem de AdminSuperuser rol taleplerine sahip olmasını istemek için bileşenleri iç içe yerleştirme AuthorizeView :

<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>

Yukarıdaki kod, bağlam çakışmasını önlemek için iç Context bileşen için bir AuthorizeView oluştururAuthenticationState. Bağlama AuthenticationState erişim için standart yaklaşım ( ile dışta AuthorizeView@context.Usererişilir. Bağlama, adlandırılmış AuthorizeView bağlam (innerContext ) ile içte @innerContext.User erişilir.

Yapılandırma kılavuzu dahil daha fazla bilgi için, bkz. ASP.NET Core 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ı onaylayan bir ilke AuthorizeView oluşturun.

  • İlkeleri birden çok AuthorizeView bileşene iç içe yerleştirme:

    <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.

Belirtilmezse Roles veya Policy 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.

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

Pascal olayı genellikle rol ve ilke adları (örneğin, BillingAdministrator) için kullanılır, ancak Pascal büyük/küçük harf 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, zaman uyumsuz kimlik doğrulaması durumunun belirlenmesine izin verir. 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 içerik AuthorizeView görüntülemez. 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şturulur oluşturulmaz 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

Yalnızca yönlendirici aracılığıyla ulaşılan bileşenlerde [Authorize] kullanın @pageBlazor. Yetkilendirme, sayfada işlenen alt bileşenler için değil yalnızca yönlendirmenin bir yönü olarak gerçekleştirilir. 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 da 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>

Belirtilmezse Roles veya Policy belirtilmezse, [Authorize] 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.

Kullanıcı yetkilendirilmediğinde ve uygulama bileşenle Routeryetkisiz 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.

Router.Found İstenen yolun içeriğinde:

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

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

AuthorizeRouteView, kaynağın rota verilerini aldığında, yetkilendirme ilkelerinin RouteData.PageType ve RouteData.RouteValues erişimi vardır ve bu, yetkilendirme kararları almasına izin verir.

Aşağıdaki örnekte, aşağıdaki mantığa uygulamanın yetkilendirme hizmeti yapılandırması (EditUser) için AuthorizationOptions içinde bir AddAuthorizationCore ilkesi 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 ilkenin karşılanmasına (EMP döndürür) izin verir. 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 ekleme:

    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 bileşenle Router özelleştirme

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]öznitelik bölümünde ele alınmıştır.
  • Zaman uyumsuz yetkilendirme devam ediyor, bu, genellikle kullanıcının kimlik doğrulama işleminin devam ettiği anlamına gelir. <Authorizing> öğesinin biçimlendirmesi görüntülenir.

Önemli

Blazor görüntüleyen <NotAuthorized> yönlendirici özellikleri ve <NotFound> içerik 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ı isteği işlemesi tarafından işlenir ve Razor 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, bileşenin içeriğine RedirectToLogin<NotAuthorized> yerleştirilmiş bir Router bileşen 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ı, sağlayıcıyla kimlik doğrulamasından sonra istenen URL'ye identity 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 user.Identity.IsAuthenticated doğrulanmış (oturum açmış) kullanıcılar için kod 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' ilkesini 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 tarafı Blazor bir uygulamada, ve Microsoft.AspNetCore.Authorization ad alanlarının Microsoft.AspNetCore.Components.Authorization bileşende veya uygulamanın dosyasında mevcut olduğunu _Imports.razor onaylayı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 değeri authenticationStateTask için alınır

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, kullanıcı arabirimi ağacının bir <CascadingAuthenticationState> bölümünü, örneğin yönlendiricinin etrafında sarmala Blazor :

<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şen (.NET 7 veya öncesi) veya (.NET 8 veya üzeri) tarafından AddCascadingAuthenticationState sağlanan hizmetler, basamaklı parametreyiTask<AuthenticationState>sağlar ve bu parametre de temel bağımlılık AuthenticationStateProvider ekleme hizmetinden alı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:

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

Ek kaynaklar