Aracılığıyla paylaş


Güvenli ASP.NET Core sunucu tarafı Blazor uygulamaları

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.

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.

Ö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, ASP.NET Core uygulamaları olarak sunucu tarafı Blazor uygulamalarının güvenliğini sağlama açıklanmaktadır.

Sunucu tarafı Blazor uygulamalar, ASP.NET Core uygulamalarıyla aynı şekilde güvenlik için yapılandırılır. Daha fazla bilgi için, ASP.NET Core güvenlik konuları altındaki makalelere bakın.

Kimlik doğrulama bağlamı yalnızca uygulama başlatıldığında oluşturulur; bu, uygulamanın WebSocket'e ilk bağlandığı zamandır. Kimlik doğrulama bağlamı, bağlantı hattının ömrü boyunca korunur. Uygulamalar, şu anda varsayılan olarak 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 . Sunucu tarafı ASP.NET Çekirdek Blazor ek güvenlik senaryoları.

Blazor her sayfa gezintisinde s ile cookieyeni HTTP isteklerinde bulunan geleneksel sunucu tarafından işlenmiş web uygulamalarından farklıdır. Gezinti olayları sırasında kimlik doğrulaması denetlendi. Ancak, cookiebu işe dahil değildir. Cookies yalnızca bir sunucuya HTTP isteği gönderirken gönderilir. Bu, kullanıcı uygulamada Blazor gezindiğinde böyle olmaz. Gezinti sırasında kullanıcının kimlik doğrulama durumu bağlantı hattı içinde Blazor denetlenerek özetini kullanarak RevalidatingAuthenticationStateProvider sunucuda istediğiniz zaman güncelleştirebilirsiniz.

Önemli

Gezinti sırasında kimlik doğrulamasını gerçekleştirmek için özel NavigationManager uygulama önerilmez. Uygulamanın gezinti sırasında özel kimlik doğrulama durumu mantığı yürütmesi gerekiyorsa, özel AuthenticationStateProviderbir kullanın.

Not

Bu makaledeki kod örnekleri, .NET 6 veya sonraki sürümlerindeki ASP.NET Core'da desteklenen null atanabilir başvuru türlerini (NTS) ve .NET derleyici null durum statik analizini benimser. ASP.NET Core 5.0 veya önceki sürümleri hedeflerken, bu makaledeki örneklerden null tür atamasını (?) kaldırın.

Proje şablonu

ASP.NET CoreBlazor için Araç oluşturma başlığındaki yönergeleri izleyerek yeni bir sunucu tarafı Blazor uygulaması oluşturun.

Sunucu tarafı uygulama şablonunu seçtikten ve projeyi yapılandırdıktan sonra Kimlik doğrulama türü altında uygulamanın kimlik doğrulamasını seçin:

  • Hiçbiri (varsayılan): Kimlik doğrulaması yok.
  • Bireysel Hesaplar: Kullanıcı hesapları, ASP.NET Core Identitykullanılarak uygulama içinde depolanır.

BlazorIdentity Kullanıcı Arabirimi (Bireysel Hesaplar)

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

Blazor Web Uygulaması şablonu, SQL Server veritabanı kodunun iskelesini oluştururIdentity. Komut satırı sürümü varsayılan olarak SQLite kullanır ve için Identitybir SQLite veritabanı içerir.

Şablon aşağıdakileri işler:

  • Kullanıcıları oturum açma ve kapatma gibi rutin kimlik doğrulama görevleri için bileşenler ve ilgili mantık ekler IdentityRazor .
  • Identityİlgili paketleri ve bağımlılıkları ekler.
  • içindeki paketlere Identity başvurur _Imports.razor.
  • Özel bir kullanıcı Identity sınıfı (ApplicationUser) oluşturur.
  • Bir EF Core veritabanı bağlamı (ApplicationDbContext) oluşturur ve kaydeder.
  • Yerleşik Identity uç noktalar için yönlendirmeyi yapılandırılır.
  • Doğrulamayı ve iş mantığını içerir Identity .

Çerçevenin BlazorIdentity bileşenlerini incelemek için, web uygulaması proje şablonundaki Pages (başvuru kaynağı) klasörün ve Shared klasörlerinde AccountBlazor bu bileşenlere erişin.

Etkileşimli WebAssembly veya Etkileşimli Otomatik işleme modlarını seçtiğinizde, sunucu tüm kimlik doğrulama ve yetkilendirme isteklerini işler ve Identity bileşenler Web Uygulamasının ana projesindeki Blazor sunucuda statik olarak işlenir.

Çerçeve, kullanıcının kimlik doğrulama durumunu tarayıcıya akışı için hem sunucu hem de istemci (.Client) projelerinde özel AuthenticationStateProvider bir özellik sağlar. sunucu projesi öğesini çağırırken AddAuthenticationStateSerializationistemci projesi de öğesini çağırır AddAuthenticationStateDeserialization. İstemci yerine sunucuda kimlik doğrulaması, uygulamanın ön kayıt sırasında ve çalışma zamanı başlatılmadan önce kimlik doğrulama durumuna erişmesine Blazor WebAssembly olanak tanır. Özel AuthenticationStateProvider uygulamalar, kimlik doğrulama durumunu HTML açıklamalarına seri hale getirmek ve ardından yeni AuthenticationState bir örnek oluşturmak için WebAssembly'den geri okumak için Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanır. Daha fazla bilgi için Web Apps'te Blazor kimlik doğrulama durumunu yönetme bölümüne bakın.

Yalnızca Etkileşimli Sunucu çözümleri için ( IdentityRevalidatingAuthenticationStateProvider başvuru kaynağı), etkileşimli bir bağlantı hattının bağlı olduğu her 30 dakikada bir bağlı kullanıcı için güvenlik damgasını yeniden belirten bir sunucu tarafıdır AuthenticationStateProvider .

Etkileşimli WebAssembly veya Etkileşimli Otomatik işleme modlarını seçtiğinizde, sunucu tüm kimlik doğrulama ve yetkilendirme isteklerini işler ve Identity bileşenler Web Uygulamasının ana projesindeki Blazor sunucuda statik olarak işlenir. Proje şablonu, sunucu ve tarayıcı arasında kullanıcının kimlik doğrulama durumunu eşitlemek için projeye bir PersistentAuthenticationStateProvider sınıf (başvuru kaynağı).Client içerir. sınıfı özel bir uygulamasıdır AuthenticationStateProvider. Sağlayıcı, kimlik doğrulama durumunu önceden yüklemek ve sayfada kalıcı hale getirmek için Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanır.

Web Uygulamasının Blazor ana projesinde, kimlik doğrulama durumu sağlayıcısı (başvuru kaynağı) (Yalnızca sunucu etkileşim çözümleri) veyaPersistingRevalidatingAuthenticationStateProvider(başvuru kaynağı) (WebAssembly veya Otomatik etkileşim çözümleri) olarak adlandırılır IdentityRevalidatingAuthenticationStateProvider .

BlazorIdentity, bir fabrika tarafından oluşturulmayan örneklere bağlıdırDbContext. Bu durum, proje şablonunun Identity bileşenlerinin etkileşimi desteklemeden statik olarak işlenmesi için yeterli olduğu için kasıtlı DbContext olarak gerçekleştirilir.

Genel etkileşimli işleme modlarının bileşenler dışındakiIdentity bileşenlere nasıl uygulandığına ve aynı zamanda bileşenler için statik SSR'ye nasıl uygulandığına Identity ilişkin bir açıklama için bkz . ASP.NET Çekirdek Blazor işleme modları.

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

Kullanıcı arabirimi hakkında BlazorIdentity daha fazla bilgi ve dış oturum açma bilgilerini sosyal web siteleri aracılığıyla tümleştirme yönergeleri için bkz . .NET 8'de kimlikle ilgili yenilikler.

Not

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

Web Apps'te Blazor kimlik doğrulama durumunu yönetme

Bu bölüm, şunları benimseyen Web Uygulamaları için Blazor geç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. Kimlik doğrulama durumu sağlayıcılarıyla bunu gerçekleştirmeye yönelik örnekler Web Uygulaması proje şablonu tarafından Blazor gösterilmiştir ve aşağıda açıklanmıştır.

Sunucu projesinin Program dosyasında, Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanarak sunucu tarafı AuthenticationStateProvider tarafından döndürülenleri seri hale AuthenticationState getiren öğesini çağırınAddAuthenticationStateSerialization:

builder.Services.AddRazorComponents()
    .AddInteractiveWebAssemblyComponents()
    .AddAuthenticationStateSerialization();

Varsayılan olarak, API yalnızca tarayıcıdaki erişim için sunucu tarafı adını ve rol taleplerini serileştirir. Tüm talepleri dahil etmek için true sunucu tarafı çağrısında olarak AddAuthenticationStateSerializationayarlayınSerializeAllClaims:

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

İstemci () projesinin Program dosyasında çağrısıAddAuthenticationStateDeserialization, öğesini çağırarak ve Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanarak AuthenticationStateData sunucudan seri durumdan çıkarıldığı yeri AuthenticationStateAuthenticationStateProvider ekler..Client Sunucu projesinde öğesine karşılık gelen bir çağrı AddAuthenticationStateSerialization olmalıdır.

builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();

Not

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

İskele Identity

Sunucu tarafı bir uygulamada iskele oluşturma Identity hakkında daha fazla bilgi için bkz. ASP.NET Core projelerinde iskeleIdentity.Blazor

Sunucu tarafı Blazor uygulamasına iskele Identity oluşturun:

Dış sağlayıcılardan gelen ek talepler ve belirteçler

Dış sağlayıcılardan gelen ek talepleri depolamak için, bkz. ASP.NET Core dış sağlayıcılardan gelen ek talepleri ve belirteçleri kalıcı hale getirme.

Identity Server ile Linux üzerinde Azure App Service

Identity Server ile Linux üzerinde Azure App Service dağıtılırken sertifikayı vereni açıkça belirtin. Daha fazla bilgi için bkz. SPA'lar için Web API arka ucu güvenliğini sağlamak için kullanmaIdentity.

Özel AuthenticationStateProvider uygulama

Uygulama özel bir sağlayıcı gerektiriyorsa uygulayın AuthenticationStateProvider ve geçersiz kılın GetAuthenticationStateAsync.

Aşağıdaki örnekte, tüm kullanıcıların kimliği kullanıcı adıyla mrfibulidoğrulanır.

CustomAuthStateProvider.cs:

using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;

public class CustomAuthStateProvider : AuthenticationStateProvider
{
    public override Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        var identity = new ClaimsIdentity(new[]
        {
            new Claim(ClaimTypes.Name, "mrfibuli"),
        }, "Custom Authentication");

        var user = new ClaimsPrincipal(identity);

        return Task.FromResult(new AuthenticationState(user));
    }
}

Hizmet CustomAuthStateProvider dosyaya Program kaydedilir:

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

CustomAuthStateProvider Hizmet, çağrısından ProgramAddServerSideBlazorsonra dosyasına kaydedilir:

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddServerSideBlazor();

...

builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

CustomAuthStateProvider hizmeti çağrısından AddServerSideBlazorStartup.cssonra içinde Startup.ConfigureServices kaydedilir:

using Microsoft.AspNetCore.Components.Authorization;

...

services.AddServerSideBlazor();

...

services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

Bileşeni onaylayın veya bileşene Router ekleyinAuthorizeRouteView.

Routes bileşeninde (Components/Routes.razor):

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

Dosyadaki Program hizmet koleksiyonuna basamaklı kimlik doğrulama durumu hizmetleri ekleyin:

builder.Services.AddCascadingAuthenticationState();

Not

Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden Blazor uygulama Blazor oluşturduğunuzda, uygulama ve AuthorizeRouteView çağrısı AddCascadingAuthenticationStateiçerir. Daha fazla bilgi için, makalenin Yönlendirici bileşeniyle yetkisiz içeriği özelleştirme bölümünde sunulan ek bilgilerle ASP.NET Çekirdek Blazor kimlik doğrulaması ve yetkilendirme bölümüne bakın.

Bileşene Router bir AuthorizeRouteView ve CascadingAuthenticationState öğesini onaylayın veya ekleyin:

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

Not

Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden uygulama Blazor oluşturduğunuzda, uygulama önceki örnekte gösterilen ve CascadingAuthenticationState bileşenlerini içerirAuthorizeRouteView.Blazor Daha fazla bilgi için, makalenin Yönlendirici bileşeniyle yetkisiz içeriği özelleştirme bölümünde sunulan ek bilgilerle ASP.NET Çekirdek Blazor kimlik doğrulaması ve yetkilendirme bölümüne bakın.

, AuthorizeView kimliği doğrulanmış kullanıcının adını herhangi bir bileşende gösterir:

<AuthorizeView>
    <Authorized>
        <p>Hello, @context.User.Identity?.Name!</p>
    </Authorized>
    <NotAuthorized>
        <p>You're not authorized.</p>
    </NotAuthorized>
</AuthorizeView>

kullanımıyla AuthorizeViewilgili yönergeler için bkz . ASP.NET Çekirdek Blazor kimlik doğrulaması ve yetkilendirme.

Kimlik doğrulaması durumu değişiklikleri hakkında bildirim

Bir özel AuthenticationStateProvider , tüketicilere kimlik doğrulama durumu değişikliğinin rerender olarak bildirilmesi için temel sınıfta çağrılabilir NotifyAuthenticationStateChangedAuthenticationStateProvider .

Aşağıdaki örnek, Özel AuthenticationStateProvider uygulama bölümündeki yönergeleri izleyerek özel AuthenticationStateProvider uygulama işlemini temel alır.

Aşağıdaki CustomAuthStateProvider uygulama, AuthenticateUserbir kullanıcıda oturum açmak ve tüketicilere kimlik doğrulama durumu değişikliğini bildirmek için özel bir yöntemi kullanıma sunar.

CustomAuthStateProvider.cs:

using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;

public class CustomAuthStateProvider : AuthenticationStateProvider
{
    public override Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        var identity = new ClaimsIdentity();
        var user = new ClaimsPrincipal(identity);

        return Task.FromResult(new AuthenticationState(user));
    }

    public void AuthenticateUser(string userIdentifier)
    {
        var identity = new ClaimsIdentity(new[]
        {
            new Claim(ClaimTypes.Name, userIdentifier),
        }, "Custom Authentication");

        var user = new ClaimsPrincipal(identity);

        NotifyAuthenticationStateChanged(
            Task.FromResult(new AuthenticationState(user)));
    }
}

Bir bileşende:

  • öğesini ekleme AuthenticationStateProvider.
  • Kullanıcının tanımlayıcısını tutmak için bir alan ekleyin.
  • öğesinin yayınını AuthenticationStateProvider yapmak ve kullanıcının tanımlayıcısıyla çağırmak AuthenticateUser için CustomAuthStateProvider bir düğme ve yöntem ekleyin.
@inject AuthenticationStateProvider AuthenticationStateProvider

<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>

<AuthorizeView>
    <Authorized>
        <p>Hello, @context.User.Identity?.Name!</p>
    </Authorized>
    <NotAuthorized>
        <p>You're not authorized.</p>
    </NotAuthorized>
</AuthorizeView>

@code {
    public string userIdentifier = string.Empty;

    private void SignIn()
    {
        ((CustomAuthStateProvider)AuthenticationStateProvider)
            .AuthenticateUser(userIdentifier);
    }
}
@inject AuthenticationStateProvider AuthenticationStateProvider

<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>

<AuthorizeView>
    <Authorized>
        <p>Hello, @context.User.Identity?.Name!</p>
    </Authorized>
    <NotAuthorized>
        <p>You're not authorized.</p>
    </NotAuthorized>
</AuthorizeView>

@code {
    public string userIdentifier = string.Empty;

    private void SignIn()
    {
        ((CustomAuthStateProvider)AuthenticationStateProvider)
            .AuthenticateUser(userIdentifier);
    }
}

Önceki yaklaşım, özel bir hizmet aracılığıyla kimlik doğrulama durumu değişiklikleri bildirimlerini tetikleme amacıyla geliştirilebilir. Aşağıdaki AuthenticationService , geçerli kullanıcının talep sorumlusunu, abone olabileceği bir olayla (currentUser) bir yedekleme alanında (UserChanged) AuthenticationStateProvider tutar ve olay tarafından çağrılır NotifyAuthenticationStateChanged. Bu bölümün devamında ek yapılandırmayla, AuthenticationService öğesini olayı tetiklemesi UserChanged için ayarlayan CurrentUser mantığı olan bir bileşene eklenebilir.

using System.Security.Claims;

public class AuthenticationService
{
    public event Action<ClaimsPrincipal>? UserChanged;
    private ClaimsPrincipal? currentUser;

    public ClaimsPrincipal CurrentUser
    {
        get { return currentUser ?? new(); }
        set
        {
            currentUser = value;

            if (UserChanged is not null)
            {
                UserChanged(currentUser);
            }
        }
    }
}

Program dosyasında, bağımlılık ekleme kapsayıcısında öğesini AuthenticationService kaydedin:

builder.Services.AddScoped<AuthenticationService>();

Startup.csiçinde Startup.ConfigureServices öğesini bağımlılık ekleme kapsayıcısında kaydedinAuthenticationService:

services.AddScoped<AuthenticationService>();

Aşağıdakiler CustomAuthStateProvider olaya abonedir AuthenticationService.UserChanged . GetAuthenticationStateAsync kullanıcının kimlik doğrulama durumunu döndürür. Başlangıçta, kimlik doğrulama durumu değerini AuthenticationService.CurrentUsertemel alır. Kullanıcıda bir değişiklik olduğunda, çağrısı için GetAuthenticationStateAsyncyeni kullanıcıyla (new AuthenticationState(newUser)) yeni bir kimlik doğrulama durumu oluşturulur:

using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;

public class CustomAuthStateProvider : AuthenticationStateProvider
{
    private AuthenticationState authenticationState;

    public CustomAuthStateProvider(AuthenticationService service)
    {
        authenticationState = new AuthenticationState(service.CurrentUser);

        service.UserChanged += (newUser) =>
        {
            authenticationState = new AuthenticationState(newUser);

            NotifyAuthenticationStateChanged(
                Task.FromResult(new AuthenticationState(newUser)));
        };
    }

    public override Task<AuthenticationState> GetAuthenticationStateAsync() =>
        Task.FromResult(authenticationState);
}

Aşağıdaki bileşenin SignIn yöntemi, kullanıcının tanımlayıcısının üzerinde AuthenticationService.CurrentUserayarlanacağı bir talep sorumlusu oluşturur:

@inject AuthenticationService AuthenticationService

<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>

<AuthorizeView>
    <Authorized>
        <p>Hello, @context.User.Identity?.Name!</p>
    </Authorized>
    <NotAuthorized>
        <p>You're not authorized.</p>
    </NotAuthorized>
</AuthorizeView>

@code {
    public string userIdentifier = string.Empty;

    private void SignIn()
    {
        var currentUser = AuthenticationService.CurrentUser;

        var identity = new ClaimsIdentity(
            new[]
            {
                new Claim(ClaimTypes.Name, userIdentifier),
            },
            "Custom Authentication");

        var newUser = new ClaimsPrincipal(identity);

        AuthenticationService.CurrentUser = newUser;
    }
}
@inject AuthenticationService AuthenticationService

<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>

<AuthorizeView>
    <Authorized>
        <p>Hello, @context.User.Identity?.Name!</p>
    </Authorized>
    <NotAuthorized>
        <p>You're not authorized.</p>
    </NotAuthorized>
</AuthorizeView>

@code {
    public string userIdentifier = string.Empty;

    private void SignIn()
    {
        var currentUser = AuthenticationService.CurrentUser;

        var identity = new ClaimsIdentity(
            new[]
            {
                new Claim(ClaimTypes.Name, userIdentifier),
            },
            "Custom Authentication");

        var newUser = new ClaimsPrincipal(identity);

        AuthenticationService.CurrentUser = newUser;
    }
}

Kapsamı bir bileşen olan hizmetler için ekleme AuthenticationStateProvider

Doğru başlatılmamış yeni bir örneğinin AuthenticationStateProvider oluşturulmasıyla sonuçlanan özel bir kapsam içinde çözümlemeye AuthenticationStateProvider çalışma.

Kapsamı bir bileşen olan bir hizmet içinde öğesine erişmek AuthenticationStateProvider için, yönergesini @inject veya [Inject] özniteliğini ekleyin AuthenticationStateProvider ve bunu bir parametre olarak hizmete geçirin. Bu yaklaşım, doğru, başlatılan örneğinin AuthenticationStateProvider her kullanıcı uygulaması örneği için kullanılmasını sağlar.

ExampleService.cs:

public class ExampleService
{
    public async Task<string> ExampleMethod(AuthenticationStateProvider authStateProvider)
    {
        var authState = await authStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity is not null && user.Identity.IsAuthenticated)
        {
            return $"{user.Identity.Name} is authenticated.";
        }
        else
        {
            return "The user is NOT authenticated.";
        }
    }
}

Hizmeti kapsamlı olarak kaydedin. Sunucu tarafı Blazor bir uygulamada, kapsamı belirlenmiş hizmetlerin ömrü istemci bağlantı devresinin süresine eşittir.

Program dosyasında:

builder.Services.AddScoped<ExampleService>();

Startup.csiçindeStartup.ConfigureServices:

services.AddScoped<ExampleService>();

Aşağıdaki InjectAuthStateProvider bileşeninde:

InjectAuthStateProvider.razor:

@page "/inject-auth-state-provider"
@inherits OwningComponentBase
@inject AuthenticationStateProvider AuthenticationStateProvider

<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>

<p>@message</p>

@code {
    private string? message;
    private ExampleService? ExampleService { get; set; }

    protected override async Task OnInitializedAsync()
    {
        ExampleService = ScopedServices.GetRequiredService<ExampleService>();

        message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
    }
}
@page "/inject-auth-state-provider"
@inject AuthenticationStateProvider AuthenticationStateProvider
@inherits OwningComponentBase

<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>

<p>@message</p>

@code {
    private string? message;
    private ExampleService? ExampleService { get; set; }

    protected override async Task OnInitializedAsync()
    {
        ExampleService = ScopedServices.GetRequiredService<ExampleService>();

        message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
    }
}

Daha fazla bilgi için ASP.NET Core Blazor bağımlılık ekleme kılavuzuna OwningComponentBase bakın.

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

Bir AuthenticationStateProviderbileşendekiAuthorizeViewiçerik gibi yetkisiz içeriklerin özel bir içerikle ön oturum açma sırasında gösterilmesini önlemek için aşağıdaki yaklaşımlardan birini benimseyin:

  • Ön kayıt özelliğini devre dışı bırakma: Uygulamanın bileşen hiyerarşisinde kök bileşen olmayan en üst düzey bileşende olarak ayarlanmış false parametreyle prerender işleme modunu belirtin.

    Not

    Kök bileşeni etkileşimli hale getirme (bileşen gibi App ) desteklenmez. Bu nedenle, prerendering bileşeni tarafından App doğrudan devre dışı bırakılamaz.

    Web Uygulaması proje şablonunu temel alan Blazor uygulamalar için, bileşenin bileşeninde App (Components/App.razor) kullanıldığı ön Routes kayıt genellikle devre dışı bırakılır:

    <Routes @rendermode="new InteractiveServerRenderMode(prerender: false)" />
    

    Ayrıca, bileşen için HeadOutlet ön kayıt özelliğini devre dışı bırakın:

    <HeadOutlet @rendermode="new InteractiveServerRenderMode(prerender: false)" />
    

    Bileşen örneğine uygulanan Routes işleme modunu seçmeli olarak denetleyebilirsiniz. Örneğin bkz . ASP.NET Çekirdek Blazor işleme modları.

  • Ön kayıt özelliğini devre dışı bırakma: Dosyayı açın _Host.cshtml ve Bileşen Etiketi Yardımcısı'nın özniteliğini olarak Serverdeğiştirinrender-mode:

    <component type="typeof(App)" render-mode="Server" />
    
  • Uygulama başlamadan önce kullanıcının kimliğini doğrulama: Bu yaklaşımı benimsemek için, uygulamanın kullanıcının ilk isteğine tabanlı oturum açma sayfasıyla Identityyanıt vermesi veya kimlik doğrulaması yapılana kadar uç noktalara Blazor yönelik istekleri görüntülemesi ve engellemesi gerekir. Daha fazla bilgi için bkz . Yetkilendirmeyle korunan kullanıcı verileriyle ASP.NET Core uygulaması oluşturma. Kimlik doğrulamasından sonra, önceden oluşturulmuş Razor bileşenlerdeki yetkisiz içerik yalnızca kullanıcının içeriği görüntüleme yetkisinin gerçekten yetkisi olmadığında gösterilir.

Kullanıcı durumu yönetimi

Addaki "state" sözcüğüne rağmen, AuthenticationStateProvider genel kullanıcı durumunu depolamak için değildir. AuthenticationStateProvider yalnızca kullanıcının uygulamada kimlik doğrulama durumunu, uygulamada oturum açıp açmadığını ve kim olarak oturum açtığını gösterir.

Kimlik doğrulaması, Sayfalar ve MVC uygulamalarıyla aynı ASP.NET Core Identity kimlik doğrulamasını Razor kullanır. ASP.NET Core Identity için depolanan kullanıcı durumu, uygulamaya ek kod eklemeden akışı Blazor yapılır. Özelliklerin uygulamanın bölümlerinde etkili olması için Identity ASP.NET Core Identity makalelerindeki ve öğreticilerindeki Blazor yönergeleri izleyin.

ASP.NET Core Identitydışında genel durum yönetimi hakkında yönergeler için bkz . ASP.NET Core Blazor durum yönetimi.

Ek güvenlik soyutlamaları

Kimlik doğrulama durumunu yönetmeye iki ek soyutlama daha katılır:

Not

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

Geçici yeniden yönlendirme URL'si geçerlilik süresi

Bu bölüm Web Apps için Blazor geçerlidir.

RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration Sunucu tarafı işleme tarafından Blazor yayılan geçici yeniden yönlendirme URL'leri için veri koruma geçerlilik ömrünü almak veya ayarlamak için seçeneğini kullanın. Bunlar yalnızca geçici olarak kullanıldığından, yalnızca bir istemcinin URL'yi alması ve gezinmeye başlaması için yaşam süresi yeterli olmalıdır. Ancak, sunucular arasında saat dengesizliği için izin verecek kadar uzun olmalıdır. Varsayılan değer beş dakikadır.

Aşağıdaki örnekte değer yedi dakikaya uzatılır:

builder.Services.AddRazorComponents(options => 
    options.TemporaryRedirectionUrlValidityDuration = 
        TimeSpan.FromMinutes(7));

Ek kaynaklar