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

di Scott Mitchell

Nota

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

  • Prestazioni migliori
  • Miglioramento dell'estendibilità e della testability
  • Supporto per OAuth, OpenID Connect e autenticazione a due fattori
  • Supporto delle identità basate sulle attestazioni
  • Migliore interoperabilità con ASP.Net Core

Scarica il 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

Quali sono i 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? Offrono tutti gli account utente. I siti che offrono account utente devono fornire diversi servizi. Come minimo, i nuovi visitatori devono poter creare un account e restituire i visitatori devono poter 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 potrebbero mostrare informazioni specifiche per l'utente connesso o potrebbero mostrare 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 verranno esaminate le procedure seguenti:

  • Identificare e registrare gli 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 dei ruoli di NET per associare gli account utente ai ruoli
  • Gestire 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 da 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 basata su moduli, autorizzazione, account utente e ruoli. È possibile iniziare subito.

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. Si concentra in particolare sull'autenticazione basata su moduli, autorizzazione, account utente e 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 noto, qualcosa di cui si dispone 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. Vai a qualsiasi sito di e-commerce. Quando si è pronti per eseguire il check-out, viene chiesto di accedere immettendo il nome utente e la password nelle caselle di testo in una pagina Web.

Oltre a identificare i client, potrebbe essere necessario limitare le risorse o le funzionalità accessibili a seconda del client che effettua la richiesta. L'autorizzazione è il processo per determinare se un determinato utente dispone dell'autorità per accedere a una risorsa o funzionalità specifica.

Un account utente è un archivio per rendere persistenti le informazioni su un determinato utente. Gli account utente devono includere informazioni che identificano in modo univoco l'utente, ad esempio il nome di accesso e la password dell'utente. Insieme 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 la definizione di 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 visitati 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, ad esempio 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 relativi alla 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 restituisce 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 fornite vengono convalidate in Base all'Utente Store di Windows del server Web. Ciò significa che ogni utente autenticato nell'applicazione Web deve avere un account di Windows nell'organizzazione. Questo è un problema 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 perché non si vuole creare account di Windows per ogni utente che si iscrive al sito.

Autenticazione tramite autenticazione basata su form

L'autenticazione basata su form, d'altra parte, è ideale per le applicazioni Web Internet. Tenere presente che l'autenticazione basata su form identifica l'utente richiedendo di immettere le proprie 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 utente 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 successive visite al sito Web includono il ticket di autenticazione dei moduli nella richiesta HTTP, consentendo quindi all'applicazione Web di identificare l'utente dopo l'accesso.

La figura 2 illustra il flusso di lavoro di autenticazione basata su form da un punto di vista generale. Si noti come 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 molto più dettagliato nell'esercitazione successiva, Panoramica dell'autenticazione basata su form. 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 Controllo di accesso Elenchi (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 form, 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 a cui viene negato l'accesso 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 di 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 contenuto 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 simile, Benvenuto, Nome utente insieme a un collegamento per disconnettersi. Un altro esempio: quando si visualizza un articolo in un sito di aste vengono visualizzate informazioni diverse a seconda che si tratti di un'offerta o dell'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 colonne in una griglia o in pannelli nella pagina.

Questa serie include tre esercitazioni incentrate sull'autorizzazione. L'autorizzazione basata sull'utenteesamina 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

ASP. L'autenticazione basata su form di NET fornisce un'infrastruttura che consente agli utenti di accedere a un sito e di avere lo stato autenticato memorizzato nelle visite alle pagine. L'autorizzazione URL offre un framework per limitare l'accesso a file o cartelle specifici in un'applicazione ASP.NET. Nessuna delle due funzionalità fornisce tuttavia 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 relative 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 prendere decisioni di progettazione proprie 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 complessità 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 utente. 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 provider è responsabile della creazione effettiva del nuovo account utente nell'archivio utenti appropriato. Questa interazione è illustrata nella figura 3.

Microsoft offre due classi del 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

Figura 03: Il modello di provider consente a implementazioni diverse di essere collegate facilmente 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, fare riferimento a 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 Roles. Analogamente al framework di appartenenza, il framework Roles 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 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 diretta (le classi Membership and Roles), è possibile creare funzionalità relative a tale API senza doversi preoccupare dei dettagli di implementazione, ovvero quelli gestiti dai provider selezionati dallo sviluppatore della pagina. Questa API unificata consente ai fornitori microsoft e di terze parti di creare controlli Web che si interfacciano con i framework 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 agli utenti anonimi rispetto agli 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.

Di seguito sono 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 di avere lo stato di accesso memorizzato nelle visite di pagina; una pagina Web che consente ai nuovi visitatori di creare un account; e la possibilità per lo sviluppatore di pagine 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 degli account utente e dei ruoli sono notevolmente facili da eseguire nelle applicazioni ASP.NET 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 da zero 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, si esaminerà il ticket di autenticazione dei moduli, si esamineranno i problemi di sicurezza e si vedrà come configurare il sistema di autenticazione basata su form, 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 descritti in questa esercitazione, vedere le risorse seguenti:

Informazioni sull'autore

Scott Mitchell, autore di sette libri ASP/ASP.NET e fondatore di 4GuysFromRolla.com, lavora 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, disponibile all'indirizzo http://ScottOnWriting.NET.

Grazie speciale a

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