Nozioni di base sulla sicurezza e supporto di ASP.NET (C#)
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
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.
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 dei moduli 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 si trova 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 sistema di autenticazione dei moduli per reindirizzare automaticamente l'utente alla pagina di accesso.
Dopo aver eseguito l'accesso, le richieste HTTP successive includono il ticket di autenticazione dei moduli. Il sistema di autenticazione dei moduli identifica semplicemente l'utente: è il sistema di autorizzazione che determina se l'utente può accedere alla risorsa richiesta.
Figura 2: Flusso di lavoro di autenticazione form
L'autenticazione dei moduli verrà inserita in dettaglio molto più dettagliata nell'esercitazione successiva, Panoramica dell'autenticazione dei moduli. Per altre informazioni su ASP. Opzioni di autenticazione di NET, vedere autenticazione ASP.NET.
Limitazione dell'accesso alle pagine Web, alle directory e alle funzionalità della pagina
ASP.NET include due modi per determinare se un determinato utente ha l'autorità per accedere a un file o una directory specifici:
- 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 dei file è più comunemente usata con autenticazione di Windows perché gli elenchi di controllo di accesso sono autorizzazioni che si applicano agli account Windows. Quando si usa l'autenticazione dei moduli, tutte le richieste a livello di sistema operativo e file system vengono eseguite dallo stesso account Windows, indipendentemente dall'utente che visita il sito.
- Autorizzazione URL: con autorizzazione URL, lo sviluppatore di pagina specifica le regole di autorizzazione in Web.config. Queste regole di autorizzazione specificano quali utenti o ruoli possono accedere o non 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 ASP.NET o per tutte le pagine di 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 dispongono di 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, Benvenuto, Nome utente insieme a un collegamento per disconnettersi. Un altro esempio: quando si visualizza un elemento in un sito di aste vengono visualizzate informazioni diverse a seconda che si tratti di un offerta o di un'asta dell'elemento.
Tali modifiche a livello di pagina possono essere eseguite in modo dichiarativo o a livello di codice. Per visualizzare contenuti diversi per utenti anonimi rispetto agli utenti autenticati, trascinare semplicemente 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 viene autenticata, chi è l'utente e quali ruoli appartengono a (se presente). È possibile usare queste informazioni per visualizzare o nascondere colonne in una griglia o pannelli nella pagina.
Questa serie include tre esercitazioni che si concentrano 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 sul ruolo esamina la fornitura di regole di autorizzazione a livello di ruolo; infine, l'esercitazione Visualizzazione contenuto basato sull'utente attualmente connesso esplora la modifica del contenuto e della 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 dei moduli di NET fornisce un'infrastruttura per gli utenti che accedono a un sito e hanno lo stato autenticato ricordato tra le visite di pagina. E l'autorizzazione URL offre un framework per limitare l'accesso a file o cartelle specifici in un'applicazione ASP.NET. Nessuna funzionalità, tuttavia, fornisce un mezzo per archiviare le informazioni sull'account utente o gestire i ruoli.
Prima di ASP.NET 2.0, gli sviluppatori erano responsabili della creazione di archivi utenti e ruoli personalizzati. Sono stati anche sul hook 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 alcun 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 devono imporre per quanto riguarda la lunghezza e la forza della password?
Oggi, l'implementazione degli 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 relative 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 del provider, che separa in modo pulito l'API del framework di appartenenza dall'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 in realtà non fornisce alcun dettagli di implementazione. I metodi della classe Membership richiamano invece 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 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 appartenenza in .NET Framework:
- ActiveDirectoryMembershipProvider : implementa l'API Di appartenenza nei server Active Directory e Active Directory Application Mode (ADAM).
- SqlMembershipProvider: implementa l'API Appartenenza in un database di SQL Server.
Questa serie di esercitazioni si concentra esclusivamente su SqlMembershipProvider.
Figura 03: il modello provider abilita implementazioni diverse da collegare senza problemi al framework (fare clic per visualizzare l'immagine a dimensioni complete)
Il vantaggio del modello provider è che le implementazioni alternative possono essere sviluppate da Microsoft, fornitori di terze parti o singoli sviluppatori e collegati senza problemi al framework di appartenenza. Ad esempio, Microsoft ha rilasciato un provider di appartenenza per i database di Microsoft Access. Per altre informazioni sui provider di appartenenza, 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 appartenenza predefiniti (ovvero ActiveDirectoryMembershipProvider e SqlMembershipProvider).
ASP.NET 2.0 ha anche introdotto il framework Ruoli. Analogamente al framework Di appartenenza, il framework Ruoli viene compilato in base al modello del provider. L'API viene esposta tramite la classe Ruoli e .NET Framework viene fornita con tre classi provider:
- AuthorizationStoreRoleProvider: gestisce le informazioni sul ruolo 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 Windows del visitatore. Questo metodo viene in genere usato con autenticazione di Windows.
Questa serie di esercitazioni si concentra esclusivamente su SqlRoleProvider.
Poiché il modello di provider include una singola API con inoltro (le classi Appartenenze e ruoli), è possibile creare funzionalità intorno all'API senza dover preoccuparsi dei dettagli dell'implementazione: questi vengono gestiti dai provider selezionati dallo sviluppatore di 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 un numero di controlli Web di accesso per implementare interfacce utente comuni dell'account utente. Ad esempio, il controllo Login richiede a un utente le proprie credenziali, convalidarle e quindi registrarle tramite l'autenticazione dei moduli. Il controllo LoginView offre modelli per la visualizzazione di markup diversi agli utenti anonimi rispetto agli utenti autenticati o al markup diverso 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 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. Verranno esaminati questi controlli in modo più dettagliato nelle esercitazioni future, incluse le tecniche per estendere e personalizzare la loro 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 di pagina; una pagina Web per i nuovi visitatori per creare un account; e la possibilità per lo sviluppatore di pagine di specificare quali risorse, dati e funzionalità sono disponibili per gli utenti o i 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 dei moduli, all'autorizzazione url e ai framework appartenenza e ruoli.
Nel corso delle prossime esercitazioni verranno esaminati questi aspetti creando un'applicazione Web funzionante in modo dettagliato. Nelle due esercitazioni successive verranno esaminate in dettaglio l'autenticazione dei moduli. Verrà visualizzato il flusso di lavoro di autenticazione dei moduli in azione, si esaminerà il ticket di autenticazione dei moduli, si esamineranno i problemi di sicurezza e si vedrà come configurare il sistema di autenticazione dei moduli, tutto durante la creazione di un'applicazione Web che consente ai visitatori di accedere e disconnettersi.
Programmazione felice!
Altre informazioni
Per altre informazioni sugli argomenti illustrati in questa esercitazione, vedere le risorse seguenti:
- ASP.NET 2.0 appartenenza, ruoli, autenticazione moduli e risorse di sicurezza
- Linee guida per la sicurezza ASP.NET 2.0
- Autenticazione ASP.NET
- autorizzazione ASP.NET
- Panoramica dei controlli di accesso ASP.NET
- Esame dell'appartenenza, dei ruoli e del profilo di ASP.NET 2.0
- Procedura: proteggere il sito usando l'appartenenza e i ruoli? (Video)
- Introduzione all'appartenenza
- centro per sviluppatori sulla sicurezza MSDN
- Professional ASP.NET 2.0 Security, Membership and Role Management (ISBN: 978-0-7645-9698-8)
- Provider Toolkit
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.