Condividi tramite


Proteggere ASP.NET app sul lato Blazor server Core

Nota

Questa non è la versione più recente di questo articolo. Per la versione corrente, vedere la versione .NET 8 di questo articolo.

Avviso

Questa versione di ASP.NET Core non è più supportata. Per altre informazioni, vedere Criteri di supporto di .NET e .NET Core. Per la versione corrente, vedere la versione .NET 8 di questo articolo.

Importante

Queste informazioni si riferiscono a un prodotto non definitive che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.

Per la versione corrente, vedere la versione .NET 8 di questo articolo.

Questo articolo illustra come proteggere le app lato Blazor server come applicazioni principali ASP.NET.

Le app lato Blazor server vengono configurate per la sicurezza nello stesso modo delle app core ASP.NET. Per altre informazioni, vedere gli articoli negli argomenti dedicati alla sicurezza di ASP.NET Core.

Il contesto di autenticazione viene stabilito solo all'avvio dell'app, ovvero quando l'app si connette per la prima volta al WebSocket. Il contesto di autenticazione viene mantenuto per la durata del circuito. Le app riconvalidano periodicamente lo stato di autenticazione dell'utente ogni 30 minuti.

Se l'app deve acquisire utenti per servizi personalizzati o reagire agli aggiornamenti all'utente, vedere Scenari di sicurezza aggiuntivi sul lato server ASP.NET CoreBlazor.

Blazor differisce da un'app Web con rendering server tradizionale che effettua nuove richieste HTTP con cookie in ogni spostamento di pagina. L'autenticazione viene verificata durante gli eventi di spostamento. Tuttavia, i cookie non sono coinvolti. I cookie vengono inviati solo quando si effettua una richiesta HTTP a un server, che non avviene quando l'utente si sposta in un'app Blazor . Durante la navigazione, lo stato di autenticazione dell'utente viene controllato all'interno del Blazor circuito, che è possibile aggiornare in qualsiasi momento nel server usando una riconvalida di AuthenticationStateProvider](#additional-authentication-state-providers).

Importante

L'implementazione di un personalizzato NavigationManager per ottenere la convalida dell'autenticazione durante la navigazione non è consigliata. Se l'app deve eseguire la logica dello stato di autenticazione personalizzata durante la navigazione, usare un oggetto personalizzato AuthenticationStateProvider.

Nota

Gli esempi di codice in questo articolo adottano tipi di riferimento nullable (NRT) e l'analisi statica dello stato null del compilatore .NET, supportati in ASP.NET Core in .NET 6 o versione successiva. Quando la destinazione è ASP.NET Core 5.0 o versioni precedenti, rimuovere la designazione di tipo Null (?) dagli esempi in questo articolo.

Sicurezza lato server di dati e credenziali sensibili

Negli ambienti di test/gestione temporanea e produzione, il codice lato Blazor server e le API Web devono usare flussi di autenticazione sicuri che evitano di mantenere le credenziali all'interno del codice del progetto o dei file di configurazione. Al di fuori dei test di sviluppo locali, è consigliabile evitare l'uso di variabili di ambiente per archiviare i dati sensibili, perché le variabili di ambiente non sono l'approccio più sicuro. Per i test di sviluppo locali, lo strumento Secret Manager è consigliato per proteggere i dati sensibili. Per ulteriori informazioni, vedi le seguenti risorse:

Per lo sviluppo e il test locali sul lato client e sul lato server, usare lo strumento Secret Manager per proteggere le credenziali sensibili.

Modello di progetto

Creare una nuova app lato Blazor server seguendo le indicazioni riportate in Strumenti per ASP.NET Core Blazor.

Dopo aver scelto il modello di app sul lato server e aver configurato il progetto, selezionare l'autenticazione dell'app in Tipo di autenticazione:

  • Nessuno (impostazione predefinita): nessuna autenticazione.
  • Account singoli: gli account utente vengono archiviati all'interno dell'app usando ASP.NET Core Identity.
  • Nessuno (impostazione predefinita): nessuna autenticazione.
  • Account singoli: gli account utente vengono archiviati all'interno dell'app usando ASP.NET Core Identity.
  • Piattaforma Microsoftidentity: per altre informazioni, vedere autenticazione e autorizzazione di base ASP.NETBlazor.
  • Windows: usare l'autenticazione di Windows.

BlazorIdentity Interfaccia utente (singoli account)

Blazor supporta la generazione di un'interfaccia utente completa Blazorbasata su Identity quando si sceglie l'opzione di autenticazione per singoli account.

Il Blazor Web App codice dello scaffolding del Identity modello per un database di SQL Server. La versione della riga di comando usa SQLite e include un database SQLite per Identity.

Il modello:

  • Supporta scenari di rendering interattivo lato server (SSR interattivo) e di rendering lato client con utenti autenticati.
  • Aggiunge IdentityRazor componenti e logica correlata per le attività di autenticazione di routine, ad esempio l'accesso e l'uscita degli utenti. I Identity componenti supportano anche funzionalità avanzate Identity , ad esempio la conferma dell'account e il ripristino delle password e l'autenticazione a più fattori usando un'app di terze parti. Si noti che i componenti stessi non supportano l'interattività Identity .
  • Aggiunge i Identitypacchetti e le dipendenze correlati a .
  • Fa riferimento ai Identity pacchetti in _Imports.razor.
  • Crea una classe utente Identity personalizzata (ApplicationUser).
  • Crea e registra un EF Core contesto di database (ApplicationDbContext).
  • Configura il routing per gli endpoint predefiniti Identity .
  • Include Identity la convalida e la logica di business.

Per esaminare i componenti del framework, accedervi nelle cartelle e della cartella nel modello di progetto (origine di riferimento).To inspect the framework's Identity components, access them in the Pages and Shared folders of the Account folder in the Blazor Web App project template (reference source).Blazor

Quando si scelgono le modalità di rendering Interattivo WebAssembly o Interactive Auto, il server gestisce tutte le richieste di autenticazione e autorizzazione e i Identity componenti vengono visualizzati in modo statico sul server nel Blazor Web Appprogetto principale.

Il framework fornisce un oggetto personalizzato AuthenticationStateProvider nei progetti server e client (.Client) per il flusso dello stato di autenticazione dell'utente nel browser. Il progetto server chiama AddAuthenticationStateSerialization, mentre il progetto client chiama AddAuthenticationStateDeserialization. L'autenticazione nel server anziché nel client consente all'app di accedere allo stato di autenticazione durante la pre-esecuzione e prima dell'inizializzazione del runtime WebAssembly .NET. Le implementazioni personalizzate AuthenticationStateProvider usano il servizio Stato componente persistente (PersistentComponentState) per serializzare lo stato di autenticazione nei commenti HTML e quindi leggerlo di nuovo da WebAssembly per creare una nuova AuthenticationState istanza. Per altre informazioni, vedere la sezione Gestire lo stato di autenticazione in Blazor Web Apps .

Solo per le soluzioni Interactive Server, IdentityRevalidatingAuthenticationStateProvider (origine di riferimento) è un lato AuthenticationStateProvider server che riconvalida il timbro di sicurezza per l'utente connesso ogni 30 minuti viene connesso un circuito interattivo.

Quando si scelgono le modalità di rendering Interattivo WebAssembly o Interactive Auto, il server gestisce tutte le richieste di autenticazione e autorizzazione e i Identity componenti vengono visualizzati in modo statico sul server nel Blazor Web Appprogetto principale. Il modello di progetto include una PersistentAuthenticationStateProvider classe (origine di riferimento) nel .Client progetto per sincronizzare lo stato di autenticazione dell'utente tra il server e il browser. La classe è un'implementazione personalizzata di AuthenticationStateProvider. Il provider usa il servizio Stato componente persistente (PersistentComponentState) per prerendere lo stato di autenticazione e salvarlo in modo permanente nella pagina.

Nel progetto principale di un , Blazor Web Appil provider di stato di autenticazione è denominato IdentityRevalidatingAuthenticationStateProvider (origine di riferimento) (solo soluzioni di interattività server) o PersistingRevalidatingAuthenticationStateProvider (origine riferimento) (WebAssembly o soluzioni di interattività automatica).

BlazorIdentity dipende dalle DbContext istanze non create da una factory, che è intenzionale perché DbContext è sufficiente per il rendering statico dei componenti del modello di Identity progetto senza supportare l'interattività.

Per una descrizione del modo in cui le modalità di rendering interattive globali vengono applicate aIdentity componenti diversi dall'applicazione contemporaneamente di SSR statico per i Identity componenti, vedere ASP.NET modalità di rendering coreBlazor.

Per altre informazioni sulla persistenza dello stato prerenderato, vedere Prerender ASP.NET Componenti principaliRazor.

Nota

I collegamenti della documentazione all'origine del riferimento .NET in genere caricano il ramo predefinito del repository, che rappresenta lo sviluppo corrente per la versione successiva di .NET. Per selezionare un tag per una versione specifica, usare l'elenco a discesa Switch branches or tags. Per altre informazioni, vedere How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205) (Come selezionare un tag di versione del codice sorgente di ASP.NET - dotnet/AspNetCore.Docs #26205).

Gestire lo stato di autenticazione in Blazor Web Apps

Questa sezione si applica agli Blazor Web Appelementi che adottano:

  • Singoli account
  • Rendering lato client (CSR, interattività basata su WebAssembly).

Un provider di stato di autenticazione lato client viene usato solo all'interno Blazor di e non è integrato con il sistema di autenticazione ASP.NET Core. Durante la pre-esecuzione, Blazor rispetta i metadati definiti nella pagina e usa il sistema di autenticazione ASP.NET Core per determinare se l'utente è autenticato. Quando un utente passa da una pagina a un'altra, viene usato un provider di autenticazione lato client. Quando l'utente aggiorna la pagina (ricaricamento a pagina intera), il provider di stato di autenticazione lato client non è coinvolto nella decisione di autenticazione sul server. Poiché lo stato dell'utente non è persistente dal server, qualsiasi stato di autenticazione gestito sul lato client viene perso.

Per risolvere questo problema, l'approccio migliore consiste nell'eseguire l'autenticazione all'interno del sistema di autenticazione principale ASP.NET. Il provider di stato di autenticazione lato client si occupa solo di riflettere lo stato di autenticazione dell'utente. Gli esempi di come eseguire questa operazione con i provider di stato di autenticazione sono illustrati dal Blazor Web App modello di progetto e descritti di seguito.

Nel file del Program progetto server chiamare AddAuthenticationStateSerialization, che serializza l'oggetto AuthenticationState restituito dal lato AuthenticationStateProvider server usando il servizio Stato componente persistente (PersistentComponentState):

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

L'API serializza solo il nome lato server e le attestazioni del ruolo per l'accesso nel browser. Per includere tutte le attestazioni, impostare su SerializeAllClaims true nella chiamata sul lato server a AddAuthenticationStateSerialization:

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

Nel file del progetto client (.Client) chiamare AddAuthenticationStateDeserialization, che aggiunge un oggetto AuthenticationStateProvider in cui AuthenticationState viene deserializzato dal server tramite AuthenticationStateData e il servizio Stato componente persistente (PersistentComponentState).Program Deve essere presente una chiamata corrispondente a AddAuthenticationStateSerialization nel progetto server.

builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();
  • PersistingRevalidatingAuthenticationStateProvider (origine di riferimento): per Blazor Web Apps che adottano il rendering interattivo lato server (SSR interattivo) e il rendering lato client (CSR). Si tratta di un lato AuthenticationStateProvider server che riconvalida il timbro di sicurezza per l'utente connesso ogni 30 minuti che un circuito interattivo è connesso. Usa anche il servizio Stato componente persistente per eseguire il flusso dello stato di autenticazione al client, che viene quindi corretto per la durata della richiesta di firma del certificato.

  • PersistingServerAuthenticationStateProvider (origine di riferimento): per Blazor Web Apps che adotta solo CSR. Si tratta di un lato AuthenticationStateProvider server che usa il servizio Stato componente persistente per trasferire lo stato di autenticazione al client, che viene quindi risolto per la durata della richiesta di firma del certificato.

  • PersistentAuthenticationStateProvider (origine di riferimento): per Blazor Web Appl'adozione di CSR. Si tratta di un lato AuthenticationStateProvider client che determina lo stato di autenticazione dell'utente cercando i dati salvati in modo permanente nella pagina quando è stato eseguito il rendering nel server. Questo stato di autenticazione è fisso per la durata della richiesta di firma del certificato. Se l'utente deve accedere o disconnettersi, è necessario ricaricare a pagina intera. Questo fornisce solo un nome utente e un messaggio di posta elettronica a scopo di visualizzazione. Non include token che eseguono l'autenticazione al server quando effettuano richieste successive, che vengono gestite separatamente usando un cookie oggetto incluso nelle HttpClient richieste al server.

Nota

I collegamenti della documentazione all'origine del riferimento .NET in genere caricano il ramo predefinito del repository, che rappresenta lo sviluppo corrente per la versione successiva di .NET. Per selezionare un tag per una versione specifica, usare l'elenco a discesa Switch branches or tags. Per altre informazioni, vedere How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205) (Come selezionare un tag di versione del codice sorgente di ASP.NET - dotnet/AspNetCore.Docs #26205).

Eseguire lo scaffolding di Identity

Per altre informazioni sullo scaffolding Identity in un'app lato Blazor server, vedere Scaffolding Identity nei progetti ASP.NET Core.

Eseguire lo scaffolding Identity in un'app lato Blazor server:

Attestazioni e token aggiuntivi da provider esterni

Per archiviare attestazioni aggiuntive da provider esterni, vedere Rendere persistenti attestazioni e token aggiuntivi da provider esterni in ASP.NET Core.

Servizio app di Azure in Linux con Identity Server

Specificare l'autorità emittente in modo esplicito durante la distribuzione in Servizio app di Azure in Linux con Identity Server. Per altre informazioni, vedere Usare Identity per proteggere un back-end dell'API Web per le applicazioni a pagina singola.

AuthenticationStateProvider Inserimento per i servizi con ambito a un componente

Non tentare di risolvere AuthenticationStateProvider all'interno di un ambito personalizzato perché comporta la creazione di una nuova istanza di AuthenticationStateProvider che non è inizializzata correttamente.

Per accedere all'oggetto AuthenticationStateProvider all'interno di un servizio con ambito a un componente, inserire AuthenticationStateProvider con la@inject direttiva o l'attributo [Inject] e passarlo al servizio come parametro. Questo approccio garantisce che venga usata l'istanza corretta e inizializzata di per ogni istanza dell'app AuthenticationStateProvider utente.

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.";
        }
    }
}

Registrare il servizio come ambito. In un'app lato Blazor server, i servizi con ambito hanno una durata uguale alla durata del circuito di connessione client.

Nel file Program:

builder.Services.AddScoped<ExampleService>();

In Startup.ConfigureServices di Startup.cs:

services.AddScoped<ExampleService>();

Nel componente InjectAuthStateProvider seguente:

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

Per altre informazioni, vedere le indicazioni su OwningComponentBase in ASP.NET Blazor core dependency injection.

Visualizzazione di contenuto non autorizzato durante la pre-gestione con un oggetto personalizzato AuthenticationStateProvider

Per evitare di visualizzare contenuto non autorizzato, ad esempio contenuto in un componente, durante la pre-gestione con un oggetto personalizzatoAuthenticationStateProvider, adottare uno degli approcci seguenti:AuthorizeView

  • Disabilita prerendering: indicare la modalità di rendering con il prerender parametro impostato su false al componente di livello più alto nella gerarchia dei componenti dell'app che non è un componente radice.

    Nota

    Rendere interattivo un componente radice, ad esempio il App componente, non è supportato. Di conseguenza, il prerendering non può essere disabilitato direttamente dal App componente.

    Per le app basate sul modello di Blazor Web App progetto, il prerendering viene in genere disabilitato in cui il Routes componente viene usato nel App componente (Components/App.razor) :

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

    Disabilitare anche la prerendering per il HeadOutlet componente:

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

    È anche possibile controllare in modo selettivo la modalità di rendering applicata all'istanza del Routes componente. Ad esempio, vedere ASP.NET modalità di rendering coreBlazor.

  • Disabilita prerendering: aprire il _Host.cshtml file e modificare l'attributo dell'helper render-mode tag del componente in :Server

    <component type="typeof(App)" render-mode="Server" />
    
  • Autenticare l'utente nel server prima dell'avvio dell'app: per adottare questo approccio, l'app deve rispondere alla richiesta iniziale di un utente con la pagina o la Identityvisualizzazione di accesso basata su e impedire le richieste agli endpoint fino a Blazor quando non vengono autenticate. Per altre informazioni, vedere Creare un'app ASP.NET Core con i dati utente protetti dall'autorizzazione. Dopo l'autenticazione, il contenuto non autorizzato nei componenti prerenderati Razor viene visualizzato solo quando l'utente non è realmente autorizzato a visualizzare il contenuto.

Gestione dello stato utente

Nonostante la parola "state" nel nome, AuthenticationStateProvider non è per l'archiviazione dello stato utente generale. AuthenticationStateProvider indica solo lo stato di autenticazione dell'utente all'app, se hanno eseguito l'accesso all'app e chi ha eseguito l'accesso.

L'autenticazione usa la stessa autenticazione ASP.NET Core Identity delle Razor app Pages e MVC. Lo stato utente archiviato per i flussi ASP.NET Core Identity a Blazor senza aggiungere codice aggiuntivo all'app. Seguire le indicazioni riportate negli articoli e nelle esercitazioni di base di ASP.NET Identity per rendere effettive le Identity funzionalità nelle Blazor parti dell'app.

Per indicazioni sulla gestione generale dello stato all'esterno di ASP.NET CoreIdentity, vedere ASP.NET Gestione dello stato coreBlazor.

Provider di stato di autenticazione aggiuntivi

Due classi aggiuntive derivate dalla AuthenticationStateProvider Guida per la gestione dello stato di autenticazione nel server:

Nota

I collegamenti della documentazione all'origine del riferimento .NET in genere caricano il ramo predefinito del repository, che rappresenta lo sviluppo corrente per la versione successiva di .NET. Per selezionare un tag per una versione specifica, usare l'elenco a discesa Switch branches or tags. Per altre informazioni, vedere How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205) (Come selezionare un tag di versione del codice sorgente di ASP.NET - dotnet/AspNetCore.Docs #26205).

Gestione dello stato di autenticazione alla disconnessa

Il lato Blazor server mantiene lo stato di autenticazione utente per la durata del circuito, incluse le schede del browser. Per disconnettere in modo proattivo un utente tra le schede del browser quando l'utente si disconnette in una scheda, è necessario implementare un'origine RevalidatingServerAuthenticationStateProviderdi riferimento con un breve RevalidationInterval.

Nota

I collegamenti della documentazione all'origine del riferimento .NET in genere caricano il ramo predefinito del repository, che rappresenta lo sviluppo corrente per la versione successiva di .NET. Per selezionare un tag per una versione specifica, usare l'elenco a discesa Switch branches or tags. Per altre informazioni, vedere How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205) (Come selezionare un tag di versione del codice sorgente di ASP.NET - dotnet/AspNetCore.Docs #26205).

Durata della validità dell'URL di reindirizzamento temporaneo

Questa sezione si applica a Blazor Web Apps.

Usare l'opzione RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration per ottenere o impostare la durata di ASP.NET validità di Core Data Protection per gli URL di reindirizzamento temporanei generati dal Blazor rendering lato server. Questi vengono usati solo temporaneamente, quindi la durata deve essere sufficiente per consentire a un client di ricevere l'URL e iniziare a spostarsi. Tuttavia, dovrebbe anche essere abbastanza lungo per consentire l'asimmetria dell'orologio tra i server. Il valore predefinito è cinque minuti.

Nell'esempio seguente il valore viene esteso a sette minuti:

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

Risorse aggiuntive