Aracılığıyla paylaş


ASP.NET Çekirdek Blazor kimlik doğrulama durumu

Not

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

Uyarı

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 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 9 sürümüne bakın.

Bu makalede özel kimlik doğrulama durumu sağlayıcısı oluşturma ve kodda kullanıcı kimlik doğrulaması durumu değişiklik bildirimleri alma işlemleri açıklanmaktadır.

Sunucu tarafı ve istemci tarafı Blazor uygulamaları için genel yaklaşımlar benzerdir ancak tam uygulamalarında farklılık gösterir, bu nedenle bu makale sunucu tarafı uygulamalarla istemci tarafı Blazor Blazor uygulamaları arasında özetlenir. Makalenin özetini üzerinde çalıştığınız proje türüyle Blazor eşleşecek şekilde değiştirmek için makalenin üst kısmındaki özet seçiciyi kullanın:

  • Sunucu tarafı Blazor uygulamaları (Server özet): Blazor Server .NET 7 veya öncesi için ve .NET 8 veya üzeri için bir Blazor Web App sunucu projesi.
  • İstemci tarafı Blazor uygulamaları (Blazor WebAssembly özet): Blazor WebAssembly .NET'in tüm sürümleri için veya .NET 8 veya .Client üzeri için bir Blazor Web App projesi için.

Soyut AuthenticationStateProvider sınıf

Çerçeve, Blazor aşağıdaki üyelere sahip geçerli kullanıcının kimlik doğrulama durumu hakkında bilgi sağlayan soyut AuthenticationStateProvider bir sınıf içerir:

Özel AuthenticationStateProvider uygulama

Uygulamanın, uygulamalar için kimlik doğrulaması ve yetkilendirme desteği sağlayan NuGet paketineBlazor başvurması Microsoft.AspNetCore.Components.Authorization gerekir.

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.

Dosyada aşağıdaki kimlik doğrulama, yetkilendirme ve basamaklı kimlik doğrulama durumu hizmetlerini Program yapılandırın.

Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden Blazor uygulama Blazor oluşturduğunuzda, uygulama, kimlik doğrulama durumunu basamaklı parametre olarak göstermeyi içeren aşağıdaki hizmet kayıtlarıyla önceden yapılandırılır. Daha fazla bilgi için makalenin Bileşenle 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 Router bakın.

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddAuthorization();
builder.Services.AddCascadingAuthenticationState();

Dosyada Program kimlik doğrulama ve yetkilendirme hizmetlerini yapılandırın.

Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden Blazor uygulama Blazor oluşturduğunuzda, uygulama aşağıdaki hizmet kaydını içerir.

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddAuthorization();

içinde Startup.ConfigureServices Startup.cskimlik doğrulama ve yetkilendirme hizmetlerini yapılandırın.

Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden Blazor uygulama Blazor oluşturduğunuzda, uygulama aşağıdaki hizmet kaydını içerir.

using Microsoft.AspNetCore.Components.Authorization;

...

services.AddAuthorization();

Blazor WebAssembly Uygulamalarda (tüm .NET sürümleri) veya .Client bir Blazor Web App (.NET 8 veya üzeri) projesinde, dosyada Program kimlik doğrulaması, yetkilendirme ve basamaklı kimlik doğrulaması durum hizmetlerini yapılandırın.

Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden Blazor uygulama Blazor oluşturduğunuzda, uygulama, kimlik doğrulama durumunu basamaklı parametre olarak göstermeyi içeren aşağıdaki hizmet kayıtlarıyla önceden yapılandırılır. Daha fazla bilgi için makalenin Bileşenle 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 Router bakın.

using Microsoft.AspNetCore.Components.Authorization;

...

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

Dosyada Program kimlik doğrulama ve yetkilendirme hizmetlerini yapılandırın.

Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden Blazor uygulama Blazor oluşturduğunuzda, uygulama aşağıdaki hizmet kaydını içerir.

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddAuthorizationCore();

Kullanıcının kimlik doğrulama durumunu oluşturmak için alt sınıf AuthenticationStateProvider ve geçersiz kılma 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 Microsoft.AspNetCore.Components.Authorization;

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

        var user = new ClaimsPrincipal(identity);

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

Not

Yeni ClaimsIdentity bir kod oluşturan önceki kod, C# 12 (.NET 8) ile sunulan basitleştirilmiş koleksiyon başlatmayı kullanır. Daha fazla bilgi için bkz . Koleksiyon ifadeleri - C# dil başvurusu.

Hizmet CustomAuthStateProvider dosyaya Program kaydedilir. kapsamına AddScopedsahip hizmeti kaydedin:

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

Bir Blazor Server uygulamada, çağrısından AddServerSideBlazorsonra kapsamı belirlenmiş AddScoped hizmeti kaydedin:

builder.Services.AddServerSideBlazor();

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

Bir Blazor Server uygulamada, çağrısından AddServerSideBlazorsonra kapsamı belirlenmiş AddScoped hizmeti kaydedin:

services.AddServerSideBlazor();

services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

Hizmet CustomAuthStateProvider dosyaya Program kaydedilir. hizmet singleton'ını ile AddSingletonkaydedin:

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

Yoksa, ad alanını bileşenler arasında kullanılabilir hale getirmek için dosyaya Microsoft.AspNetCore.Components.Authorization bir @using deyim _Imports.razor ekleyin:

@using Microsoft.AspNetCore.Components.Authorization;

Yol görünümü bileşenini, bileşen tanımında bir AuthorizeRouteView olarak Router onaylayın veya değiştirin. Bileşenin Router konumu, uygulama türüne bağlı olarak değişir. Projedeki konumunun farkında değilseniz bileşeni bulmak için aramayı kullanın.

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

Not

Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden Blazor uygulama Blazor oluşturduğunuzda, uygulama bileşeni içerirAuthorizeRouteView. Daha fazla bilgi için makalenin Bileşenle 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 Router bakın.

Bileşenin Router bulunduğu yer:

Bileşenin Router konumu, uygulama türüne bağlı olarak değişir. Projedeki konumunun farkında değilseniz bileşeni bulmak için aramayı kullanın.

<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 ve CascadingAuthenticationState bileşenlerini içerirAuthorizeRouteView.Blazor Daha fazla bilgi için makalenin Bileşenle 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 Router bakın.

Aşağıdaki örnek AuthorizeView bileşen, kimliği doğrulanmış kullanıcının adını 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ğrulama durumu değişiklik bildirimleri

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

Aşağıdaki örnek, bu makalenin önceki bölümlerinde yer alan Özel AuthenticationStateProvider uygulama bölümündeki yönergeleri izleyerek özel AuthenticationStateProvider uygulama işlemini temel alır. Bu bölümdeki yönergeleri izlediyseniz, aşağıdaki CustomAuthStateProvider bölümde gösterilenin yerini 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 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 Claim(ClaimTypes.Name, userIdentifier),
        ], "Custom Authentication");

        var user = new ClaimsPrincipal(identity);

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

Not

Yeni ClaimsIdentity bir kod oluşturan önceki kod, C# 12 (.NET 8) ile sunulan basitleştirilmiş koleksiyon başlatmayı kullanır. Daha fazla bilgi için bkz . Koleksiyon ifadeleri - C# dil başvurusu.

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);
    }
}

Ö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 CustomAuthenticationService sınıf, geçerli kullanıcının talep sorumlusunu kimlik doğrulama durumu sağlayıcısının abone olabileceği bir olayla (currentUser) bir yedekleme alanında (UserChanged) tutar ve olay tarafından çağrılır NotifyAuthenticationStateChanged. Bu bölümün devamında ek yapılandırmayla, CustomAuthenticationService öğesini olayı tetiklemesi UserChanged için ayarlayan CurrentUser mantığı olan bir bileşene eklenebilir.

CustomAuthenticationService.cs:

using System.Security.Claims;

public class CustomAuthenticationService
{
    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 CustomAuthenticationService kaydedin:

builder.Services.AddScoped<CustomAuthenticationService>();

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

services.AddScoped<CustomAuthenticationService>();

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

builder.Services.AddSingleton<CustomAuthenticationService>();

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

using Microsoft.AspNetCore.Components.Authorization;

public class CustomAuthStateProvider : AuthenticationStateProvider
{
    private AuthenticationState authenticationState;

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

        service.UserChanged += (newUser) =>
        {
            authenticationState = new AuthenticationState(newUser);
            NotifyAuthenticationStateChanged(Task.FromResult(authenticationState));
        };
    }

    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 CustomAuthenticationService.CurrentUserayarlanacağı bir talep sorumlusu oluşturur:

@using System.Security.Claims
@inject CustomAuthenticationService AuthService

<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 = AuthService.CurrentUser;

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

        var newUser = new ClaimsPrincipal(identity);

        AuthService.CurrentUser = newUser;
    }
}

Not

Yeni ClaimsIdentity bir kod oluşturan önceki kod, C# 12 (.NET 8) ile sunulan basitleştirilmiş koleksiyon başlatmayı kullanır. Daha fazla bilgi için bkz . Koleksiyon ifadeleri - C# dil başvurusu.

Ek kaynaklar