ASP.NET Core Blazor kimlik doğrulaması ve yetkilendirme
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.
Bu makalede, Blazor uygulamalardaki güvenlik yapılandırması ve yönetimi için ASP.NET Core desteği açıklanmaktadı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.
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 rest birlikte bileşeni dolaylı olarak etkilerRazor.
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 rest birlikte bileşeni dolaylı olarak etkilerRazor.
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 Identity ile ilgili kullanıcı arabirimi Razor bileşenleri yerine Razor Pages kullanmalıdır. Görevleri doğrudan işleyen Identity bileşenler oluşturmak Razor ç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 bkz. ASP.NET Core'u Identity sunucu tarafı Blazor uygulamasına iskeleleştirme.Blazor
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:
- 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
Antiforgery desteği
Şablon Blazor :
- Dosyada
Program
çağrıldığındaAddRazorComponents, kötü amaçlı yazılımdan koruma hizmetlerini otomatik olarak ekler. - Dosyadaki istek işleme işlem hattını
Program
çağırarak UseAntiforgery Kötü Amaçlı Yazılımdan Koruma Ara Yazılımı ekler ve Siteler Arası İstek Sahteciliği (CSRF/XSRF) tehditlerini azaltmak için uç nokta sahteciliği önleme koruması gerektirir. UseAntiforgery , 'den sonra UseHttpsRedirectionçağrılır. varsa ve UseAuthorizationçağrılarının ardından için bir çağrı UseAntiforgery UseAuthentication 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 kötü amaçlı yazılımdan koruma belirtecine erişim sağlar. Hizmeti ekleyin ve geçerli AntiforgeryRequestTokenalmak için yöntemini çağırınGetAntiforgeryToken(). 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 , multipart/form-data
olarak application/x-www-form-urlencoded
kodlanmış 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 MVC/Razor Pages ile tümleştirme için geçerli olan konuyla ilgili birincil ASP.NET Core makalesidirBlazor Web App.
- ASP.NET Core Blazor formlarına genel bakış: Makalenin Blazor Antiforgery desteği bölümü, antiforgery desteği oluşturur.
Kimlik Doğrulaması
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.
Sunucu tarafı Blazor kimlik doğrulaması
Etkileşimli olarak işlenen sunucu tarafı Blazor , istemciyle bir SignalR bağlantı üzerinden çalışır. SignalRTabanlı uygulamalarda kimlik doğrulaması, bağlantı kurulduğunda işlenir. 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.
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 . Güvenli ASP.NET Core sunucu tarafı Blazor uygulamaları.
IHttpContextAccessor
/HttpContext
bileş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 Components/App.razor
diğer özellikleri () inceleme ve değiştirme gibi genel görevler için yalnızca statik olarak işlenmiş kök bileşenlerde App
basamaklı parametre olarak kullanı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 . Sunucu tarafı ASP.NET Core Blazor ek güvenlik senaryoları.
Sunucu tarafı uygulamaların bileşenlerinde doğrudan veya dolaylı olarak kullanmayınIHttpContextAccessor./HttpContext Razor Blazor 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 . Sunucu tarafı ASP.NET Core Blazor 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 . Sunucu tarafı ASP.NET Çekirdek Blazor 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.
İ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:
NuGet paketi için
Microsoft.AspNetCore.Components.Authorization
bir paket başvurusu.Not
.NET uygulamalarına paket ekleme hakkında yönergeler için, Paket tüketimi iş akışında (NuGet belgeleri) paketleri yüklemek ve yönetmek altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.
Microsoft.AspNetCore.Components.Authorization ad alanı uygulamasının
_Imports.razor
dosyası.
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 CascadingAuthenticationState bileşen tarafından AuthorizeView 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ündeAuthenticationStateTask<
>
basamaklı bir parametre 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ın>
AuthenticationStateTask<
.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ı AddCascadingAuthenticationState içerirAuthorizeRouteView. İ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 CascadingAuthenticationState bileşenlerini kullanarak basamaklı parametreyi AuthorizeRouteView ayarlayın Task<
AuthenticationState>
.
Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden uygulama Blazor oluşturduğunuzda, uygulama aşağıdaki örnekte gösterilen ve CascadingAuthenticationState bileşenlerini içerirAuthorizeRouteView.Blazor İ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, @true
olarak ayarlanan PreferExactMatches
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 AuthenticationState (@context
söz dizimindeRazor) bir context
değişken sunar:
<AuthorizeView>
<p>Hello, @context.User.Identity?.Name!</p>
</AuthorizeView>
Ayrıca, kullanıcı ve NotAuthorized parametrelerinin Authorized 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="SecureMethod">Authorized Only Button</button></p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
private void SecureMethod() { ... }
}
Önceki örnekteki <button>
öğesi ile ilgili SecureMethod
yöntemi gibi yetkili bir öğe için varsayılan olay işleyicisi yalnızca yetkili bir kullanıcı tarafından çağrılabilir.
RazorBlazor 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ı Blazor 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 NotAuthorized içeriğiAuthorized, 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 NavLink
bileşeni (NavLink) göstermek için NavMenu
bileşeninde (Shared/NavMenu.razor
) 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 Superuser
rolleri için Admin
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 Admin
Superuser
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ç AuthorizeView bileşen için bir AuthenticationState oluştururContext
. Bağlama AuthenticationState erişim için standart yaklaşım ( ile dışta AuthorizeView@context.User
erişilir. Bağlama, adlandırılmış innerContext
bağlam (@innerContext.User
) ile içte AuthorizeView 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 ilkeyle 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 Blazor kullanın [Authorize]
@page
. 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 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 AuthorizeRouteView öğesinin Resource 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ı (AddAuthorizationCore) için AuthorizationOptions içinde bir EditUser
ilkesi 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ğeriEMP
ile başlıyorsa ilkenin karşılanmasına (true
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, id
için rota değerinin EMP
ile çalışmaya başlayıp başlamadığını öğrenmek için önceki EditUser
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
AuthorizeRouteView bileşeniyle birlikte Router 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 NotAuthorized içeriğiAuthorized, 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>
, Authorizedve NotAuthorized içeriğiNotFound, 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 <NotAuthorized>
Router yerleştirilmiş bir RedirectToLogin
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 ClaimsPrincipal değerini elde etmek için Task<
AuthenticationState>
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.Components.Authorization ad alanlarının Microsoft.AspNetCore.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ğeriauthenticationStateTask
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ı parametreyi>
Task<
AuthenticationStatesağ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
- Microsoft identity platformu belgeleri
- ASP.NET Core güvenlik konuları
- ASP.NET Core'de Windows Kimlik Doğrulamasını Yapılandırma
- Authentication.MSAL JavaScript kitaplığının özel bir sürümünü oluşturma
- Harika Blazor: Kimlik doğrulaması topluluk örnek bağlantıları
- ASP.NET Core Blazor Hybrid kimlik doğrulaması ve yetkilendirme
- Microsoft identity platformu belgeleri
- ASP.NET Core güvenlik konuları
- ASP.NET Core'de Windows Kimlik Doğrulamasını Yapılandırma
- Authentication.MSAL JavaScript kitaplığının özel bir sürümünü oluşturma
- Harika Blazor: Kimlik doğrulaması topluluk örnek bağlantıları
ASP.NET Core