Condividi tramite


Nozioni di base sulla sicurezza e supporto di ASP.NET (C#)

di Scott Mitchell

Nota

Poiché questo articolo è stato scritto, i provider di appartenenza ASP.NET sono stati sostituiti da ASP.NET Identity. È consigliabile aggiornare le app per usare ASP.NET Identity Platform anziché i provider di appartenenze presenti al momento della scrittura di questo articolo. ASP.NET Identity offre numerosi vantaggi rispetto al sistema di appartenenza ASP.NET, tra cui :

  • Prestazioni migliori
  • Estendibilità e testbilità migliorate
  • Supporto per OAuth, OpenID Connect e autenticazione a due fattori
  • Supporto delle identità basate sulle attestazioni
  • Migliore interoperabilità con ASP.Net Core

Scarica PDF

Questa è la prima esercitazione di una serie di esercitazioni che esploreranno le tecniche per autenticare i visitatori tramite un modulo Web, autorizzare l'accesso a pagine e funzionalità specifiche e gestire gli account utente in un'applicazione ASP.NET.

Introduzione

Qual è il forum, i siti di e-commerce, i siti di posta elettronica online, i siti web del portale e i siti di social network hanno tutti in comune? Tutti offrono account utente. I siti che offrono account utente devono fornire diversi servizi. Come minimo, i nuovi visitatori devono essere in grado di creare un account e di restituire i visitatori devono essere in grado di accedere. Tali applicazioni Web possono prendere decisioni in base all'utente connesso: alcune pagine o azioni potrebbero essere limitate solo agli utenti connessi o a un determinato subset di utenti; altre pagine possono mostrare informazioni specifiche per l'utente connesso o visualizzare più o meno informazioni, a seconda di ciò che l'utente sta visualizzando la pagina.

Questa è la prima esercitazione di una serie di esercitazioni che esploreranno le tecniche per autenticare i visitatori tramite un modulo Web, autorizzare l'accesso a pagine e funzionalità specifiche e gestire gli account utente in un'applicazione ASP.NET. Nel corso di queste esercitazioni si esaminerà come:

  • Identificare e accedere agli utenti in un sito Web
  • Usare ASP. Framework di appartenenza di NET per gestire gli account utente
  • Creare, aggiornare ed eliminare account utente
  • Limitare l'accesso a una pagina Web, a una directory o a funzionalità specifiche in base all'utente connesso
  • Usare ASP. Framework ruoli di NET per associare gli account utente ai ruoli
  • Gestire i ruoli utente
  • Limitare l'accesso a una pagina Web, a una directory o a funzionalità specifiche in base al ruolo dell'utente connesso
  • Personalizzare ed estendere ASP. Controlli Web di sicurezza di NET

Queste esercitazioni sono concepite per essere concise e fornire istruzioni dettagliate con un sacco di screenshot per illustrare visivamente il processo. Ogni esercitazione è disponibile nelle versioni di C# e Visual Basic e include un download del codice completo usato. Questa prima esercitazione è incentrata sui concetti di sicurezza di un punto di vista generale e pertanto non contiene codice associato.

In questa esercitazione verranno illustrati importanti concetti di sicurezza e quali funzionalità sono disponibili in ASP.NET per facilitare l'implementazione dell'autenticazione dei moduli, dell'autorizzazione, degli account utente e dei ruoli. È ora di iniziare.

Nota

La sicurezza è un aspetto importante di qualsiasi applicazione che si estende su decisioni fisiche, tecnologiche e politiche e richiede un elevato grado di pianificazione e conoscenza del dominio. Questa serie di esercitazioni non è progettata come guida per lo sviluppo di applicazioni Web sicure. È invece incentrato in modo specifico sull'autenticazione dei moduli, l'autorizzazione, gli account utente e i ruoli. Mentre alcuni concetti di sicurezza che ruotano intorno a questi problemi sono discussi in questa serie, altri vengono lasciati inesplorati.

Autenticazione, autorizzazione, account utente e ruoli

L'autenticazione, l'autorizzazione, gli account utente e i ruoli sono quattro termini che verranno usati molto spesso in questa serie di esercitazioni, quindi vorrei dedicare un attimo a definire questi termini nel contesto della sicurezza Web. In un modello client-server, ad esempio Internet, esistono molti scenari in cui il server deve identificare il client che effettua la richiesta. L'autenticazione è il processo di verifica dell'identità del client. Un client identificato correttamente viene indicato come autenticato. Si dice che un client non identificato sia non autenticato o anonimo.

I sistemi di autenticazione sicura prevedono almeno uno dei tre facet seguenti: qualcosa che si conosce, qualcosa che si ha o qualcosa di simile. La maggior parte delle applicazioni Web si basa su qualcosa che il client conosce, ad esempio una password o un PIN. Le informazioni usate per identificare un utente, ad esempio il nome utente e la password, vengono definite credenziali. Questa serie di esercitazioni è incentrata sull'autenticazione basata su moduli, ovvero un modello di autenticazione in cui gli utenti accedono al sito specificando le credenziali in un modulo di pagina Web. Tutti questi tipi di autenticazione sono stati sperimentati in precedenza. Passare a qualsiasi sito di e-commerce. Quando si è pronti per l'estrazione, viene chiesto di accedere immettendo il nome utente e la password nelle caselle di testo in una pagina Web.

Oltre a identificare i client, un server potrebbe dover limitare le risorse o le funzionalità accessibili a seconda del client che effettua la richiesta. L'autorizzazione è il processo di determinazione se un determinato utente ha l'autorità di accedere a una risorsa o a una funzionalità specifica.

Un account utente è un archivio per rendere persistenti le informazioni su un determinato utente. Gli account utente devono includere minimamente informazioni che identificano in modo univoco l'utente, ad esempio il nome di accesso e la password dell'utente. Oltre a queste informazioni essenziali, gli account utente possono includere elementi come: l'indirizzo di posta elettronica dell'utente; data e ora di creazione dell'account; data e ora dell'ultimo accesso; nome e cognome; numero di telefono; e indirizzo postale. Quando si usa l'autenticazione basata su form, le informazioni sull'account utente vengono in genere archiviate in un database relazionale come Microsoft SQL Server.

Le applicazioni Web che supportano gli account utente possono facoltativamente raggruppare gli utenti in ruoli. Un ruolo è semplicemente un'etichetta applicata a un utente e fornisce un'astrazione per definire regole di autorizzazione e funzionalità a livello di pagina. Ad esempio, un sito Web può includere un ruolo di amministratore con regole di autorizzazione che impediscono a chiunque ma un amministratore di accedere a un determinato set di pagine Web. Inoltre, un'ampia gamma di pagine accessibili a tutti gli utenti (inclusi gli utenti non amministratori) potrebbero visualizzare dati aggiuntivi o offrire funzionalità aggiuntive quando vengono visitate dagli utenti nel ruolo Amministratori. Usando i ruoli, è possibile definire queste regole di autorizzazione in base al ruolo anziché all'utente per utente.

Autenticazione degli utenti in un'applicazione ASP.NET

Quando un utente immette un URL nella finestra dell'indirizzo del browser o fa clic su un collegamento, il browser effettua una richiesta HTTP (Hypertext Transfer Protocol) al server Web per il contenuto specificato, che sia una pagina ASP.NET, un'immagine, un file JavaScript o qualsiasi altro tipo di contenuto. Il server Web ha l'incarico di restituire il contenuto richiesto. In questo modo, deve determinare una serie di elementi sulla richiesta, tra cui chi ha effettuato la richiesta e se l'identità è autorizzata a recuperare il contenuto richiesto.

Per impostazione predefinita, i browser inviano richieste HTTP che non dispongono di qualsiasi tipo di informazioni di identificazione. Tuttavia, se il browser include informazioni di autenticazione, il server Web avvia il flusso di lavoro di autenticazione, che tenta di identificare il client che effettua la richiesta. I passaggi del flusso di lavoro di autenticazione dipendono dal tipo di autenticazione usato dall'applicazione Web. ASP.NET supporta tre tipi di autenticazione: Windows, Passport e moduli. Questa serie di esercitazioni è incentrata sull'autenticazione basata su moduli, ma è necessario un minuto per confrontare e confrontare autenticazione di Windows archivi utente e flusso di lavoro.

Autenticazione tramite autenticazione di Windows

Il flusso di lavoro autenticazione di Windows usa una delle tecniche di autenticazione seguenti:

  • Autenticazione di base
  • Autenticazione del digest
  • Autenticazione integrata di Windows

Tutte e tre le tecniche funzionano approssimativamente allo stesso modo: quando arriva una richiesta anonima non autorizzata, il server Web invia una risposta HTTP che indica che è necessaria l'autorizzazione per continuare. Il browser visualizza quindi una finestra di dialogo modale che richiede all'utente il nome utente e la password (vedere la figura 1). Queste informazioni vengono quindi inviate al server Web tramite un'intestazione HTTP.

Una finestra di dialogo modale richiede all'utente le credenziali

Figura 1: Una finestra di dialogo modale richiede all'utente le credenziali

Le credenziali specificate vengono convalidate rispetto a Windows User Store del server Web. Ciò significa che ogni utente autenticato nell'applicazione Web deve avere un account di Windows nell'organizzazione. Questo è un caso comune negli scenari Intranet. Infatti, quando si usa l'autenticazione integrata di Windows in un'impostazione Intranet, il browser fornisce automaticamente al server Web le credenziali usate per accedere alla rete, eliminando così la finestra di dialogo illustrata nella figura 1. Anche se autenticazione di Windows è ideale per le applicazioni Intranet, in genere non è possibile per le applicazioni Internet poiché non si vogliono creare account di Windows per ogni utente che si iscrive al sito.

Autenticazione tramite autenticazione basata su form

L'autenticazione basata su form, invece, è ideale per le applicazioni Web Internet. Tenere presente che l'autenticazione basata su form identifica l'utente richiedendo di immettere le credenziali tramite un modulo Web. Di conseguenza, quando un utente tenta di accedere a una risorsa non autorizzata, viene reindirizzato automaticamente alla pagina di accesso in cui è possibile immettere le credenziali. Le credenziali inviate vengono quindi convalidate in base a un archivio utenti personalizzato, in genere un database.

Dopo aver verificato le credenziali inviate, viene creato un ticket di autenticazione basata su form per l'utente. Questo ticket indica che l'utente è stato autenticato e include informazioni di identificazione, ad esempio il nome utente. Il ticket di autenticazione basata su form viene in genere archiviato come cookie nel computer client. Pertanto, le visite successive al sito Web includono il ticket di autenticazione dei moduli nella richiesta HTTP, consentendo all'applicazione Web di identificare l'utente dopo aver eseguito l'accesso.

La figura 2 illustra il flusso di lavoro di autenticazione basata su form da un punto di osservazione generale. Si noti che le parti di autenticazione e autorizzazione in ASP.NET fungono da due entità separate. Il sistema di autenticazione basata su form identifica l'utente (o segnala che sono anonimi). Il sistema di autorizzazione determina se l'utente ha accesso alla risorsa richiesta. Se l'utente non è autorizzato (come nella figura 2 quando si tenta di visitare in modo anonimo ProtectedPage.aspx), il sistema di autorizzazione segnala che l'utente viene negato, causando il reindirizzamento automatico dell'utente alla pagina di accesso.

Dopo che l'utente ha eseguito l'accesso, le successive richieste HTTP includono il ticket di autenticazione basata su form. Il sistema di autenticazione basata su form identifica semplicemente l'utente, ovvero il sistema di autorizzazione che determina se l'utente può accedere alla risorsa richiesta.

Flusso di lavoro di autenticazione basata su form

Figura 2: Flusso di lavoro di autenticazione basata su form

L'autenticazione basata su moduli verrà descritta in modo più dettagliato nell'esercitazione successiva, Panoramica dell'autenticazione basata su moduli. Per altre informazioni su ASP. Le opzioni di autenticazione di NET, vedere autenticazione ASP.NET.

Limitazione dell'accesso a pagine Web, directory e funzionalità di pagina

ASP.NET include due modi per determinare se un determinato utente dispone dell'autorità per accedere a un file o una directory specifica:

  • Autorizzazione file: poiché ASP.NET pagine e servizi Web vengono implementati come file che risiedono nel file system del server Web, è possibile specificare l'accesso a questi file tramite elenchi di Controllo di accesso (ACL). L'autorizzazione file viene usata più comunemente con autenticazione di Windows perché gli elenchi di controllo di accesso sono autorizzazioni che si applicano agli account di Windows. Quando si usa l'autenticazione basata su moduli, tutte le richieste a livello di sistema operativo e file system vengono eseguite dallo stesso account di Windows, indipendentemente dall'utente che visita il sito.
  • Autorizzazione URL: con autorizzazione URL, lo sviluppatore della pagina specifica le regole di autorizzazione in Web.config. Queste regole di autorizzazione specificano quali utenti o ruoli sono autorizzati ad accedere o non possono accedere a determinate pagine o directory nell'applicazione.

L'autorizzazione dei file e l'autorizzazione URL definiscono le regole di autorizzazione per l'accesso a una determinata pagina di ASP.NET o per tutte le pagine ASP.NET in una determinata directory. Usando queste tecniche è possibile indicare ASP.NET negare le richieste a una determinata pagina per un determinato utente o consentire l'accesso a un set di utenti e negare l'accesso a tutti gli altri utenti. Quali sono gli scenari in cui tutti gli utenti possono accedere alla pagina, ma la funzionalità della pagina dipende dall'utente? Ad esempio, molti siti che supportano gli account utente hanno pagine che visualizzano contenuti o dati diversi per gli utenti autenticati rispetto agli utenti anonimi. Un utente anonimo potrebbe visualizzare un collegamento per accedere al sito, mentre un utente autenticato visualizzerebbe invece un messaggio come Welcome back, Username (Nome utente ) insieme a un collegamento per disconnettersi. Un altro esempio: quando si visualizza un articolo in un sito di aste si vedono informazioni diverse a seconda che si sia un bidder o l'asta dell'articolo.

Tali regolazioni a livello di pagina possono essere eseguite in modo dichiarativo o a livello di codice. Per mostrare contenuto diverso per gli utenti anonimi rispetto agli utenti autenticati, è sufficiente trascinare un controllo LoginView nella pagina e immettere il contenuto appropriato nei modelli AnonymousTemplate e LoggedInTemplate. In alternativa, è possibile determinare a livello di codice se la richiesta corrente è autenticata, chi è l'utente e quali ruoli appartengono (se presenti). È possibile usare queste informazioni per visualizzare o nascondere le colonne in una griglia o pannelli nella pagina.

Questa serie include tre esercitazioni incentrate sull'autorizzazione. L'autorizzazionebasata sull'utente esamina come limitare l'accesso a una pagina o a pagine in una directory per account utente specifici; L'autorizzazione basata sui ruoli esamina la fornitura di regole di autorizzazione a livello di ruolo. Infine, l'esercitazione Visualizzazione del contenuto in base all'utente attualmente connesso esplora la modifica del contenuto e delle funzionalità di una determinata pagina in base all'utente che visita la pagina. Per altre informazioni su ASP. Le opzioni di autorizzazione di NET, vedere autorizzazione ASP.NET.

Account utente e ruoli

ASPIDE. L'autenticazione basata su form di NET fornisce un'infrastruttura per consentire agli utenti di accedere a un sito e di memorizzare lo stato autenticato nelle visite di pagina. L'autorizzazione URL offre un framework per limitare l'accesso a file o cartelle specifici in un'applicazione ASP.NET. Nessuna delle due funzionalità, tuttavia, fornisce un mezzo per l'archiviazione delle informazioni sull'account utente o la gestione dei ruoli.

Prima di ASP.NET 2.0, gli sviluppatori erano responsabili della creazione dei propri archivi utenti e ruoli. Erano anche sul gancio per progettare le interfacce utente e scrivere il codice per le pagine essenziali correlate all'account utente, come la pagina di accesso e la pagina per creare un nuovo account, tra gli altri. Senza un framework di account utente predefinito in ASP.NET, ogni sviluppatore che implementa gli account utente deve arrivare alle proprie decisioni di progettazione su domande come, Ricerca per categorie archiviare le password o altre informazioni riservate? e Quali linee guida è necessario imporre per quanto riguarda la lunghezza e la forza delle password?

Attualmente, l'implementazione di account utente in un'applicazione ASP.NET è molto più semplice grazie al framework di appartenenza e ai controlli Web di accesso predefiniti. Il framework di appartenenza è una manciata di classi nello spazio dei nomi System.Web.Security che forniscono funzionalità per l'esecuzione di attività essenziali correlate all'account utente. La classe chiave nel framework Membership è la classe Membership, che include metodi come:

  • CreateUser
  • DeleteUser
  • GetAllUsers
  • GetUser
  • UpdateUser
  • ValidateUser

Il framework di appartenenza usa il modello di provider, che separa in modo pulito l'API del framework di appartenenza dalla relativa implementazione. Ciò consente agli sviluppatori di usare un'API comune, ma consente loro di usare un'implementazione che soddisfi le esigenze personalizzate dell'applicazione. In breve, la classe Membership definisce la funzionalità essenziale del framework (i metodi, le proprietà e gli eventi), ma non fornisce effettivamente dettagli di implementazione. Al contrario, i metodi della classe Membership richiamano il provider configurato, ovvero ciò che esegue il lavoro effettivo. Ad esempio, quando viene richiamato il metodo CreateUser della classe Membership, la classe Membership non conosce i dettagli dell'archivio utenti. Non sa se gli utenti vengono mantenuti in un database o in un file XML o in un altro archivio. La classe Membership esamina la configurazione dell'applicazione Web per determinare il provider a cui delegare la chiamata e tale classe del provider è responsabile della creazione effettiva del nuovo account utente nell'archivio utenti appropriato. Questa interazione è illustrata nella figura 3.

Microsoft offre due classi di provider di appartenenze in .NET Framework:

Questa serie di esercitazioni è incentrata esclusivamente su SqlMembershipProvider.

Il modello di provider consente di collegare facilmente diverse implementazioni al framework</sicuro>

Figura 03: Il modello di provider consente di collegare facilmente diverse implementazioni al framework (fare clic per visualizzare l'immagine a dimensione intera)

Il vantaggio del modello di provider è che le implementazioni alternative possono essere sviluppate da Microsoft, fornitori di terze parti o singoli sviluppatori e collegati facilmente al framework di appartenenza. Ad esempio, Microsoft ha rilasciato un provider di appartenenze per i database di Microsoft Access. Per altre informazioni sui provider di appartenenze, vedere Provider Toolkit, che include una procedura dettagliata dei provider di appartenenza, provider personalizzati di esempio, oltre 100 pagine di documentazione sul modello di provider e il codice sorgente completo per i provider di appartenenze predefiniti (vale a dire ActiveDirectoryMembershipProvider e SqlMembershipProvider).

ASP.NET 2.0 ha introdotto anche il framework Ruoli. Analogamente al framework di appartenenza, il framework Ruoli viene creato in cima al modello di provider. L'API viene esposta tramite la classe Roles e .NET Framework viene fornita con tre classi di provider:

  • AuthorizationStoreRoleProvider : gestisce le informazioni sui ruoli in un archivio criteri di gestione autorizzazioni, ad esempio Active Directory o ADAM.
  • SqlRoleProvider : implementa i ruoli in un database di SQL Server.
  • WindowsTokenRoleProvider : associa le informazioni sul ruolo in base al gruppo di Windows del visitatore. Questo metodo viene in genere usato con autenticazione di Windows.

Questa serie di esercitazioni è incentrata esclusivamente su SqlRoleProvider.

Poiché il modello di provider include una singola API con inoltro (le classi Membership and Roles), è possibile creare funzionalità relative all'API senza doversi preoccupare dei dettagli di implementazione, ovvero gestiti dai provider selezionati dallo sviluppatore di pagine. Questa API unificata consente ai fornitori Microsoft e di terze parti di creare controlli Web che si interfacciano con i framework di appartenenza e ruoli. ASP.NET viene fornito con diversi controlli Web di accesso per l'implementazione di interfacce utente comuni dell'account utente. Ad esempio, il controllo Account di accesso richiede a un utente le proprie credenziali, le convalida e quindi le registra tramite l'autenticazione basata su form. Il controllo LoginView offre modelli per la visualizzazione di markup diversi per utenti anonimi rispetto a utenti autenticati o markup diversi in base al ruolo dell'utente. Il controllo CreateUserWizard fornisce un'interfaccia utente dettagliata per la creazione di un nuovo account utente.

Sotto vengono illustrati i vari controlli di accesso che interagiscono con i framework appartenenza e ruoli. La maggior parte dei controlli di accesso può essere implementata senza dover scrivere una singola riga di codice. Questi controlli verranno esaminati in modo più dettagliato nelle esercitazioni future, incluse le tecniche per estendere e personalizzare le funzionalità.

Riepilogo

Tutte le applicazioni Web che supportano gli account utente richiedono funzionalità simili, ad esempio: la possibilità per gli utenti di accedere e avere lo stato di accesso memorizzato tra le visite alle pagine; una pagina Web che consente ai nuovi visitatori di creare un account; e la possibilità per lo sviluppatore della pagina di specificare quali risorse, dati e funzionalità sono disponibili per quali utenti o ruoli. Le attività di autenticazione e autorizzazione degli utenti e della gestione di account utente e ruoli sono notevolmente facili da eseguire in ASP.NET applicazioni grazie all'autenticazione basata su moduli, all'autorizzazione degli URL e ai framework di appartenenza e ruoli.

Nel corso delle prossime esercitazioni verranno esaminati questi aspetti creando un'applicazione Web funzionante fin dall'inizio in modo dettagliato. Nelle due esercitazioni successive verrà esaminata in dettaglio l'autenticazione basata su moduli. Verrà visualizzato il flusso di lavoro di autenticazione basata su form in azione, si esaminerà il ticket di autenticazione basata su form, verranno illustrati i problemi di sicurezza e verrà illustrato come configurare il sistema di autenticazione basata su moduli, tutto durante la creazione di un'applicazione Web che consente ai visitatori di accedere e disconnettersi.

Buon programmatori!

Altre informazioni

Per altre informazioni sugli argomenti illustrati in questa esercitazione, vedere le risorse seguenti:

Informazioni sull'autore

Scott Mitchell, autore di sette libri ASP/ASP.NET e fondatore di 4GuysFromRolla.com, ha lavorato con le tecnologie Web Microsoft dal 1998. Scott lavora come consulente indipendente, formatore e scrittore. Il suo ultimo libro è Sams Teach Yourself ASP.NET 2.0 in 24 ore. Può essere raggiunto all'indirizzo mitchell@4GuysFromRolla.com. o tramite il suo blog, che può essere trovato all'indirizzo http://ScottOnWriting.NET.

Grazie speciale a

Questa serie di esercitazioni è stata esaminata da molti revisori utili. Il revisore principale per questa esercitazione è stato esaminato da molti revisori utili. I revisori potenziali per questa esercitazione includono Alicja Maziarz, John Suru e Teresa Murphy. Si è interessati a esaminare i prossimi articoli MSDN? In tal caso, rilasciarmi una riga in mitchell@4GuysFromRolla.com.