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

Not

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

Önemli

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

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

Bu makalede, 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 Uygulaması oluşturun.

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ğinin Razor geri kalanıyla birlikte bileşeni dolaylı olarak etkiler.

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ğinin Razor geri kalanıyla birlikte bileşeni 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. 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.

Antiforgery desteği

Şablon Blazor :

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

Hizmet, AntiforgeryStateProvider geçerli oturumla ilişkili bir kötü amaçlı yazılımdan koruma belirtecine erişim sağlar. Hizmeti ekleyin ve geçerli 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-dataolarak application/x-www-form-urlencodedkodlanmış 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, Web Apps'in sunucu projesi ve Blazor MVC/Razor Sayfaları ile tümleştirme için geçerli olan konu hakkındaki birincil ASP.NET Core makalesidirBlazor.
  • 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 kimliğini oluşturmak için mevcut ASP.NET Core kimlik doğrulaması 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 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.

IHttpContextAccessor/HttpContextbileşenlerde Razor

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

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

HttpContext, üst bilgileri veya bileşendeki Components/App.razordiğer özellikleri () inceleme ve değiştirme gibi genel görevler için yalnızca statik olarak işlenmiş kök bileşenlerdeApp 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./HttpContextRazorBlazor Blazor uygulamalar ASP.NET Core işlem hattı bağlamının dışında çalışır. HttpContext içinde kullanılabilir IHttpContextAccessorolması garanti edilmez ve HttpContext uygulamayı başlatan Blazor bağlamı tutması garanti edilmez.

İstek durumunu Blazor uygulamaya geçirmek için önerilen yaklaşım, uygulamanın ilk işlemesi sırasında kök bileşen parametrelerinden geçer. Alternatif olarak uygulama, kök bileşenin uygulama genelinde kullanılmak üzere başlatma yaşam döngüsü olayında verileri kapsamlı bir hizmete kopyalayabilir. Daha fazla bilgi için bkz . 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:

Kimlik doğrulamasını işlemek için, yerleşik veya özel AuthenticationStateProvider hizmetin kullanımı aşağıdaki bölümlerde ele alınmıştır.

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.

Not

Özel AuthenticationStateProvideruygulamak için bkz. ASP.NET Core sunucu tarafı uygulamalarının güvenliğini Blazor sağlama.

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

ClaimsPrincipalData.razor:

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

<h1>ClaimsPrincipal Data</h1>

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

<p>@authMessage</p>

@if (claims.Count() > 0)
{
    <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-principle-data"
@using System.Security.Claims
@inject AuthenticationStateProvider AuthenticationStateProvider

<h1>ClaimsPrincipal Data</h1>

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

<p>@authMessage</p>

@if (claims.Count() > 0)
{
    <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. Sunucu tarafı Blazor uygulamalarda özel AuthenticationStateProvider uygulama hakkında bilgi için bkz. Güvenli ASP.NET Core sunucu tarafı Blazor uygulamaları.

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.IsAuthenticatedtrue 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, Yönlendirici bileşeniyle yetkisiz içeriği özelleştirme 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ınTask<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, Yönlendirici bileşeniyle yetkisiz içeriği özelleştirme 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 seçenekler ve yetkilendirme Program 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 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 AuthenticationState (@contextsö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.

Razor Web Apps bileşenleri Blazor , 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 AdminSuperuser rol taleplerine sahip olmasını istemek için bileşenleri iç içe yerleştirme AuthorizeView :

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

Yukarıdaki kod, bağlam çakışmasını önlemek için iç AuthorizeView bileşen için bir AuthenticationState oluştururContext. Bağlama AuthenticationState erişim için standart yaklaşım ( ile dışta AuthorizeView@context.Usereriş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ı varsayılan olarak 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, AuthorizeView varsayılan olarak içerik 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 Yönlendirici bileşeniyle yetkisiz içeriği özelleştirmediyse ç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ğeri value içinde depolanır.
  • id adlı bir değişkende value bir dize olarak depolanır veya boş bir dize değeri (string.Empty) ayarlanır.
  • id boş bir dize değilse, dizenin değeri EMP 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; }
}

Yönlendirici bileşeniyle yetkisiz içeriği ö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ı, 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 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 uygulaması, proje şablonundan oluşturulduğunda varsayılan olarak 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ğeri authenticationStateTask için alınır

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

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

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

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

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

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

builder.Services.AddCascadingAuthenticationState();

CascadingAuthenticationState Bileşen (.NET 7 veya öncesi) veya (.NET 8 veya üzeri) tarafından AddCascadingAuthenticationState sağlanan hizmetler, basamaklı 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 kimlik

Ek kaynaklar