Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
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,
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:
- Güvenli kimlik doğrulama akışları (ASP.NET Core belgeleri)
- Microsoft Azure hizmetleri için yönetilen kimlikler (bu makale)
İ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:
- Azure kaynakları için yönetilen kimlikler nedir? (Microsoft Entra belgeleri)
- Azure hizmetleri belgeleri
Sahtecilik önleme desteği
Şablon Blazor :
- Dosyada AddRazorComponents çağrıldığında,
Program
sahtecilik önleme hizmetlerini otomatik olarak ekler. - Dosyanın istek işleme hattında UseAntiforgery çağrısı yapılarak Sahtecilik Karşıtı Ara Yazılımı eklenir ve Siteler Arası İstek Sahteciliği (CSRF/XSRF) tehditlerini azaltmak için
Program
uç noktasını gerektirir. UseAntiforgery, UseHttpsRedirection'den sonra çağrılır. UseAntiforgery ve UseAuthentication çağrıları varsa, bunlardan sonra UseAuthorization için bir çağrı yapılmalıdır.
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:
- 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 Sayfaları ile tümleştirme için geçerli olan konu hakkındaki birincil ASP.NET Core makalesidirRazor.
- ASP.NET Core Blazor formlarına genel bakış: Makalenin Antiforgery desteği bölümü Blazor formlar için antiforgery desteğiyle ilgilidir.
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:
- Güvenli kimlik doğrulama akışları (ASP.NET Core belgeleri)
- Microsoft Azure hizmetleri için yönetilen kimlikler (Blazor belgeler)
İ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.
- Hiçbiri (varsayılan): Kimlik doğrulaması yok.
- Bireysel Hesaplar: Kullanıcı hesapları, ASP.NET Core Identitykullanılarak uygulama içinde depolanır.
- Microsoft kimlik platformu: Daha fazla bilgi için bkz. ASP.NET Çekirdek Blazor kimlik doğrulaması ve yetkilendirme.
- Windows: Windows Kimlik Doğrulama'sı kullanın.
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 (IdentityRevalidatingAuthenticationStateProvider
baş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
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();
PersistingRevalidatingAuthenticationStateProvider
(başvuru kaynağı): Etkileşimli sunucu tarafı işlemeyi (etkileşimli SSR) ve istemci tarafı işlemeyi (CSR) benimseyenler için Blazor Web App. Bu, etkileşimli bir devrenin bağlı olduğu her 30 dakikada bir bağlı kullanıcının güvenlik damgasını yeniden belirten bir sunucu tarafıdır AuthenticationStateProvider . Ayrıca, istemciye kimlik doğrulama durumunu akışla göndermek için Kalıcı Bileşen Durumu hizmetini kullanır ve bu hizmet CSR'nin ömrü boyunca sabittir.PersistingServerAuthenticationStateProvider
(başvuru kaynağı): Yalnızca CSR kullananlar için Blazor Web App. Bu, kimlik doğrulama durumunu istemciye aktarmak için AuthenticationStateProvider kullanan ve bu durumun CSR'nin ömrü boyunca sabit olduğu sunucu taraflı bir .PersistentAuthenticationStateProvider
(başvuru kaynağı): CSR kullananlar için Blazor Web App. Bu, sunucuda işlendiğinde sayfada kalıcı olan verileri arayarak kullanıcının kimlik doğrulama durumunu belirleyen bir istemci tarafıdır AuthenticationStateProvider . Bu kimlik doğrulama durumu CSR'nin ömrü boyunca sabittir. Kullanıcının oturum açması veya kapatması gerekiyorsa, tam sayfa yeniden yükleme gerekir. Bu yalnızca görüntüleme amacıyla bir kullanıcı adı ve e-posta sağlar. Sunucuya yönelik yapılan sonraki isteklerde kimlik doğrulama belirteçleri içermez; bu, sunucuya yapılan isteklerde dahil edilen cookie kullanılarak ayrı bir şekilde ele alını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).
İskele Identity
Sunucu tarafı
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.ConfigureServices
içindeStartup.cs
:
services.AddScoped<ExampleService>();
Aşağıdaki InjectAuthStateProvider
bileşeninde:
- Bileşen devralır OwningComponentBase.
-
AuthenticationStateProvider enjekte edilir ve
ExampleService.ExampleMethod
'ye iletilir. -
ExampleService
, OwningComponentBase.ScopedServices ve GetRequiredService ile çözümlenir; bu da kullanıcının devresinin ömrü boyunca var olan doğruExampleService
örneğini döndürür.
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
Ö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:
Özel IHostEnvironmentAuthenticationStateProvider için prerendering'i desteklemek amacıyla uygulayın: AuthenticationStateProvider framework'ünün IHostEnvironmentAuthenticationStateProvider uygulama örneğini Blazor referans kaynağında ServerAuthenticationStateProvider görebilirsiniz.
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).
Ö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
parametresifalse
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ındanApp
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ı.
- 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:
ServerAuthenticationStateProvider (başvuru kaynağı): AuthenticationStateProvider çerçevesi, kimlik doğrulama durumunu sunucudan almak için Blazor kullanır.
RevalidatingServerAuthenticationStateProvider (başvuru kaynağı): Konak ortamından bir kimlik doğrulama durumu almak ve düzenli aralıklarla yeniden doğrulamak için AuthenticationStateProvider çerçevesi tarafından kullanılan Blazor hizmetler için bir temel sınıf.
Varsayılan 30 dakikalık yeniden doğrulama aralığı (başvuru kaynağı) içinde
RevalidatingIdentityAuthenticationStateProvider
ayarlanabilir. Aşağıdaki örnek aralığı 20 dakikaya kısaltır:protected override TimeSpan RevalidationInterval => TimeSpan.FromMinutes(20);
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:
Microsoft.AspNetCore.Components.Authorization
NuGet paketi için bir paket başvurusu.Not
.NET uygulamalarına paket ekleme yönergeleri için Paket tüketimi iş akışı (NuGet belgeleri) sayfasındaki Paketleri yükleme ve yönetme altındaki makalelere bakın. NuGet.org'de doğru paket sürümlerini onaylayın.
Microsoft.AspNetCore.Components.Authorization ad alanını uygulamanın
_Imports.razor
dosyasına.
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-samples
nası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.
-
Bir öznitelikle yetkilendirme uygular
[Authorize]
. - Bileşen sunucuda statikten etkileşimli SSR'ye geçtiğinde hava durumu tahmin verilerini kalıcı hale getirmek için Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanır. Daha fazla bilgi için bkz. Prerender ASP.NET Core Razor bileşenleri.
@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
hizmetinGetWeatherForecastAsync
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ç noktaServerWeatherForecaster
çağırmak içinGetWeatherForecastAsync
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
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
Ö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ğerivalue
içinde depolanır. -
id
adlı bir değişkendevalue
bir dize olarak depolanır veya boş bir dize değeri (string.Empty
) ayarlanır. -
id
boş bir dize değilse, dizenin değeritrue
ile başlıyorsa politikanın karşılandığını beyan edin (veEMP
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ırauthenticationStateTask
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
- Sunucu tarafı ve Blazor Web App kaynaklar
- Hızlı Başlangıç: ASP.NET Core web uygulamasına Microsoft ile oturum açma ekleme
- Hızlı Başlangıç: Microsoft kimlik platformu ile ASP.NET Core web API'sini koruma
-
ASP.NET Core'ı ara sunucularla ve yük dengeleyicilerle çalışacak şekilde yapılandırma: Aşağıdakilere ilişkin yönergeler içerir:
- Ara sunucular ve iç ağlar arasında HTTPS şeması bilgilerini korumak için İletilen Üst Bilgiler Ara Yazılımını kullanma.
- El ile düzen yapılandırması, doğru istek yönlendirme için istek yolu değişiklikleri ve Linux ve IIS dışı ters ara sunucular için istek şemasını iletme gibi ek senaryolar ve kullanım örnekleri.
- Microsoft kimlik platformu belgeleri
- ASP.NET Core güvenlik konuları
- ASP.NET Core'da Windows Kimlik Doğrulamayı Yapılandırma
- ASP.NET Core Blazor uygulamalarında IHttpContextAccessor/HttpContext
- Authentication.MSAL JavaScript kitaplığının özel bir sürümünü oluşturma
- Harika Blazor: Kimlik doğrulama topluluğu örnek bağlantıları
- ASP.NET Çekirdek Blazor Hybrid kimlik doğrulaması ve yetkilendirme
- Sunucu tarafı Blazor kaynakları
- Hızlı Başlangıç: ASP.NET Core web uygulamasına Microsoft ile oturum açma ekleme
- Hızlı Başlangıç: Microsoft kimlik platformu ile ASP.NET Core web API'sini koruma
-
ASP.NET Core'ı ara sunucularla ve yük dengeleyicilerle çalışacak şekilde yapılandırma: Aşağıdakilere ilişkin yönergeler içerir:
- Ara sunucular ve iç ağlar arasında HTTPS şeması bilgilerini korumak için İletilen Üst Bilgiler Ara Yazılımını kullanma.
- El ile düzen yapılandırması, doğru istek yönlendirme için istek yolu değişiklikleri ve Linux ve IIS dışı ters ara sunucular için istek şemasını iletme gibi ek senaryolar ve kullanım örnekleri.
- Microsoft kimlik platformu belgeleri
- ASP.NET Core güvenlik konuları
- ASP.NET Core Blazor uygulamalarında IHttpContextAccessor/HttpContext
- ASP.NET Core'da Windows Kimlik Doğrulamayı Yapılandırma
- Authentication.MSAL JavaScript kitaplığının özel bir sürümünü oluşturma
- Harika Blazor: Kimlik doğrulama topluluğu örnek bağlantıları
ASP.NET Core