Share via


ASP.NET Core Blazor Hybrid 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, ASP.NET Core'un Blazor Hybrid uygulamalarında güvenlik ve ASP.NET Core Identity yapılandırması ve yönetimine yönelik desteği açıklanmaktadır.

Tarayıcı, korumalı alanı tarafından sunulmayabilecek gelişmiş güvenlik garantileri sunduğundan, Blazor Hybrid uygulamalarındaki kimlik doğrulaması yerel platform kitaplıkları tarafından işlenir. Yerel uygulamaların kimlik doğrulaması, işletim sistemine özgü bir mekanizmayı veya OpenID Connect (OIDC) gibi bir federasyon protokolü aracılığıyla kullanır. Uygulama için seçtiğiniz kimlik sağlayıcısının kılavuzunu izleyin ve ardından bu makaledeki yönergeleri Blazor kullanarak kimliği daha fazla tümleştirin.

Kimlik doğrulamasını tümleştirmenin Razor bileşenleri ve hizmetleri için aşağıdaki hedeflere ulaşması gerekir:

  • Microsoft.AspNetCore.Components.Authorization paketindeki, AuthorizeView gibi soyutlamaları kullanın.
  • Kimlik doğrulaması bağlamındaki değişikliklere tepki verin.
  • Uygulama tarafından kimlik sağlayıcısından sağlanan erişim kimlik bilgilerine (örneğin, yetkili API çağrıları gerçekleştirmek için erişim belirteçleri) erişin.

Bir .NET MAUI, WPF veya Windows Forms uygulamasına kimlik doğrulaması eklendikten ve kullanıcılar başarılı bir şekilde oturum açıp çıkış yapabildikten sonra, Kimliği doğrulanmış kullanıcıyı Razor bileşenleri ve hizmetleri için kullanılabilir hale getirmek için kimlik doğrulamasını Blazor ile tümleştirin. Aşağıdaki adımları gerçekleştirin:

.NET MAUI uygulamalar Xamarin.Essentials: Web Authenticator kullanır: WebAuthenticator sınıfı, uygulamanın, uygulamada kayıtlı belirli bir URL'ye geri aramayı dinleyen tarayıcı tabanlı kimlik doğrulaması akışlarını başlatmasına olanak tanır.

Ek yönergeler için aşağıdaki kaynaklara bakın:

Windows Forms uygulamaları, Microsoft Entra (ME-ID) ve AAD B2C ile tümleştirmek için Microsoft kimlik platformu kullanır. Daha fazla bilgi için, bkz. Microsoft Kimlik Doğrulaması Kitaplığı'na (MSAL) Genel Bakış.

Kullanıcı değişiklik güncelleştirmeleri olmadan özel AuthenticationStateProvider oluşturma

Uygulama başlatıldıktan hemen sonra kullanıcının kimliğini doğrularsa ve kimliği doğrulanmış kullanıcı uygulama ömrünün tamamı boyunca aynı kalırsa, kullanıcı değişikliği bildirimleri gerekli değildir ve uygulama yalnızca kimliği doğrulanmış kullanıcı hakkında bilgi sağlar. Bu senaryoda, uygulama açıldığında kullanıcı uygulamada oturum açar ve kullanıcı oturumu kapatıldıktan sonra uygulama yeniden oturum açma ekranını görüntüler. Aşağıdaki ExternalAuthStateProvider, bu kimlik doğrulaması senaryosu için bir özel AuthenticationStateProvider uygulaması örneğidir.

Not

Aşağıdaki özel AuthenticationStateProvider, kod örneğini herhangi bir Blazor Hybrid uygulamasına uygulanabilir kılmak için bir ad alanı bildirmez. Ancak en iyi yöntem, örneği bir üretim uygulamasında uyguladığınızda uygulamanızın ad alanını sağlamaktır.

ExternalAuthStateProvider.cs:

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

public class ExternalAuthStateProvider : AuthenticationStateProvider
{
    private readonly Task<AuthenticationState> authenticationState;

    public ExternalAuthStateProvider(AuthenticatedUser user) => 
        authenticationState = Task.FromResult(new AuthenticationState(user.Principal));

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

public class AuthenticatedUser
{
    public ClaimsPrincipal Principal { get; set; } = new();
}

Aşağıdaki adımlar şunları yapmayı tanımlar:

  • Gerekli ad alanlarını ekleme.
  • Yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme.
  • Hizmet koleksiyonunu oluşturma.
  • Kimliği doğrulanmış kullanıcının talep sorumlusunu ayarlamak için AuthenticatedUser hizmetini çözümleme. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın.
  • Yerleşik konağı döndürme.

MauiProgram.cs için MauiProgram.CreateMauiApp yönteminde Microsoft.AspNetCore.Components.Authorization ve System.Security.Claims için ad alanları ekleyin:

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

Yerleşik bir Microsoft.Maui.Hosting.MauiApp döndüren aşağıdaki kod satırını kaldırın:

- return builder.Build();

Önceki kod satırını aşağıdaki kodla değiştirin. Kullanıcının kimliğini doğrulamak için OpenID/MSAL kodu ekleyin. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın.

builder.Services.AddAuthorizationCore();
builder.Services.TryAddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
builder.Services.AddSingleton<AuthenticatedUser>();
var host = builder.Build();

var authenticatedUser = host.Services.GetRequiredService<AuthenticatedUser>();

/*
Provide OpenID/MSAL code to authenticate the user. See your identity provider's 
documentation for details.

The user is represented by a new ClaimsPrincipal based on a new ClaimsIdentity.
*/
var user = new ClaimsPrincipal(new ClaimsIdentity());

authenticatedUser.Principal = user;

return host;

Aşağıdaki adımlar şunları yapmayı tanımlar:

  • Gerekli ad alanlarını ekleme.
  • Yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme.
  • Hizmet koleksiyonunu oluşturun ve yerleşik hizmet koleksiyonunu uygulamanın ResourceDictionary öğesine kaynak olarak ekleyin.
  • Kimliği doğrulanmış kullanıcının talep sorumlusunu ayarlamak için AuthenticatedUser hizmetini çözümleme. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın.
  • Yerleşik konağı döndürme.

MainWindow öğesinin oluşturucusunda (MainWindow.xaml.cs) Microsoft.AspNetCore.Components.Authorization ve System.Security.Claims için ad alanları ekleyin:

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

Yerleşik hizmet koleksiyonunu uygulamanın ResourceDictionary öğesine kaynak olarak ekleyen aşağıdaki kod satırını kaldırın:

- Resources.Add("services", serviceCollection.BuildServiceProvider());

Önceki kod satırını aşağıdaki kodla değiştirin. Kullanıcının kimliğini doğrulamak için OpenID/MSAL kodu ekleyin. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın.

serviceCollection.AddAuthorizationCore();
serviceCollection.TryAddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
serviceCollection.AddSingleton<AuthenticatedUser>();
var services = serviceCollection.BuildServiceProvider();
Resources.Add("services", services);

var authenticatedUser = services.GetRequiredService<AuthenticatedUser>();

/*
Provide OpenID/MSAL code to authenticate the user. See your identity provider's 
documentation for details.

The user is represented by a new ClaimsPrincipal based on a new ClaimsIdentity.
*/
var user = new ClaimsPrincipal(new ClaimsIdentity());

authenticatedUser.Principal = user;

Aşağıdaki adımlar şunları yapmayı tanımlar:

  • Gerekli ad alanlarını ekleme.
  • Yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme.
  • Hizmet koleksiyonunu oluşturun ve oluşturulan hizmet koleksiyonunu uygulamanın servis sağlayıcısına ekleyin.
  • Kimliği doğrulanmış kullanıcının talep sorumlusunu ayarlamak için AuthenticatedUser hizmetini çözümleme. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın.

Form1 öğesinin oluşturucusunda (Form1.cs) Microsoft.AspNetCore.Components.Authorization ve System.Security.Claims için ad alanları ekleyin:

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

Yerleşik hizmet koleksiyonunu uygulamanın hizmet sağlayıcısına ayarlayan aşağıdaki kod satırını kaldırın:

- blazorWebView1.Services = services.BuildServiceProvider();

Önceki kod satırını aşağıdaki kodla değiştirin. Kullanıcının kimliğini doğrulamak için OpenID/MSAL kodu ekleyin. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın.

services.AddAuthorizationCore();
services.TryAddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
services.AddSingleton<AuthenticatedUser>();
var serviceCollection = services.BuildServiceProvider();
blazorWebView1.Services = serviceCollection;

var authenticatedUser = serviceCollection.GetRequiredService<AuthenticatedUser>();

/*
Provide OpenID/MSAL code to authenticate the user. See your identity provider's 
documentation for details.

The user is represented by a new ClaimsPrincipal based on a new ClaimsIdentity.
*/
var user = new ClaimsPrincipal(new ClaimsIdentity());

authenticatedUser.Principal = user;

Kullanıcı değişiklik güncelleştirmeleri ile özel AuthenticationStateProvider oluşturma

Blazor uygulaması çalışırken kullanıcıyı güncelleştirmek için aşağıdaki yaklaşımlardan birini kullanarak AuthenticationStateProvider uygulaması içinde NotifyAuthenticationStateChanged çağrısı yapın:

BlazorWebView dışından bir kimlik doğrulaması güncelleştirmesi sinyalini verme (Seçenek 1)

Bir özel AuthenticationStateProvider, kimlik doğrulaması güncelleştirmesinin sinyallerini vermek için genel bir hizmet kullanabilir. Hizmet, olayın NotifyAuthenticationStateChanged öğesini çağırdığında AuthenticationStateProvider öğesinin abone olabileceği bir olay sunmasını öneririz.

Not

Aşağıdaki özel AuthenticationStateProvider, kod örneğini herhangi bir Blazor Hybrid uygulamasına uygulanabilir kılmak için bir ad alanı bildirmez. Ancak en iyi yöntem, örneği bir üretim uygulamasında uyguladığınızda uygulamanızın ad alanını sağlamaktır.

ExternalAuthStateProvider.cs:

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

public class ExternalAuthStateProvider : AuthenticationStateProvider
{
    private AuthenticationState currentUser;

    public ExternalAuthStateProvider(ExternalAuthService service)
    {
        currentUser = new AuthenticationState(service.CurrentUser);

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

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

public class ExternalAuthService
{
    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);
            }
        }
    }
}

MauiProgram.cs öğesinin MauiProgram.CreateMauiApp yönteminde Microsoft.AspNetCore.Components.Authorization için bir ad alanı ekleme:

using Microsoft.AspNetCore.Components.Authorization;

Yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme:

builder.Services.AddAuthorizationCore();
builder.Services.TryAddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
builder.Services.AddSingleton<ExternalAuthService>();

MainWindow öğesinin oluşturucusunda (MainWindow.xaml.cs) Microsoft.AspNetCore.Components.Authorization için bir ad alanı ekleme:

using Microsoft.AspNetCore.Components.Authorization;

Yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme:

serviceCollection.AddAuthorizationCore();
serviceCollection.TryAddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
serviceCollection.AddSingleton<ExternalAuthService>();

Form1 öğesinin oluşturucusunda (Form1.cs) Microsoft.AspNetCore.Components.Authorization için bir ad alanı ekleme:

using Microsoft.AspNetCore.Components.Authorization;

Yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme:

services.AddAuthorizationCore();
services.TryAddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
services.AddSingleton<ExternalAuthService>();

Uygulama bir kullanıcının kimliğini doğrularken ExternalAuthService hizmetini çözümleme:

var authService = host.Services.GetRequiredService<ExternalAuthService>();

Kullanıcının kimliğini doğrulamak için özel OpenID/MSAL kodunuzu yürütün. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın. Kimliği doğrulanmış kullanıcı (aşağıdaki örnekte authenticatedUser) yeni bir ClaimsIdentity tabanlı yeni bir ClaimsPrincipal öğesidir.

Geçerli kullanıcıyı kimliği doğrulanmış kullanıcı olarak ayarlama:

authService.CurrentUser = authenticatedUser;

Önceki yaklaşıma bir alternatif, kullanıcının ilkesini bir hizmet aracılığıyla ayarlamak yerine, bağımlılık ekleme kapsayıcısının kullanılmasını önleyen System.Threading.Thread.CurrentPrincipal öğesine ayarlamaktır:

public class CurrentThreadUserAuthenticationStateProvider : AuthenticationStateProvider
{
    public override Task<AuthenticationState> GetAuthenticationStateAsync() =>
        Task.FromResult(
            new AuthenticationState(Thread.CurrentPrincipal as ClaimsPrincipal ?? 
                new ClaimsPrincipal(new ClaimsIdentity())));
}

Alternatif yaklaşım kullanılarak, hizmet koleksiyonuna yalnızca yetkilendirme hizmetleri (AddAuthorizationCore) ve CurrentThreadUserAuthenticationStateProvider (.TryAddScoped<AuthenticationStateProvider, CurrentThreadUserAuthenticationStateProvider>()) eklenir.

Kimlik doğrulamasını BlazorWebView ile işleme (Seçenek 2)

Bir özel AuthenticationStateProvider, oturum açmayı tetikleme, oturumu kapatma ve kullanıcıyı güncelleştirmeye yönelik ek yöntemler içerebilir.

Not

Aşağıdaki özel AuthenticationStateProvider, kod örneğini herhangi bir Blazor Hybrid uygulamasına uygulanabilir kılmak için bir ad alanı bildirmez. Ancak en iyi yöntem, örneği bir üretim uygulamasında uyguladığınızda uygulamanızın ad alanını sağlamaktır.

ExternalAuthStateProvider.cs:

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

public class ExternalAuthStateProvider : AuthenticationStateProvider
{
    private ClaimsPrincipal currentUser = new ClaimsPrincipal(new ClaimsIdentity());

    public override Task<AuthenticationState> GetAuthenticationStateAsync() =>
        Task.FromResult(new AuthenticationState(currentUser));

    public Task LogInAsync()
    {
        var loginTask = LogInAsyncCore();
        NotifyAuthenticationStateChanged(loginTask);

        return loginTask;

        async Task<AuthenticationState> LogInAsyncCore()
        {
            var user = await LoginWithExternalProviderAsync();
            currentUser = user;

            return new AuthenticationState(currentUser);
        }
    }

    private Task<ClaimsPrincipal> LoginWithExternalProviderAsync()
    {
        /*
            Provide OpenID/MSAL code to authenticate the user. See your identity 
            provider's documentation for details.

            Return a new ClaimsPrincipal based on a new ClaimsIdentity.
        */
        var authenticatedUser = new ClaimsPrincipal(new ClaimsIdentity());

        return Task.FromResult(authenticatedUser);
    }

    public void Logout()
    {
        currentUser = new ClaimsPrincipal(new ClaimsIdentity());
        NotifyAuthenticationStateChanged(
            Task.FromResult(new AuthenticationState(currentUser)));
    }
}

Yukarıdaki örnekte:

  • LogInAsyncCore çağrısı, oturum açma işlemini tetikler.
  • Bir güncelleştirmenin devam ettiğini bildiren NotifyAuthenticationStateChanged çağrısı, uygulamanın oturum açma veya oturum kapatma işlemi sırasında geçici bir kullanıcı arabirimi sağlamasına olanak tanır.
  • loginTask döndürme, oturum açmayı tetikleyen bileşenin görev tamamlandıktan sonra bekleyip tepki verebilmesi için görevi döndürür.
  • LoginWithExternalProviderAsync yöntemi, geliştirici tarafından kimlik sağlayıcısının SDK'sı ile kullanıcıda oturum açmak için uygulanır. Daha fazla bilgi için her kimlik sağlayıcınızın belgelerine bakın. Kimliği doğrulanmış kullanıcı (authenticatedUser), yeni bir ClaimsIdentity tabanlı yeni bir ClaimsPrincipal öğesidir.

MauiProgram.cs için MauiProgram.CreateMauiApp yönteminde yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme:

builder.Services.AddAuthorizationCore();
builder.Services.TryAddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();

MainWindow öğesinin oluşturucusunda (MainWindow.xaml.cs) yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme:

serviceCollection.AddAuthorizationCore();
serviceCollection.TryAddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();

Form1 öğesinin oluşturucusunda (Form1.cs) yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme:

services.AddAuthorizationCore();
services.TryAddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();

Aşağıdaki LoginComponent bileşeni, bir kullanıcı için nasıl oturum açılacağını gösterir. Tipik bir uygulamada, LoginComponent bileşeni yalnızca, kullanıcı uygulamada oturum açmadıysa bir üst bileşende gösterilir.

Shared/LoginComponent.razor:

@inject AuthenticationStateProvider AuthenticationStateProvider

<button @onclick="Login">Log in</button>

@code
{
    public async Task Login()
    {
        await ((ExternalAuthStateProvider)AuthenticationStateProvider)
            .LogInAsync();
    }
}

Aşağıdaki LogoutComponent bileşeni, bir kullanıcı için nasıl oturum kapatılacağını gösterir. Tipik bir uygulamada, LogoutComponent bileşeni yalnızca, kullanıcı uygulamada oturum açtıysa bir üst bileşende gösterilir.

Shared/LogoutComponent.razor:

@inject AuthenticationStateProvider AuthenticationStateProvider

<button @onclick="Logout">Log out</button>

@code
{
    public async Task Logout()
    {
        await ((ExternalAuthStateProvider)AuthenticationStateProvider)
            .Logout();
    }
}

Diğer kimlik doğrulaması bilgilerine erişme

Blazor, web API'lerine HTTP istekleri için kullanılacak erişim belirteçleri gibi diğer kimlik bilgileriyle ilgilenmek için bir soyutlama tanımlamaz. Kimlik sağlayıcısının SDK'sının sağladığı temel bilgilerle kullanıcının kimlik bilgilerini yönetmek için kimlik sağlayıcısının yönergelerini takip etmenizi öneririz.

Kimlik sağlayıcısı SDK'larının cihazda depolanan kullanıcı kimlik bilgileri için belirteç deposu kullanması yaygındır. SDK'nın belirteç deposu temel öğesi hizmet kapsayıcısına eklenirse, SDK'nın temel öğesini uygulama içinde kullanın.

Blazor çerçevesi bir kullanıcının kimlik doğrulaması kimlik bilgilerini bilmez ve kimlik bilgileriyle hiçbir şekilde etkileşim kurmaz, bu nedenle uygulamanın kodu en uygun gördüğünüz yaklaşımı izlemekte serbesttir. Ancak, bir uygulamada kimlik doğrulaması kodu uygularken Diğer kimlik doğrulaması güvenliği konuları bölümünde yer alan genel güvenlik yönergelerini izleyin.

Diğer kimlik doğrulaması güvenliği konuları

Kimlik doğrulaması işlemi Blazor öğesinin dışındadır ve geliştiricilerin ek güvenlik yönergeleri için kimlik sağlayıcısının kılavuzuna erişmesini öneririz.

Kimlik doğrulamasını uygularken:

  • Web View bağlamında kimlik doğrulamasından kaçının. Örneğin, kimlik doğrulaması akışını gerçekleştirmek için JavaScript OAuth kitaplığı kullanmaktan kaçının. Tek sayfalı bir uygulamada, kimlik doğrulaması belirteçleri JavaScript'te gizlenemez ve kötü amaçlı kullanıcılar tarafından kolayca bulunarak kötü amaçlı olarak kullanılabilir. Yerel uygulamalar yalnızca tarayıcı bağlamı dışında belirteçler elde edebildiğinden bu riske maruz kalmaz; bu, sahte üçüncü taraf komut dosyalarının belirteçleri çalamayacağı ve uygulamanın güvenliğini ihlal edemeyeceği anlamına gelir.
  • Kimlik doğrulaması iş akışını kendiniz uygulamaktan kaçının. Çoğu durumda platform kitaplıkları, ele geçirilebilen bir özel Web View kullanmak yerine sistemin tarayıcısını kullanarak kimlik doğrulaması iş akışını güvenli bir şekilde işler.
  • Kimlik doğrulaması gerçekleştirmek için platformun Web View denetimini kullanmaktan kaçının. Bunun yerine, mümkün olduğunda sistemin tarayıcısına güvenin.
  • Belirteçleri belge bağlamına (JavaScript) geçirmekten kaçının. Bazı durumlarda, dış hizmete yetkili bir çağrı gerçekleştirmek için belge içindeki bir JavaScript kitaplığı gerekir. Belirteci birlikte çalışma aracılığıyla JS JavaScript'in kullanımına açmak yerine:
    • Kitaplık ve Web View içinde oluşturulmuş bir geçici belirteç sağlayın.
    • Kodda giden ağ isteğini kesme.
    • Geçici belirteci gerçek belirteçle değiştirin ve isteğin hedefinin geçerli olduğunu onaylayın.

Ek kaynaklar

Tarayıcı, korumalı alanı tarafından sunulmayabilecek gelişmiş güvenlik garantileri sunduğundan, Blazor Hybrid uygulamalarındaki kimlik doğrulaması yerel platform kitaplıkları tarafından işlenir. Yerel uygulamaların kimlik doğrulaması, işletim sistemine özgü bir mekanizmayı veya OpenID Connect (OIDC) gibi bir federasyon protokolü aracılığıyla kullanır. Uygulama için seçtiğiniz kimlik sağlayıcısının kılavuzunu izleyin ve ardından bu makaledeki yönergeleri Blazor kullanarak kimliği daha fazla tümleştirin.

Kimlik doğrulamasını tümleştirmenin Razor bileşenleri ve hizmetleri için aşağıdaki hedeflere ulaşması gerekir:

  • Microsoft.AspNetCore.Components.Authorization paketindeki, AuthorizeView gibi soyutlamaları kullanın.
  • Kimlik doğrulaması bağlamındaki değişikliklere tepki verin.
  • Uygulama tarafından kimlik sağlayıcısından sağlanan erişim kimlik bilgilerine (örneğin, yetkili API çağrıları gerçekleştirmek için erişim belirteçleri) erişin.

Bir .NET MAUI, WPF veya Windows Forms uygulamasına kimlik doğrulaması eklendikten ve kullanıcılar başarılı bir şekilde oturum açıp çıkış yapabildikten sonra, Kimliği doğrulanmış kullanıcıyı Razor bileşenleri ve hizmetleri için kullanılabilir hale getirmek için kimlik doğrulamasını Blazor ile tümleştirin. Aşağıdaki adımları gerçekleştirin:

.NET MAUI uygulamalar Xamarin.Essentials: Web Authenticator kullanır: WebAuthenticator sınıfı, uygulamanın, uygulamada kayıtlı belirli bir URL'ye geri aramayı dinleyen tarayıcı tabanlı kimlik doğrulaması akışlarını başlatmasına olanak tanır.

Ek yönergeler için aşağıdaki kaynaklara bakın:

Windows Forms uygulamaları, Microsoft Entra (ME-ID) ve AAD B2C ile tümleştirmek için Microsoft kimlik platformu kullanır. Daha fazla bilgi için, bkz. Microsoft Kimlik Doğrulaması Kitaplığı'na (MSAL) Genel Bakış.

Kullanıcı değişiklik güncelleştirmeleri olmadan özel AuthenticationStateProvider oluşturma

Uygulama başlatıldıktan hemen sonra kullanıcının kimliğini doğrularsa ve kimliği doğrulanmış kullanıcı uygulama ömrünün tamamı boyunca aynı kalırsa, kullanıcı değişikliği bildirimleri gerekli değildir ve uygulama yalnızca kimliği doğrulanmış kullanıcı hakkında bilgi sağlar. Bu senaryoda, uygulama açıldığında kullanıcı uygulamada oturum açar ve kullanıcı oturumu kapatıldıktan sonra uygulama yeniden oturum açma ekranını görüntüler. Aşağıdaki ExternalAuthStateProvider, bu kimlik doğrulaması senaryosu için bir özel AuthenticationStateProvider uygulaması örneğidir.

Not

Aşağıdaki özel AuthenticationStateProvider, kod örneğini herhangi bir Blazor Hybrid uygulamasına uygulanabilir kılmak için bir ad alanı bildirmez. Ancak en iyi yöntem, örneği bir üretim uygulamasında uyguladığınızda uygulamanızın ad alanını sağlamaktır.

ExternalAuthStateProvider.cs:

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

public class ExternalAuthStateProvider : AuthenticationStateProvider
{
    private readonly Task<AuthenticationState> authenticationState;

    public ExternalAuthStateProvider(AuthenticatedUser user) => 
        authenticationState = Task.FromResult(new AuthenticationState(user.Principal));

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

public class AuthenticatedUser
{
    public ClaimsPrincipal Principal { get; set; } = new();
}

Aşağıdaki adımlar şunları yapmayı tanımlar:

  • Gerekli ad alanlarını ekleme.
  • Yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme.
  • Hizmet koleksiyonunu oluşturma.
  • Kimliği doğrulanmış kullanıcının talep sorumlusunu ayarlamak için AuthenticatedUser hizmetini çözümleme. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın.
  • Yerleşik konağı döndürme.

MauiProgram.cs için MauiProgram.CreateMauiApp yönteminde Microsoft.AspNetCore.Components.Authorization ve System.Security.Claims için ad alanları ekleyin:

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

Yerleşik bir Microsoft.Maui.Hosting.MauiApp döndüren aşağıdaki kod satırını kaldırın:

- return builder.Build();

Önceki kod satırını aşağıdaki kodla değiştirin. Kullanıcının kimliğini doğrulamak için OpenID/MSAL kodu ekleyin. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın.

builder.Services.AddAuthorizationCore();
builder.Services.AddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
builder.Services.AddSingleton<AuthenticatedUser>();
var host = builder.Build();

var authenticatedUser = host.Services.GetRequiredService<AuthenticatedUser>();

/*
Provide OpenID/MSAL code to authenticate the user. See your identity provider's 
documentation for details.

The user is represented by a new ClaimsPrincipal based on a new ClaimsIdentity.
*/
var user = new ClaimsPrincipal(new ClaimsIdentity());

authenticatedUser.Principal = user;

return host;

Aşağıdaki adımlar şunları yapmayı tanımlar:

  • Gerekli ad alanlarını ekleme.
  • Yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme.
  • Hizmet koleksiyonunu oluşturun ve yerleşik hizmet koleksiyonunu uygulamanın ResourceDictionary öğesine kaynak olarak ekleyin.
  • Kimliği doğrulanmış kullanıcının talep sorumlusunu ayarlamak için AuthenticatedUser hizmetini çözümleme. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın.
  • Yerleşik konağı döndürme.

MainWindow öğesinin oluşturucusunda (MainWindow.xaml.cs) Microsoft.AspNetCore.Components.Authorization ve System.Security.Claims için ad alanları ekleyin:

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

Yerleşik hizmet koleksiyonunu uygulamanın ResourceDictionary öğesine kaynak olarak ekleyen aşağıdaki kod satırını kaldırın:

- Resources.Add("services", serviceCollection.BuildServiceProvider());

Önceki kod satırını aşağıdaki kodla değiştirin. Kullanıcının kimliğini doğrulamak için OpenID/MSAL kodu ekleyin. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın.

serviceCollection.AddAuthorizationCore();
serviceCollection.AddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
serviceCollection.AddSingleton<AuthenticatedUser>();
var services = serviceCollection.BuildServiceProvider();
Resources.Add("services", services);

var authenticatedUser = services.GetRequiredService<AuthenticatedUser>();

/*
Provide OpenID/MSAL code to authenticate the user. See your identity provider's 
documentation for details.

The user is represented by a new ClaimsPrincipal based on a new ClaimsIdentity.
*/
var user = new ClaimsPrincipal(new ClaimsIdentity());

authenticatedUser.Principal = user;

Aşağıdaki adımlar şunları yapmayı tanımlar:

  • Gerekli ad alanlarını ekleme.
  • Yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme.
  • Hizmet koleksiyonunu oluşturun ve oluşturulan hizmet koleksiyonunu uygulamanın servis sağlayıcısına ekleyin.
  • Kimliği doğrulanmış kullanıcının talep sorumlusunu ayarlamak için AuthenticatedUser hizmetini çözümleme. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın.

Form1 öğesinin oluşturucusunda (Form1.cs) Microsoft.AspNetCore.Components.Authorization ve System.Security.Claims için ad alanları ekleyin:

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

Yerleşik hizmet koleksiyonunu uygulamanın hizmet sağlayıcısına ayarlayan aşağıdaki kod satırını kaldırın:

- blazorWebView1.Services = services.BuildServiceProvider();

Önceki kod satırını aşağıdaki kodla değiştirin. Kullanıcının kimliğini doğrulamak için OpenID/MSAL kodu ekleyin. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın.

services.AddAuthorizationCore();
services.AddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
services.AddSingleton<AuthenticatedUser>();
var serviceCollection = services.BuildServiceProvider();
blazorWebView1.Services = serviceCollection;

var authenticatedUser = serviceCollection.GetRequiredService<AuthenticatedUser>();

/*
Provide OpenID/MSAL code to authenticate the user. See your identity provider's 
documentation for details.

The user is represented by a new ClaimsPrincipal based on a new ClaimsIdentity.
*/
var user = new ClaimsPrincipal(new ClaimsIdentity());

authenticatedUser.Principal = user;

Kullanıcı değişiklik güncelleştirmeleri ile özel AuthenticationStateProvider oluşturma

Blazor uygulaması çalışırken kullanıcıyı güncelleştirmek için aşağıdaki yaklaşımlardan birini kullanarak AuthenticationStateProvider uygulaması içinde NotifyAuthenticationStateChanged çağrısı yapın:

BlazorWebView dışından bir kimlik doğrulaması güncelleştirmesi sinyalini verme (Seçenek 1)

Bir özel AuthenticationStateProvider, kimlik doğrulaması güncelleştirmesinin sinyallerini vermek için genel bir hizmet kullanabilir. Hizmet, olayın NotifyAuthenticationStateChanged öğesini çağırdığında AuthenticationStateProvider öğesinin abone olabileceği bir olay sunmasını öneririz.

Not

Aşağıdaki özel AuthenticationStateProvider, kod örneğini herhangi bir Blazor Hybrid uygulamasına uygulanabilir kılmak için bir ad alanı bildirmez. Ancak en iyi yöntem, örneği bir üretim uygulamasında uyguladığınızda uygulamanızın ad alanını sağlamaktır.

ExternalAuthStateProvider.cs:

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

public class ExternalAuthStateProvider : AuthenticationStateProvider
{
    private AuthenticationState currentUser;

    public ExternalAuthStateProvider(ExternalAuthService service)
    {
        currentUser = new AuthenticationState(service.CurrentUser);

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

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

public class ExternalAuthService
{
    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);
            }
        }
    }
}

MauiProgram.cs öğesinin MauiProgram.CreateMauiApp yönteminde Microsoft.AspNetCore.Components.Authorization için bir ad alanı ekleme:

using Microsoft.AspNetCore.Components.Authorization;

Yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme:

builder.Services.AddAuthorizationCore();
builder.Services.AddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
builder.Services.AddSingleton<ExternalAuthService>();

MainWindow öğesinin oluşturucusunda (MainWindow.xaml.cs) Microsoft.AspNetCore.Components.Authorization için bir ad alanı ekleme:

using Microsoft.AspNetCore.Components.Authorization;

Yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme:

serviceCollection.AddAuthorizationCore();
serviceCollection.AddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
serviceCollection.AddSingleton<ExternalAuthService>();

Form1 öğesinin oluşturucusunda (Form1.cs) Microsoft.AspNetCore.Components.Authorization için bir ad alanı ekleme:

using Microsoft.AspNetCore.Components.Authorization;

Yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme:

services.AddAuthorizationCore();
services.AddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
services.AddSingleton<ExternalAuthService>();

Uygulama bir kullanıcının kimliğini doğrularken ExternalAuthService hizmetini çözümleme:

var authService = host.Services.GetRequiredService<ExternalAuthService>();

Kullanıcının kimliğini doğrulamak için özel OpenID/MSAL kodunuzu yürütün. Ayrıntılar için kimlik sağlayıcınıza ait belgelere bakın. Kimliği doğrulanmış kullanıcı (aşağıdaki örnekte authenticatedUser) yeni bir ClaimsIdentity tabanlı yeni bir ClaimsPrincipal öğesidir.

Geçerli kullanıcıyı kimliği doğrulanmış kullanıcı olarak ayarlama:

authService.CurrentUser = authenticatedUser;

Önceki yaklaşıma bir alternatif, kullanıcının ilkesini bir hizmet aracılığıyla ayarlamak yerine, bağımlılık ekleme kapsayıcısının kullanılmasını önleyen System.Threading.Thread.CurrentPrincipal öğesine ayarlamaktır:

public class CurrentThreadUserAuthenticationStateProvider : AuthenticationStateProvider
{
    public override Task<AuthenticationState> GetAuthenticationStateAsync() =>
        Task.FromResult(
            new AuthenticationState(Thread.CurrentPrincipal as ClaimsPrincipal ?? 
                new ClaimsPrincipal(new ClaimsIdentity())));
}

Alternatif yaklaşım kullanılarak, hizmet koleksiyonuna yalnızca yetkilendirme hizmetleri (AddAuthorizationCore) ve CurrentThreadUserAuthenticationStateProvider (.AddScoped<AuthenticationStateProvider, CurrentThreadUserAuthenticationStateProvider>()) eklenir.

Kimlik doğrulamasını BlazorWebView ile işleme (Seçenek 2)

Bir özel AuthenticationStateProvider, oturum açmayı tetikleme, oturumu kapatma ve kullanıcıyı güncelleştirmeye yönelik ek yöntemler içerebilir.

Not

Aşağıdaki özel AuthenticationStateProvider, kod örneğini herhangi bir Blazor Hybrid uygulamasına uygulanabilir kılmak için bir ad alanı bildirmez. Ancak en iyi yöntem, örneği bir üretim uygulamasında uyguladığınızda uygulamanızın ad alanını sağlamaktır.

ExternalAuthStateProvider.cs:

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

public class ExternalAuthStateProvider : AuthenticationStateProvider
{
    private ClaimsPrincipal currentUser = new ClaimsPrincipal(new ClaimsIdentity());

    public override Task<AuthenticationState> GetAuthenticationStateAsync() =>
        Task.FromResult(new AuthenticationState(currentUser));

    public Task LogInAsync()
    {
        var loginTask = LogInAsyncCore();
        NotifyAuthenticationStateChanged(loginTask);

        return loginTask;

        async Task<AuthenticationState> LogInAsyncCore()
        {
            var user = await LoginWithExternalProviderAsync();
            currentUser = user;

            return new AuthenticationState(currentUser);
        }
    }

    private Task<ClaimsPrincipal> LoginWithExternalProviderAsync()
    {
        /*
            Provide OpenID/MSAL code to authenticate the user. See your identity 
            provider's documentation for details.

            Return a new ClaimsPrincipal based on a new ClaimsIdentity.
        */
        var authenticatedUser = new ClaimsPrincipal(new ClaimsIdentity());

        return Task.FromResult(authenticatedUser);
    }

    public void Logout()
    {
        currentUser = new ClaimsPrincipal(new ClaimsIdentity());
        NotifyAuthenticationStateChanged(
            Task.FromResult(new AuthenticationState(currentUser)));
    }
}

Yukarıdaki örnekte:

  • LogInAsyncCore çağrısı, oturum açma işlemini tetikler.
  • Bir güncelleştirmenin devam ettiğini bildiren NotifyAuthenticationStateChanged çağrısı, uygulamanın oturum açma veya oturum kapatma işlemi sırasında geçici bir kullanıcı arabirimi sağlamasına olanak tanır.
  • loginTask döndürme, oturum açmayı tetikleyen bileşenin görev tamamlandıktan sonra bekleyip tepki verebilmesi için görevi döndürür.
  • LoginWithExternalProviderAsync yöntemi, geliştirici tarafından kimlik sağlayıcısının SDK'sı ile kullanıcıda oturum açmak için uygulanır. Daha fazla bilgi için her kimlik sağlayıcınızın belgelerine bakın. Kimliği doğrulanmış kullanıcı (authenticatedUser), yeni bir ClaimsIdentity tabanlı yeni bir ClaimsPrincipal öğesidir.

MauiProgram.cs için MauiProgram.CreateMauiApp yönteminde yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme:

builder.Services.AddAuthorizationCore();
builder.Services.AddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();

MainWindow öğesinin oluşturucusunda (MainWindow.xaml.cs) yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme:

serviceCollection.AddAuthorizationCore();
serviceCollection.AddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();

Form1 öğesinin oluşturucusunda (Form1.cs) yetkilendirme hizmetlerini ve Blazor soyutlamalarını hizmet koleksiyonuna ekleme:

services.AddAuthorizationCore();
services.AddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();

Aşağıdaki LoginComponent bileşeni, bir kullanıcı için nasıl oturum açılacağını gösterir. Tipik bir uygulamada, LoginComponent bileşeni yalnızca, kullanıcı uygulamada oturum açmadıysa bir üst bileşende gösterilir.

Shared/LoginComponent.razor:

@inject AuthenticationStateProvider AuthenticationStateProvider

<button @onclick="Login">Log in</button>

@code
{
    public async Task Login()
    {
        await ((ExternalAuthStateProvider)AuthenticationStateProvider)
            .LogInAsync();
    }
}

Aşağıdaki LogoutComponent bileşeni, bir kullanıcı için nasıl oturum kapatılacağını gösterir. Tipik bir uygulamada, LogoutComponent bileşeni yalnızca, kullanıcı uygulamada oturum açtıysa bir üst bileşende gösterilir.

Shared/LogoutComponent.razor:

@inject AuthenticationStateProvider AuthenticationStateProvider

<button @onclick="Logout">Log out</button>

@code
{
    public async Task Logout()
    {
        await ((ExternalAuthStateProvider)AuthenticationStateProvider)
            .Logout();
    }
}

Diğer kimlik doğrulaması bilgilerine erişme

Blazor, web API'lerine HTTP istekleri için kullanılacak erişim belirteçleri gibi diğer kimlik bilgileriyle ilgilenmek için bir soyutlama tanımlamaz. Kimlik sağlayıcısının SDK'sının sağladığı temel bilgilerle kullanıcının kimlik bilgilerini yönetmek için kimlik sağlayıcısının yönergelerini takip etmenizi öneririz.

Kimlik sağlayıcısı SDK'larının cihazda depolanan kullanıcı kimlik bilgileri için belirteç deposu kullanması yaygındır. SDK'nın belirteç deposu temel öğesi hizmet kapsayıcısına eklenirse, SDK'nın temel öğesini uygulama içinde kullanın.

Blazor çerçevesi bir kullanıcının kimlik doğrulaması kimlik bilgilerini bilmez ve kimlik bilgileriyle hiçbir şekilde etkileşim kurmaz, bu nedenle uygulamanın kodu en uygun gördüğünüz yaklaşımı izlemekte serbesttir. Ancak, bir uygulamada kimlik doğrulaması kodu uygularken Diğer kimlik doğrulaması güvenliği konuları bölümünde yer alan genel güvenlik yönergelerini izleyin.

Diğer kimlik doğrulaması güvenliği konuları

Kimlik doğrulaması işlemi Blazor öğesinin dışındadır ve geliştiricilerin ek güvenlik yönergeleri için kimlik sağlayıcısının kılavuzuna erişmesini öneririz.

Kimlik doğrulamasını uygularken:

  • Web View bağlamında kimlik doğrulamasından kaçının. Örneğin, kimlik doğrulaması akışını gerçekleştirmek için JavaScript OAuth kitaplığı kullanmaktan kaçının. Tek sayfalı bir uygulamada, kimlik doğrulaması belirteçleri JavaScript'te gizlenemez ve kötü amaçlı kullanıcılar tarafından kolayca bulunarak kötü amaçlı olarak kullanılabilir. Yerel uygulamalar yalnızca tarayıcı bağlamı dışında belirteçler elde edebildiğinden bu riske maruz kalmaz; bu, sahte üçüncü taraf komut dosyalarının belirteçleri çalamayacağı ve uygulamanın güvenliğini ihlal edemeyeceği anlamına gelir.
  • Kimlik doğrulaması iş akışını kendiniz uygulamaktan kaçının. Çoğu durumda platform kitaplıkları, ele geçirilebilen bir özel Web View kullanmak yerine sistemin tarayıcısını kullanarak kimlik doğrulaması iş akışını güvenli bir şekilde işler.
  • Kimlik doğrulaması gerçekleştirmek için platformun Web View denetimini kullanmaktan kaçının. Bunun yerine, mümkün olduğunda sistemin tarayıcısına güvenin.
  • Belirteçleri belge bağlamına (JavaScript) geçirmekten kaçının. Bazı durumlarda, dış hizmete yetkili bir çağrı gerçekleştirmek için belge içindeki bir JavaScript kitaplığı gerekir. Belirteci birlikte çalışma aracılığıyla JS JavaScript'in kullanımına açmak yerine:
    • Kitaplık ve Web View içinde oluşturulmuş bir geçici belirteç sağlayın.
    • Kodda giden ağ isteğini kesme.
    • Geçici belirteci gerçek belirteçle değiştirin ve isteğin hedefinin geçerli olduğunu onaylayın.

Ek kaynaklar