Modulo 8 - Protezione di ASP.NET

In questa pagina
Argomenti del moduloArgomenti del modulo
ObiettiviObiettivi
Ambito di applicazioneAmbito di applicazione
Utilizzo del moduloUtilizzo del modulo
Architettura della protezione di ASP.NETArchitettura della protezione di ASP.NET
Strategie di autenticazione e autorizzazioneStrategie di autenticazione e autorizzazione
Configurazione della protezioneConfigurazione della protezione
Programmazione della protezioneProgrammazione della protezione
Autenticazione di WindowsAutenticazione di Windows
Autenticazione basata su moduliAutenticazione basata su moduli
Autenticazione PassportAutenticazione Passport
Autenticazione personalizzataAutenticazione personalizzata
Identità del processo per ASP.NETIdentità del processo per ASP.NET
RappresentazioneRappresentazione
Accesso alle risorse di sistemaAccesso alle risorse di sistema
Accesso agli oggetti COMAccesso agli oggetti COM
Accesso alle risorse di reteAccesso alle risorse di rete
Comunicazione protettaComunicazione protetta
Archiviazione di segretiArchiviazione di segreti
Protezione dello stato di sessione e visualizzazioneProtezione dello stato di sessione e visualizzazione
Considerazione sulle Web farmConsiderazione sulle Web farm
RiepilogoRiepilogo

Argomenti del modulo

ASP.NET è fondamentale per lo sviluppo delle applicazioni Web distribuite descritte in questa guida. Offre infatti un insieme di funzionalità di protezione completo e facilmente accessibile che semplifica la creazione di applicazioni Web sicure. Sebbene sia stato progettato per l'integrazione con le funzionalità di protezione esistenti di Internet Information Services (IIS), della piattaforma Windows e di .NET Framework, ASP.NET è comunque flessibile ed estensibile. Pertanto consente di creare meccanismi di protezione personalizzati strettamente integrati con le applicazioni in uso.

In questo modulo sono riportati consigli e indicazioni per la risoluzione dei problemi di autenticazione, autorizzazione e comunicazione protetta che possono verificarsi durante la creazione di applicazioni Web ASP.NET sicure.

Nota: la maggior parte delle indicazioni e dei consigli presentati in questo modulo è applicabile anche allo sviluppo di servizi Web ASP.NET e di oggetti .NET Remoting che risiedono in ASP.NET, descritti in dettaglio rispettivamente nei moduli 10 e 11.

Obiettivi

Il modulo consente di:

Proteggere l'applicazione ASP.NET in uso.

Proteggere segreti e informazioni sullo stato gestiti da applicazioni ASP.NET.

Conoscere l'architettura di protezione delle applicazioni ASP.NET e il tipo di integrazione esistente tra le funzionalità di protezione di IIS, Windows, .NET Framework e ASP.NET al fine di garantire un sistema di protezione per le applicazioni Web distribuite.

Scegliere una strategia di autenticazione e autorizzazione appropriata per l'applicazione in uso.

Comprendere l'effetto dell'identità del processo ASP.NET e della rappresentazione sull'accesso dell'applicazione a risorse downstream quali file e database.

Implementare un progetto di protezione valido per l'applicazione Web ASP.NET in uso mediante una combinazione di strumenti di configurazione del prodotto e tecniche di programmazione.

Ambito di applicazione

Le informazioni contenute in questo modulo sono valide per i seguenti prodotti e tecnologie:

Windows XP o Windows 2000 Server con Service Pack 3 e sistemi operativi successivi

Microsoft Internet Information Services 5.0 e versioni successive

Microsoft Active Directory

.NET Framework versione 1.0 con Service Pack 2

Visual Studio 1.0 .NET e versioni successive

Visual C# .NET

SQL Server 2000 con Service Pack 2 e versioni successive

Utilizzo del modulo

Per trarre il massimo vantaggio dal modulo:

È necessario aver acquisito esperienza nella programmazione con Visual C# .NET e Visual Studio .NET.

È necessario aver acquisito esperienza nello sviluppo e nella configurazione di applicazioni ASP.NET.

È necessario aver acquisito esperienza nella configurazione della protezione di IIS.

È necessario aver acquisito esperienza nella configurazione della protezione di Windows e nella creazione di account utente mediante gli strumenti di amministrazione di Windows.

È necessario aver acquisito esperienza nella configurazione di Active Directory.

È necessario aver acquisito esperienza nello sviluppo e nella configurazione di applicazioni Enterprise Services (COM+).

Leggere il modulo 1 "Introduzione". Viene descritta l'importanza dell'autenticazione, dell'autorizzazione e della comunicazione protetta nelle applicazioni Web distribuite.

Leggere il modulo 2 "Modello di protezione per le applicazioni ASP.NET". Viene presentata una panoramica dell'architettura e delle tecnologie utilizzate nella creazione di applicazioni Web ASP.NET distribuite e vengono illustrate le funzioni dell'autenticazione, dell'autorizzazione e delle comunicazioni protette all'interno di tale architettura.

Leggere il modulo 3 "Autenticazione e autorizzazione". Viene presentata un'introduzione ai meccanismi di autenticazione e di autorizzazione disponibili durante l'utilizzo di ASP.NET.

Leggere il modulo 4 "Comunicazione protetta". Viene presentata una vasta gamma di tecnologie disponibili per la protezione delle comunicazioni tra ASP.NET e altri elementi di un'applicazione Web distribuita.

Per le procedure dettagliate relative all'implementazione di molte tecniche descritte in questo modulo, leggere i seguenti moduli:

"Procedura - Creazione di un account personalizzato per eseguire ASP.NET"

"Procedura - Installazione di SSL in un server Web"

"Procedura - Utilizzo di SSL per proteggere la comunicazione con SQL Server 2000"

"Procedura - Utilizzo di IPSec per la comunicazione protetta tra due server"

"Procedura - Implementazione di IPrincipal"

"Procedura - Utilizzo dell'autenticazione basata su moduli mediante SQL Server 2000"

"Procedura - Utilizzo dell'autenticazione basata su moduli mediante Active Directory"

"Procedura - Creazione di oggetti GenericPrincipal mediante l'autenticazione basata su moduli"

"Procedura - Implementazione della delega Kerberos per Windows 2000"

Architettura della protezione di ASP.NET

Le funzionalità di ASP.NET unite a quelle di IIS, di .NET Framework e dei servizi di protezione sottostanti forniti dal sistema operativo, consentono di disporre di una serie di meccanismi di autenticazione e di autorizzazione riepilogati nella figura 8.1.

Servizi di protezione di ASP.NET

Figura 8.1
Servizi di protezione di ASP.NET

La figura 8.1 illustra i meccanismi di autenticazione e autorizzazione forniti da IIS e da ASP.NET. Quando un client invia una richiesta Web, viene attivata la sequenza di meccanismi di autenticazione e autorizzazione seguente:

1.

La rete riceve la richiesta Web HTTP(S). Il protocollo SSL può essere utilizzato per verificare l'identità del server mediante i relativi certificati e, facoltativamente, l'identità del client.

Nota: il protocollo SSL fornisce inoltre un canale sicuro per la protezione dei dati sensibili scambiati tra client e server.

2.

IIS autentica il chiamante tramite l'autenticazione di base, del digest, integrata (NTLM o Kerberos) o con certificato. Se il sito o parte di esso non richiede l'accesso con autenticazione, è possibile configurare IIS per l'autenticazione anonima. IIS crea un token di accesso di Windows per ciascun utente autenticato. Se viene selezionata l'autenticazione anonima, IIS crea un token di accesso per l'account utente Internet anonimo predefinito, ovvero IUSR_MACHINE.

3.

IIS autorizza il chiamante ad accedere alla risorsa richiesta. Per autorizzare l'accesso si utilizzano le autorizzazioni NTFS definite dagli ACL allegati alla risorsa richiesta. È anche possibile configurare IIS affinché accetti le richieste esclusivamente da computer client con indirizzi IP specifici.

4.

IIS trasferisce il token di accesso di Windows del chiamante autenticato ad ASP.NET; se viene utilizzata l'autenticazione anonima, è possibile che il token di accesso sia quello dell'utente Internet anonimo.

5.

ASP.NET autentica il chiamante.
Se ASP.NET è stato configurato per l'autenticazione di Windows, non viene eseguita alcuna autenticazione ulteriore. ASP.NET accetterà qualsiasi token inviato da IIS.

Se ASP.NET è stato configurato per l'autenticazione basata su moduli, le credenziali fornite dal chiamante tramite un modulo HTML vengono autenticate rispetto a un archivio dati, in genere un database Microsoft(r) SQL Server(tm) o un servizio Active Directory(r). Se ASP.NET è stato configurato per l'autenticazione Passport, l'utente viene reindirizzato a un sito Passport dove viene autenticato dal servizio Passport.

6.

ASP.NET autorizza l'accesso alla risorsa o all'operazione richiesta.
Per consentire al chiamante di accedere al file o alla cartella richiesti, il modulo HTTP UrlAuthorizationModule fornito dal sistema utilizza le regole di autorizzazione configurate nel file web.config, e in particolare l'elemento <authorization>.

Con l'autenticazione di Windows, un altro modulo HTTP, FileAuthorizationModule, controlla che il chiamante disponga delle autorizzazioni necessarie per accedere alla risorsa richiesta. Il token di accesso del chiamante viene confrontato con l'ACL che protegge la risorsa.

È anche possibile utilizzare i ruoli .NET, sia a livello dichiarativo che di programmazione, per assicurarsi che il chiamante sia autorizzato ad accedere alla risorsa o a eseguire l'operazione richiesta.

7.

Il codice contenuto nell'applicazione accede alle risorse locali e/o remote utilizzando un'identità specifica. Per impostazione predefinita, dal momento che ASP.NET non esegue alcuna rappresentazione, l'identità viene fornita dall'account del processo ASP.NET configurato. Altre opzioni prevedono l'identità del chiamante originale, se la rappresentazione è attivata, o l'identità di un servizio configurato.

Gatekeeper

I punti di autorizzazione, o gatekeeper, all'interno di un'applicazione Web ASP.NET sono forniti da IIS e da ASP.NET:

IIS

Quando l'autenticazione anonima è disattivata, IIS autorizza esclusivamente le richieste degli utenti che è in grado di autenticare nel proprio dominio o in un dominio trusted.

Per eseguire il controllo dell'accesso nel caso di file di tipo statico, ad esempio quelli con estensione jpg, gif e htm a cui non è associata un'estensione ISAPI, IIS utilizza le autorizzazioni NTFS associate al file richiesto.

ASP.NET

I gatekeeper ASP.NET includono le richieste di autorizzazione e i controlli dei ruoli UrlAuthorizationModule, FileAuthorizationModule e del principal.

UrlAuthorizationModule

Per controllare gli utenti e i gruppi di utenti a cui deve essere consentito l'accesso all'applicazione, è possibile configurare gli elementi <authorization> all'interno del file web.config dell'applicazione. L'autorizzazione è basata sull'oggetto IPrincipal archiviato in HttpContext.User.

FileAuthorizationModule

Per i tipi di file che IIS allega all'estensione ISAPI ASP.NET (Aspnet_isapi.dll), i controlli di accesso automatici vengono eseguiti tramite il token di accesso di Windows dell'utente autenticato, ad esempio IUSR_MACHINE, rispetto all'ACL allegato al file ASP.NET richiesto.

Nota: per l'autorizzazione del file non è necessaria la rappresentazione.

La classe FileAuthorizationModule esegue i controlli di accesso esclusivamente rispetto al file richiesto mentre non controlla i file a cui accede il codice della pagina richiesta, anche nel caso in cui l'accesso sia controllato da IIS.

Se ad esempio si richiede il file Default.aspx contenente il controllo utente incorporato Usercontrol.ascx, che a sua volta include un tag immagine che fa riferimento a Image.gif, la classe FileAuthorizationModule esegue un controllo dell'accesso per i file Default.aspx e Usercontrol.ascx in quanto IIS associa questi tipi di file all'estensione ISAPI ASP.NET.

Image.gif è un file statico gestito internamente da IIS e la classe FileAuthorizationModule non ne esegue il controllo. Poiché i controlli di accesso dei file statici vengono eseguiti da IIS, all'utente autenticato deve comunque essere concessa l'autorizzazione di lettura del file tramite un ACL opportunamente configurato.

Tale scenario è illustrato nella figura 8.2.

Nota per gli amministratori di sistema: l'utente autenticato deve disporre delle autorizzazioni NTFS in lettura per tutti i file dello scenario. L'unica variabile riguarda il gatekeeper utilizzato per applicare il controllo dell'accesso. L'account del processo ASP.NET richiede l'accesso in lettura soltanto per i tipi di file registrati in ASP.NET.

Integrazione di IIS e dei gatekeeper ASP.NET.

Figura 8.2
Integrazione di IIS e dei gatekeeper ASP.NET.

In questo scenario è possibile impedire l'accesso al gate dei file. Se si configura l'ACL allegato al file Default.aspx e si nega l'accesso a un determinato utente, il controllo utente e le eventuali immagini incorporate non potranno essere inviate al client dal codice presente nel file Default.aspx. Se invece l'utente richiede direttamente le immagini, IIS esegue direttamente i controlli di accesso.

Richieste di autorizzazione del principal e controlli dei ruoli espliciti

Oltre ai gatekeeper configurabili IIS e ASP.NET, è possibile utilizzare le richieste di autorizzazione del principal, sia a livello dichiarativo che di programmazione, come ulteriore meccanismo specifico di controllo dell'accesso. I controlli delle autorizzazioni del principal eseguiti dalla classe PrincipalPermissionAttribute consentono di controllare l'accesso alle classi, ai metodi o ai singoli blocchi di codice sulla base dell'identità e dell'appartenenza ai gruppi dei singoli utenti, secondo quanto definito dall'oggetto IPrincipal allegato al thread corrente.

Nota: le richieste di autorizzazione del principal utilizzate per richiedere l'appartenenza ai ruoli differiscono dalle chiamate a IPrincipal.IsInRole eseguite per verificare l'appartenenza ai ruoli; nel primo caso, se il chiamante non appartiene al ruolo specificato, il risultato è un'eccezione; nel secondo caso, invece, il risultato è semplicemente un valore booleano che conferma l'appartenenza ai ruoli.

Con l'autenticazione di Windows, ASP.NET allega automaticamente un oggetto WindowsPrincipal che rappresenta l'utente autenticato alla richiesta Web corrente mediante l'utilizzo di HttpContext.User. L'autenticazione basata su moduli e l'autenticazione Passport creano un oggetto GenericPrincipal con l'identità corretta ma senza ruoli che viene allegato a HttpContext.User.

Ulteriori informazioni

Per ulteriori informazioni sulla configurazione della protezione, vedere più avanti la sezione "Configurazione della protezione" in questo modulo.

Per ulteriori informazioni sulla programmazione della protezione e sugli oggetti IPrincipal, vedere più avanti la sezione "Programmazione della protezione" in questo modulo.

Strategie di autenticazione e autorizzazione

ASP.NET fornisce numerosi meccanismi di autorizzazione a livello dichiarativo e di programmazione da utilizzare insieme a una vasta gamma di schemi di autenticazione, consentendo lo sviluppo di una strategia di autorizzazione su più livelli che può essere configurata in modo da disporre di diversi gradi di granularità, ad esempio per utente o per gruppo di utenti (basati sui ruoli).

In questa sezione vengono illustrate le opzioni di autorizzazione disponibili, sia a livello di configurazione che di programmazione, per un insieme di opzioni di autenticazione comunemente usate.

Le opzioni di autenticazione descritte sono elencate di seguito.

Autenticazione di Windows con rappresentazione

Autenticazione di Windows senza rappresentazione

Autenticazione di Windows tramite un'identità fissa

Autenticazione basata su moduli

Autenticazione Passport

Opzioni di autorizzazione disponibili

Nella tabella che segue viene illustrato l'insieme di opzioni di autorizzazione disponibili. Per ciascuna di esse la tabella indica se sono necessarie o meno l'autenticazione di Windows e/o la rappresentazione. Se l'autenticazione di Windows non è necessaria, l'opzione di autorizzazione specifica è disponibile per tutti gli altri tipi di autenticazione. Utilizzare la tabella per perfezionare la strategia di autenticazione/autorizzazione adottata.

Tabella 8.1: Requisiti di autenticazione di Windows e di rappresentazione

Opzioni di autorizzazioneRichiede l'autenticazione di WindowsRichiede la rappresentazione

FileAuthorizationModule

No

UrlAuthorizationModule

No

No

Richieste di autorizzazione del principal

No

No

Ruoli .NET

No

No

Ruoli Enterprise Services

Sì (nell'ambito dell'applicazione Web ASP.NET)

Autorizzazioni NTFS (per tipi di file richiesti direttamente e non associati a un'estensione ISAPI)

N/D — Questi file non vengono gestiti da ASP.NET.
Con qualsiasi meccanismo di autenticazione IIS non anonimo è consigliabile configurare le autorizzazioni per singoli utenti autenticati.
Con l'autenticazione anonima è consigliabile configurare le autorizzazioni per l'account utente predefinito IUSR_MACHINE.

No (IIS esegue il controllo dell'accesso)

Autorizzazioni NTFS (per i file a cui accede il codice dell'applicazione Web)

No

No
Se viene eseguita la rappresentazione, configurare gli ACL rispetto all'identità Windows rappresentata, ovvero il chiamante originale o l'identità specificata nell'elemento <identity> del file web.config.

Autenticazione di Windows con rappresentazione

I seguenti elementi della configurazione illustrano la procedura per attivare l'autenticazione di Windows (IIS) e la rappresentazione a livello dichiarativo nei file web.config o machine.config.

Nota: è consigliabile configurare l'autenticazione per singola applicazione nel file web.config di ciascuna di esse.

<authentication mode="Windows" />
<identity impersonate="true" />

Con questa configurazione, il codice dell'applicazione ASP.NET rappresenta il chiamante autenticato da IIS.

Protezione configurabile

Quando si utilizza l'autenticazione di Windows con la rappresentazione, sono disponibili le seguenti opzioni di autorizzazione:

ACL di Windows

Risorse richieste dal client. L'oggetto ASP.NET FileAuthorizationModule esegue i controlli di accesso per i tipi di file richiesti associati all'estensione ISAPI ASP.NET. Per eseguire i controlli di accesso vengono utilizzati i token di accesso del chiamante originale e l'ACL allegato alle risorse richieste.
Per i file di tipo statico a cui non sono associate estensioni ISAPI, IIS esegue i controlli di accesso mediante il token di accesso del chiamante e l'ACL allegato al file.

Risorse a cui accede l'applicazione. È possibile configurare gli ACL di Windows delle risorse a cui accede l'applicazione (file, cartelle, chiavi del Registro di sistema, oggetti Active Directory e così via) rispetto al chiamante originale.

Autorizzazione dell'URL Consente di configurare l'autorizzazione dell'URL nel file web.config. Con l'autenticazione di Windows, i nomi utente assumono il formato DomainName\UserName e i ruoli vengono associati individualmente ai gruppi di Windows.

<authorization>
  <deny user="DomainName\UserName" />
  <allow roles="DomainName\WindowsGroup" />
</authorization>

Ruoli Enterprise Services (COM+). I ruoli vengono gestiti nel catalogo COM+. Per configurare i ruoli, utilizzare lo script o lo strumento di amministrazione Servizi componenti.

Protezione a livello di programmazione

Per protezione a livello di programmazione si intendono i controlli di protezione all'interno del codice dell'applicazione Web. Quando si utilizzano l'autenticazione di Windows e la rappresentazione, sono disponibili le seguenti opzioni di protezione a livello di programmazione:

Richieste PrincipalPermission

Imperativa (incorporata all'interno del codice di un metodo)

    PrincipalPermission permCheck = new PrincipalPermission(
                                       null, @"DomainName\WindowsGroup");
    permCheck.Demand();

Dichiarativa (gli attributi precedono interfacce, classi e metodi)

[PrincipalPermission(SecurityAction.Demand, 
                  Role=@"DomainName\WindowsGroup)]

Controlli dei ruoli espliciti. È possibile eseguire i controlli dei ruoli mediante l'interfaccia IPrincipal.

IPrincipal.IsInRole(@"DomainName\WindowsGroup");

Ruoli Enterprise Services (COM+). È possibile eseguire il controllo dei ruoli a livello di programmazione mediante la classe ContextUtil.

ContextUtil.IsCallerInRole("Manager")

Raccomandazioni sull'utilizzo

Utilizzare l'autenticazione di Windows e la rappresentazione nei seguenti casi:

Quando gli utenti dell'applicazione dispongono di account di Windows che possono essere autenticati dal server.

Quando è necessario trasmettere il contesto di protezione del chiamante originale al livello intermedio e/o al livello dati dell'applicazione Web per supportare l'autorizzazione specifica per ogni utente.

Quando è necessario trasmettere il contesto di protezione del chiamante originale ai livelli downstream per supportare il controllo a livello di sistema operativo.

Prima di utilizzare la rappresentazione all'interno dell'applicazione, valutare i vantaggi e gli svantaggi di questo approccio rispetto al modello di sottosistema trusted. Per una descrizione dettagliata, vedere "Scelta di un modello di accesso alle risorse" nella sezione "Modalità di autorizzazione" del modulo 3 "Autenticazione e autorizzazione".

Gli svantaggi della rappresentazione comprendono:

Minore scalabilità dell'applicazione dovuta all'incapacità di eseguire in modo efficiente il pooling delle connessioni al database

Maggiori oneri amministrativi dovuti all'esigenza di configurare gli ACL delle risorse back-end per i singoli utenti

Necessità dell'autenticazione Kerberos e di un ambiente opportunamente configurato per eseguire la delega.

Ulteriori informazioni

Per ulteriori informazioni sull'autenticazione di Windows, vedere più avanti la sezione "Autenticazione di Windows" in questo modulo.

Per ulteriori informazioni sulla rappresentazione, vedere più aventi la sezione "Rappresentazione" in questo modulo.

Per ulteriori informazioni sull'autorizzazione dell'URL, vedere più avanti la sezione "Note sull'autorizzazione dell'URL" in questo modulo.

Per ulteriori informazioni sui ruoli Enterprise Services (COM+), vedere il modulo 9 "Protezione di Enterprise Services".

Autenticazione di Windows senza rappresentazione

I seguenti elementi della configurazione illustrano la procedura per attivare l'autenticazione di Windows (IIS) senza la rappresentazione a livello dichiarativo nel file web.config.

<authentication mode="Windows" />
<!-- The following setting is equivalent to having no identity element -->
<identity impersonate="false" />

Protezione configurabile

Quando si utilizza l'autenticazione di Windows senza la rappresentazione, sono disponibili le seguenti opzioni di autorizzazione:

ACL di Windows

Risorse richieste dal client. L'oggetto ASP.NET FileAuthorizationModule esegue i controlli di accesso per i tipi di file richiesti associati all'estensione ISAPI ASP.NET. Per eseguire i controlli di accesso vengono utilizzati i token di accesso del chiamante originale e l'ACL allegato alle risorse richieste. La rappresentazione non è necessaria.
Per i file di tipo statico a cui non sono associate estensioni ISAPI, IIS esegue i controlli di accesso mediante il token di accesso del chiamante e l'ACL allegato al file.

Risorse a cui accede l'applicazione. È possibile configurare gli ACL di Windows delle risorse a cui accede l'applicazione (file, cartelle, chiavi del Registro di sistema, oggetti Active Directory) rispetto all'identità del processo ASP.NET.

Autorizzazione dell'URL Consente di configurare l'autorizzazione dell'URL nel file web.config. Con l'autenticazione di Windows, i nomi utente assumono il formato DomainName\UserName e i ruoli vengono associati individualmente ai gruppi di Windows.

<authorization>
  <deny user="DomainName\UserName" />
  <allow roles="DomainName\WindowsGroup" />
</authorization>

Protezione a livello di programmazione

Sono disponibili le seguenti opzioni di protezione a livello di programmazione:

Richieste di autorizzazione del principal

Imperativa

    PrincipalPermission permCheck = new PrincipalPermission(
                                         null, @"DomainName\WindowsGroup");
    permCheck.Demand();

Dichiarativa

[PrincipalPermission(SecurityAction.Demand, 
                  Role=@"DomainName\WindowsGroup")]

Controlli dei ruoli espliciti. È possibile eseguire i controlli dei ruoli mediante l'interfaccia IPrincipal.

IPrincipal.IsInRole(@"DomainName\WindowsGroup");

Raccomandazioni sull'utilizzo

Utilizzare l'autenticazione di Windows senza rappresentazione seguenti casi:

Quando gli utenti dell'applicazione dispongono di account di Windows che possono essere autenticati dal server.

Quando si desidera utilizzare un'identità fissa per accedere alle risorse downstream, ad esempio i database, e supportare il pooling delle connessioni.

Ulteriori informazioni

Per ulteriori informazioni sull'autenticazione di Windows, vedere più avanti la sezione "Autenticazione di Windows" in questo modulo.

Per ulteriori informazioni sull'autorizzazione dell'URL, vedere più avanti la sezione "Note sull'autorizzazione dell'URL" in questo modulo.

Autenticazione di Windows tramite un'identità fissa

L'elemento <identity> contenuto nel file web.config supporta gli attributi di nome utente e password facoltativi che consentono di configurare un'identità fissa specifica da rappresentare per l'applicazione, come illustrato nel seguente frammento del file di configurazione.

<identity impersonate="true"
          userName="registry:HKLM\SOFTWARE\YourSecureApp\
                    identity\ASPNET_SETREG,userName"
          password="registry:HKLM\SOFTWARE\YourSecureApp\
                    identity\ASPNET_SETREG,password" />

In questo esempio viene illustrato l'elemento <identity>, in cui le credenziali vengono crittografate nel Registro di sistema mediante l'utilità aspnet_setreg.exe. I valori di attributo nome utente e password in testo normale sono stati sostituiti con puntatori alla chiave del Registro di sistema e ai valori denominati protetti contenenti le credenziali crittografate. Per informazioni dettagliate su questa utilità e sul relativo download, vedere l'articolo Q329290 "HOW TO: Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings" (in inglese) della Microsoft Knowledge Base.

Raccomandazioni sull'utilizzo

L'impiego di un'identità rappresentata fissa non è consigliato in caso di utilizzo di .NET Framework 1.0 nei server Windows 2000, in quanto richiede l'assegnazione del privilegio "Agisci come parte del sistema operativo" all'account di processo ASP.NET. Questo privilegio è necessario per il processo ASP.NET poiché consente di eseguire una chiamata LogonUser utilizzando le credenziali specificate dall'utente.

Nota: nella versione 1.1 di .NET Framework verrà introdotto un miglioramento per questo scenario relativo a Windows 2000. L'accesso verrà eseguito dal processo IIS, in modo che ASP.NET non richieda il privilegio "Agisci come parte del sistema operativo".

Autenticazione basata su moduli

Gli elementi della configurazione riportati di seguito illustrano la procedura per attivare l'autenticazione basata su moduli a livello dichiarativo nel file web.config.

<authentication mode="Forms">
  <forms loginUrl="logon.aspx" name="AuthCookie" timeout="60" path="/">
  </forms>
</authentication>

Protezione configurabile

Quando si utilizza l'autenticazione basata su moduli, sono disponibili le seguenti opzioni di autorizzazione:

ACL di Windows

Risorse richieste dal client. Le risorse richieste prevedono che gli ACL consentano l'accesso in lettura all'account utente Internet anonimo. Quando si utilizza l'autenticazione basata su moduli, è consigliabile configurare IIS in modo che consenta l'accesso anonimo.
L'autorizzazione del file ASP.NET richiede l'autenticazione di Windows e pertanto non è disponibile.

Risorse a cui accede l'applicazione. È possibile configurare gli ACL di Windows delle risorse a cui accede l'applicazione (file, cartelle, chiavi del Registro di sistema e oggetti Active Directory) rispetto all'identità del processo ASP.NET.

Autorizzazione dell'URL

Consente di configurare l'autorizzazione dell'URL nel file web.config. Con l'autenticazione basata su moduli, il formato dei nomi utente è determinato dall'archivio dati personalizzato, sia esso un database SQL Server o un servizio Active Directory.

Se si utilizza un archivio dati SQL Server:

<authorization>
<deny users="?" />
  <allow users="Mary,Bob,Joe" roles="Manager,Sales" />
</authorization>

Se si utilizza un servizio Active Directory come archivio dati, i nomi utenti e i nomi di gruppo vengono visualizzati nel formato X.500:

<authorization>
  <deny users="someAccount@domain.corp.yourCompany.com" />
  <allow roles ="CN=Smith James,CN=FTE_northamerica,CN=Users,
                DC=domain,DC=corp,DC=yourCompany,DC=com" />
</authorization>

Protezione a livello di programmazione

Sono disponibili le seguenti opzioni di protezione a livello di programmazione:

Richieste di autorizzazione del principal

Imperativa

    PrincipalPermission permCheck = new PrincipalPermission(
                                         null, "Manager");
    permCheck.Demand();

Dichiarativa

[PrincipalPermission(SecurityAction.Demand, 
                  Role="Manager")]

Controlli dei ruoli espliciti. È possibile eseguire i controlli dei ruoli mediante l'interfaccia IPrincipal.

IPrincipal.IsInRole("Manager");

Raccomandazioni sull'utilizzo

L'autenticazione basata su moduli è particolarmente indicata per le applicazioni Internet e in generale in tutti i casi in cui:

Gli utenti dell'applicazione non dispongono di account di Windows.

Si desidera che gli utenti accedano all'applicazione immettendo le proprie credenziali tramite un modulo HTML.

Ulteriori informazioni

Per ulteriori informazioni sull'autenticazione basata su moduli, vedere più avanti la sezione "Autenticazione basata su moduli" in questo modulo.

Per ulteriori informazioni sull'autorizzazione dell'URL, vedere più avanti la sezione "Note sull'autorizzazione dell'URL" in questo modulo.

Autenticazione Passport

Gli elementi della configurazione riportati di seguito illustrano la procedura per attivare l'autenticazione Passport a livello dichiarativo nel file web.config.

<authentication mode="Passport" />

Raccomandazioni sull'utilizzo

L'autenticazione Passport viene utilizzata su Internet quando gli utenti delle applicazioni non dispongono di account di Windows e si desidera implementare un soluzione ad accesso singolo. Gli utenti che in precedenza eseguivano l'accesso con un account Passport in un sito Web che aderisce al sistema Passport, non dovranno più eseguire la procedura di accesso se il proprio sito è stato configurato per l'autenticazione Passport.

Configurazione della protezione

In questa sezione viene illustrata la procedura di configurazione per la protezione di un'applicazione Web ASP.NET, riepilogata nella figura 8.3.

Configurazione della protezione dell'applicazione ASP.NET.

Figura 8.3
Configurazione della protezione dell'applicazione ASP.NET.

Configurazione delle impostazioni IIS

Per configurare la protezione IIS è necessario attenersi alla seguente procedura:

1.

Se si intende utilizzare il protocollo SSL, installare un certificato server Web.

Per ulteriori informazioni, vedere "Procedura - Installazione di SSL in un server Web" in questa guida.

2.

Configurare l'autenticazione IIS.

3.

Se si intende utilizzare l'autenticazione con certificato, configurare il mapping del certificato client.

Per ulteriori informazioni sul mapping dei certificati client, vedere l'articolo Q313070 "How To: Configure Client Certificate Mappings in Internet Information Services (IIS) 5.0" (in inglese) della Microsoft Knowledge Base.

4.

Impostare le autorizzazioni NTFS per file e cartelle. IIS e l'oggetto ASP.NET FileAuthorizationModule controllano congiuntamente che l'utente autenticato, o l'account utente Internet anonimo, dispongano dei diritti di accesso necessari per accedere al file richiesto in base alle impostazioni ACL.

Configurazione delle impostazioni ASP.NET

Le impostazioni di configurazione a livello dell'applicazione vengono conservate nei file web.config che si trovano nella directory principale virtuale dell'applicazione e, facoltativamente, all'interno di altre sottocartelle; le impostazioni delle sottocartelle possono talvolta ignorare le impostazioni della cartella principale.

1.

Configurazione dell'autenticazione. È consigliabile eseguire questa configurazione per ogni applicazione nel file web.config situato nella directory principale virtuale dell'applicazione, anziché nel file machine.config.

<authentication mode="Windows|Forms|Passport|None" />

2.

Configurazione della rappresentazione. Per impostazione predefinita, le applicazioni ASP.NET non eseguono la rappresentazione. Tali applicazioni vengono eseguite mediante l'identità del processo ASP.NET configurata, generalmente ASPNET, che viene sempre utilizzata per accedere alle risorse. La rappresentazione è necessaria soltanto nei seguenti casi:

Se si utilizza Enterprise Services e si desidera utilizzare i ruoli Enterprise Services (COM+) per autorizzare l'accesso alle funzionalità fornite dai componenti serviti.

Se IIS viene configurato per l'autenticazione anonima e si desidera accedere alle risorse tramite l'account utente Internet anonimo. Per informazioni dettagliate sull'approccio descritto, vedere più avanti la sezione "Accesso alle risorse di rete" in questo modulo.

Se è necessario trasmettere il contesto di protezione dell'utente autenticato al livello successivo, ad esempio al database.

Se è stato eseguito il porting di un'applicazione ASP tradizionale ad ASP.NET e si desidera riprodurre lo stesso comportamento di rappresentazione. Nel contesto ASP tradizionale, la rappresentazione del chiamante viene eseguita per impostazione predefinita.

Per configurare la rappresentazione ASP.NET, utilizzare il seguente elemento <identity> nel file web.config dell'applicazione.

<identity impersonate="true" />

3.

Configurazione dell'autorizzazione. L'autorizzazione dell'URL determina se un utente o un ruolo può inviare verbi HTTP specifici, ad esempio GET, HEAD e POST, a un determinato file. Per implementare l'autorizzazione dell'URL, effettuare le seguenti operazioni:.

1.

Aggiungere un elemento <authorization> al file web.config situato nella directory principale virtuale dell'applicazione.

2.

Limitare l'accesso agli utenti e ai ruoli utilizzando gli attributi allow e deny. Nell'esempio seguente relativo al file web.config viene utilizzata l'autenticazione di Windows e si consente l'accesso a Bob e Mary negandolo invece a tutti gli altri utenti.

<authorization>
  <allow users="DomainName\Bob, DomainName\Mary" />
  <deny users="*" />
</authorization>

Importante: è necessario aggiungere <deny users>="?"/> o <deny users>="*"/> alla fine dell'elemento <authorization> per evitare che l'accesso sia consentito a tutte le identità autenticate.

Note sull'autorizzazione dell'URL

Quando si configura l'autorizzazione dell'URL, tenere presente quanto segue:

"*" si riferisce a tutte le identità.

"?" si riferisce alle identità autenticate, ovvero all'identità anonima.

Per il corretto funzionamento dell'autenticazione dell'URL non è necessario eseguire la rappresentazione.

Le impostazioni di autorizzazione nel file web.config si riferiscono in genere a tutti i file contenuti nella directory corrente e in tutte le sottodirectory, a meno che una sottodirectory contenga un proprio file web.config con un elemento <authorization>. In tal caso, le impostazioni nella sottodirectory ignorano quelle della directory principale.

Nota: l'autorizzazione dell'URL vale esclusivamente per i tipi di file che IIS associa all'estensione ISAPI ASP.NET aspnet_isapi.dll.

Per applicare le impostazioni di autorizzazione a un singolo file o a un'unica directory, è possibile utilizzare il tag <location>. L'esempio riportato di seguito illustra la procedura per applicare l'autorizzazione a un file specifico denominato Page.aspx.

<location path="page.aspx" />
  <authorization>
    <allow users="DomainName\Bob, DomainName\Mary" />
    <deny users="*" />
  </authorization>
</location>

Gli utenti e i ruoli per l'autorizzazione dell'URL sono determinati dalle impostazioni di autenticazione in uso:

Quando <authentication mode>="Windows" />, si autorizza l'accesso agli account utente e di gruppo di Windows.

Il formato dei nomi utente è "DomainName\WindowsUserName".

Il formato dei nomi di ruolo è "DomainName\WindowsGroupName".

Nota: il gruppo di amministratori locale viene definito "BUILTIN\Administrators". Il gruppo di utenti locale viene definito "BUILTIN\Users".

Quando <authentication mode>="Forms" />, si esegue l'autorizzazione rispetto all'utente e ai ruoli dell'oggetto IPrincipal archiviato nel contesto HTTP corrente. Se ad esempio è stato utilizzata la modalità basata su moduli per autenticare gli utenti rispetto a un database, l'autorizzazione verrà eseguita rispetto ai ruoli recuperati dal database.

Quando <authentication mode>="Passport" />, si esegue l'autorizzazione rispetto all'ID utente Passport (PUID) o ai ruoli recuperati da un archivio. Ad esempio, è possibile associare un ID utente Passport a un determinato account e a un insieme di ruoli archiviati in un database SQL Server o in Active Directory.

Nota: questa funzionalità verrà incorporata nel sistema operativo Microsoft Windows .NET Server 2003.

Quando <authentication mode>="None" /, non è possibile eseguire l'autorizzazione. "None" specifica che non si desidera eseguire alcuna autenticazione o non si intendono utilizzare i moduli di autenticazione .NET ma un meccanismo personalizzato.
Se tuttavia si utilizza un'autenticazione personalizzata, è consigliabile creare un oggetto IPrincipal con ruoli e archiviarlo in HttpContext.User. Quando si utilizza successivamente l'autorizzazione dell'URL, questa viene eseguita rispetto all'utente e ai ruoli conservati nell'oggetto IPrincipal, indipendentemente dall'origine da cui vengono recuperati.

Esempi di autorizzazione dell'URL

L'elenco riportato di seguito illustra la sintassi di alcuni esempi tipici di autorizzazione dell'URL:

Negazione dell'accesso all'account anonimo

 <deny users="?" />

Negazione dell'accesso a tutti gli utenti

<deny users="*"/>

Negazione dell'accesso al ruolo Manager

<deny roles="Manager"/>

Esempio di autenticazione basata su moduli

<configuration>
  <system.web>
      <authentication mode="Forms">
        <forms name=".ASPXUSERDEMO" 
               loginUrl="login.aspx" 
               protection="All" timeout="60" />
      </authentication>
      <authorization>
        <deny users="jdoe@somewhere.com" />
        <deny users="?" />
      </authorization>
  </system.web>
</configuration>

Nota: l'elemento <authorization> è in conflitto con l'oggetto IPrincipal corrente archiviato in HttpContext.User e anche con il metodo di trasferimento dei dati HTTP archiviato in HttpContext.Request.RequestType.

Protezione delle risorse

1.

Gli ACL di Windows consentono di proteggere le risorse, compresi file, cartelle e chiavi del Registro di sistema.
Se non si esegue la rappresentazione, le risorse a cui l'applicazione deve accedere devono disporre di un ACL che conceda almeno l'accesso in lettura all'account del processo ASP.NET.

Se invece si esegue la rappresentazione, i file e le chiavi del Registro di sistema devono disporre di un ACL che conceda almeno l'accesso in lettura all'utente autenticato, o all'account utente Internet anonimo se è stata attivata l'autenticazione anonima.

2.

Proteggere i file web.config e machine.config.

Utilizzare gli ACL corretti. Se ASP.NET esegue la rappresentazione, l'identità rappresentata deve disporre dell'accesso in lettura. In caso contrario, tale è richiesto dall'identità del processo ASP.NET. Utilizzare l'ACL seguente nei file web.config e machine.config.

System: Controllo completo

Administrators: Controllo completo

Identità del processo o identità rappresentata: Lettura

Se non si sta rappresentando l'account utente Internet anonimo IUSR_MACHINE, è consigliabile negare l'accesso a tale account.

Nota: se l'applicazione in uso è associata a una condivisione UNC, l'identità UNC deve disporre dell'accesso in lettura anche ai file di configurazione.

Rimuovere i moduli HTTP indesiderati. Il file machine.config contiene un insieme di moduli HTTP predefiniti all'interno dell'elemento <httpModules>, tra cui:

WindowsAuthenticationModule

FormsAuthenticationModule

PassportAuthenticationModule

UrlAuthorizationModule

FileAuthorizationModule

OutputCacheModule

SessionStateModule

Se un modulo specifico non viene utilizzato dall'applicazione, è consigliabile rimuoverlo per evitare in futuro potenziali problemi di protezione.

3.

Se si desidera, bloccare le impostazioni di configurazione utilizzando l'elemento <location> e l'attributo allowOverride="false" nel modo descritto di seguito.

Blocco delle impostazioni di configurazione

Le impostazioni di configurazione rispettano un ordine gerarchico. Le impostazioni del file web.config nelle sottodirectory ignorano quelle delle directory principali e le impostazioni del file web.config ignorano quelle del file machine.config.

È possibile bloccare le impostazioni di configurazione per evitare che vengano ignorate ai livelli inferiori, utilizzando l'elemento <location> insieme all'attributo allowOverride. Ad esempio:

<location path="somepath" allowOverride="false" />
 . . . arbitrary configuration settings . . .
</location>

Il percorso riportato può fare riferimento a un sito Web o alla directory virtuale ed è valido per la directory citata e per tutte le sottodirectory. Se si imposta allowOverride su "false", si impedisce ai file di configurazione di livello inferiore di ignorare le impostazioni specificate nell'elemento <location>. La possibilità di bloccare le impostazioni di configurazione vale per tutti i tipi di impostazioni e non soltanto per le impostazioni di protezione quali, ad esempio, le modalità di autenticazione.

Nel contesto del file machine.config, il percorso deve essere completo e deve includere il sito Web, il nome della directory virtuale nonché, facoltativamente, una sottodirectory e un nome file. Ad esempio:

<location path="Web Site Name/VDirName/SubDirName/PageName.aspx" >
 . . .
</location>

Nel contesto del file web.config, il percorso è in relazione alla directory virtuale dell'applicazione. Ad esempio:

<location path="SubDirName/PageName.aspx" >
. . .
</location>

Blocco del download dei file

Per impedire che alcuni tipi di file vengano scaricati tramite Web, è possibile utilizzare la classe HttpForbiddenHandler. Tale classe viene utilizzata internamente da ASP.NET per impedire il download di determinati file di sistema, ad esempio i file di configurazione come web.config. Per un elenco completo dei tipi di file a cui applicare le limitazioni descritte, vedere la sezione <httpHandlers> nel file machine.config.

Per i file che l'applicazione utilizza internamente ma di cui non è consentito il download, è consigliabile valutare l'opportunità di utilizzare la classe HttpForbiddenHandler.

Nota: quando si è collegati a un server Web, è inoltre necessario proteggere i file con gli ACL di Windows per controllare a quali utenti sia consentito l'accesso.

Per utilizzare la classe HttpForbiddenHandler e impedire il download di un determinato tipo di file

1.

Creare un mapping dell'applicazione in IIS per il tipo di file specificato e associarlo ad Aspnet_isapi.dll.

1.

Nella barra delle applicazioni, fare clic sul pulsante Start, scegliere Programmi, quindi Strumenti di amministrazione e infine selezionare Internet Information Services.

2.

Selezionare la directory virtuale dell'applicazione, fare clic con il pulsante destro del mouse su di essa, quindi scegliere Proprietà.

3.

Selezionare Impostazioni applicazione e fare clic su Configurazione.

4.

Fare clic su Aggiungi per creare un nuovo mapping dell'applicazione.

5.

Fare clic su Sfoglia e selezionare c:\winnt\Microsoft.NET\Framework\v1.0.3705\aspnet_isapi.dll.

6.

Immettere l'estensione del tipo di file di cui si intende impedire il download (ad esempio .abc) nel campo Estensione.

7.

Assicurarsi che le caselle di controllo Tutti i verbi e Modulo script siano selezionate e che la casella di controllo Verifica esistenza del file sia deselezionata.

8.

Scegliere OK per chiudere la finestra di dialogo Aggiunta/Modifica mapping estensioni applicazioni.

9.

Scegliere OK per chiudere la finestra di dialogo Configurazione applicazioni, quindi scegliere di nuovo OK per chiudere la finestra di dialogo Proprietà.

2.

Aggiungere un mapping <HttpHandler> nel file web.config per il tipo di file specificato.

Di seguito è riportato un esempio relativo al tipo di file con estensione abc.

<httpHandlers>
  <add verb="*" path="*.abc" 
    type="System.Web.HttpForbiddenHandler"/>
</httpHandlers>

Comunicazione protetta

Per proteggere i collegamenti di comunicazione è consigliabile utilizzare una combinazione di protocolli SSL e IPSec (Internet Protocol Security).

Ulteriori informazioni

Per informazioni sull'utilizzo del protocollo SSL per la protezione del collegamento al server di database, vedere "Procedura - Utilizzo di SSL per proteggere la comunicazione con SQL Server 2000".

Per informazioni sull'utilizzo del protocollo IPSec tra due computer, vedere "Procedura - Utilizzo di IPSec per la comunicazione protetta tra due server".

Programmazione della protezione

Dopo avere stabilito le impostazioni di protezione configurabili dell'applicazione Web, è necessario potenziare e ottimizzare i criteri di autorizzazione delle applicazioni a livello di programmazione. A tale scopo è necessario utilizzare gli attributi .NET dichiarativi negli assembly ed eseguire controlli di autorizzazione imperativi all'interno del codice.

In questa sezione vengono illustrate le principali procedure di programmazione necessarie per eseguire l'autorizzazione in un'applicazione Web ASP.NET.

Modello di autorizzazione

In sintesi, la procedura del modello di base per autorizzare gli utenti all'interno dell'applicazione Web è la seguente:

1.

Recuperare le credenziali.

2.

Convalidare le credenziali.

3.

Inserire gli utenti nei ruoli.

4.

Creare un oggetto IPrincipal.

5.

Inserire l'oggetto IPrincipal nel contesto HTTP corrente.

6.

Eseguire l'autorizzazione in base all'identità dell'utente o all'appartenenza ai ruoli.

Importante: se è stata configurata l'autenticazione di Windows, i passaggi da 1 a 5 vengono eseguiti automaticamente da ASP.NET. Nel caso di altri meccanismi di autenticazione, quali la modalità basata su moduli, Passport e personalizzata, per eseguire questi passaggi è necessario scrivere un apposito codice seguendo le indicazioni riportate di seguito.

Recupero delle credenziali

Iniziare la procedura recuperando innanzitutto un insieme di credenziali, ovvero nome utente e password, dall'utente. Se l'applicazione in uso non utilizza l'autenticazione di Windows, è necessario verificare che le credenziali non crittografate siano opportunamente protette in rete tramite il protocollo SSL.

Convalida delle credenziali

Se è stata configurata l'autenticazione di Windows, le credenziali vengono convalidate automaticamente mediante i servizi sottostanti del sistema operativo.

Se si utilizza un meccanismo di autenticazione alternativo, è necessario scrivere un apposito codice per convalidare le credenziali rispetto a un archivio dati, ad esempio un database SQL Server o Active Directory.

Per ulteriori informazioni sulla procedura per archiviare in modo sicuro le credenziali dell'utente in un database SQL Server, vedere la sezione "Autenticazione degli utenti rispetto a un database" nel modulo 12 "Protezione dell'accesso ai dati".

Inserimento degli utenti nei ruoli

L'archivio dati utente dovrebbe inoltre contenere un elenco dei ruoli per ciascun utente. Per recuperare l'elenco dei ruoli relativo all'utente convalidato è necessario scrivere un apposito codice.

Creazione di un oggetto IPrincipal

L'autorizzazione viene eseguita rispetto all'utente autenticato del quale si conservano l'identità e l'elenco dei ruoli all'interno di un oggetto IPrincipal; tale oggetto viene trasmesso nel contesto della richiesta Web corrente.

Se è stata configurata l'autenticazione di Windows, ASP.NET crea automaticamente un oggetto WindowsPrincipal contenente l'identità dell'utente autenticato e un elenco dei ruoli corrispondente all'elenco dei gruppi di Windows a cui appartiene l'utente.

Se si utilizza l'autenticazione basata su moduli, Passport o personalizzata, per creare un oggetto IPrincipal è necessario scrivere un apposito codice all'interno del gestore eventi Application_AuthenticateRequest in Global.asax. Nella maggior parte degli scenari è consigliabile utilizzare la classe GenericPrincipal fornita da .NET Framework.

Inserimento dell'oggetto IPrincipal nel contesto HTTP corrente

Allegare l'oggetto IPrincipal al contesto HTTP corrente mediante la variabile HttpContext.User. Se si utilizza l'autenticazione di Windows, l'operazione viene eseguita automaticamente da ASP.NET; in caso contrario, è necessario allegare manualmente l'oggetto.

Autorizzazione in base all'identità dell'utente e/o all'appartenenza ai ruoli

Se l'applicazione richiede una logica di autorizzazione più specifica, utilizzare i ruoli .NET sia a livello dichiarativo, per ottenere l'autorizzazione a livello di classe o di metodo, sia a livello imperativo all'interno del codice.

È possibile utilizzare richieste di autorizzazione del principal dichiarative o imperative tramite la classe PrincipalPermission oppure eseguire controlli dei ruoli espliciti chiamando il metodo IPrincipal.IsInRole().

L'esempio riportato di seguito presuppone l'esistenza dell'autenticazione di Windows e mostra una richiesta di autorizzazione del principal dichiarativa. Il metodo che segue l'attributo viene eseguito soltanto se l'utente autenticato appartiene al gruppo di Windows Manager. Se il chiamante non appartiene a tale gruppo, viene generata una SecurityException.

[PrincipalPermission(SecurityAction.Demand, 
                     Role=@"DomainName\Manager")]
public void SomeMethod()
{
}

Nell'esempio riportato di seguito viene illustrato un controllo dei ruoli esplicito all'interno del codice e si presuppone che sia stata configurata l'autenticazione di Windows. Se viene utilizzato un meccanismo di autenticazione diverso da quello di Windows, il codice non subisce variazioni significative; anziché eseguire il casting dell'oggetto User a un oggetto WindowsPrincipal, il casting deve essere eseguito a un oggetto GenericPrincipal .

// Extract the authenticated user from the current HTTP context.
// The User variable is equivalent to HttpContext.Current.
User if you are using // an .aspx or .asmx page
WindowsPrincipal authenticatedUser = User as WindowsPrincipal;
if (null != authenticatedUser)
{
  // Note: To retrieve the authenticated user's username, use the 
  // following line of code
  // string username = authenticatedUser.Identity.Name;

  // Perform a role check
  if (authenticatedUser.IsInRole(@"DomainName\Manager") )
  {
    // User is authorized to perform manager functionality
  }
}
else
{
  // User is not authorized to perform manager functionality
}

Ulteriori informazioni

Per l'implementazione pratica del modello di autenticazione basata su moduli descritto sopra, vedere più avanti la sezione "Autenticazione basata su moduli" in questo modulo.

Creazione di una classe IPrincipal personalizzata

È consigliabile utilizzare la classe GenericPrincipal fornita da .NET Framework nella maggior parte dei casi in cui si applica un meccanismo di autenticazione diverso da quello di Windows. In tal modo è possibile garantire i controlli dei ruoli tramite il metodo IPrincipal.IsInRole.

In alcuni casi potrebbe essere necessario implementare una classe IPrincipal personalizzata. La classe IPrincipal personalizzata viene implementata per i seguenti motivi:

Si desidera disporre di una funzionalità estesa per il controllo dei ruoli. Si preferisce disporre di metodi che consentano di verificare se un determinato utente appartiene a più ruoli. Ad esempio:

CustomPrincipal.IsInAllRoles( "Role", "Role2", "Role3" )
CustomPrincipal.IsInAnyRole( "Role1", "Role2", "Role3" )

Si intende implementare un metodo o una proprietà aggiuntivi che restituiscano un elenco dei ruoli in una matrice. Ad esempio:

string[] roles = CustomPrincipal.Roles;

Si desidera che l'applicazione applichi una logica gerarchica dei ruoli. Ad esempio, il ruolo di Senior Manager potrebbe essere considerato di livello gerarchicamente superiore rispetto a quello di Manager; per eseguire la relativa verificare è possibile utilizzare i metodi illustrati di seguito.

CustomPrincipal.IsInHigherRole("Manager");
CustomPrincipal.IsInLowerRole("Manager");

Si intende implementare l'inizializzazione lazy degli elenchi dei ruoli. Ad esempio, l'elenco dei ruoli potrebbe essere caricato dinamicamente soltanto in caso di richiesta di un controllo dei ruoli.

Si desidera implementare l'interfaccia IIdentity in modo che l'utente venga identificato tramite un X509ClientCertificate. Ad esempio:

CustomIdentity id = CustomPrincipal.Identity;
X509ClientCertificate cert = id.ClientCertificate;

Ulteriori informazioni

Per ulteriori informazioni sulla creazione di una classe IPrincipal personalizzata, vedere "Procedura - Implementazione di IPrincipal" in questa guida.

Autenticazione di Windows

È consigliabile utilizzare l'autenticazione di Windows quando gli utenti dell'applicazione dispongono di account di Windows che possono essere autenticati dal server, ad esempio nell'ambito di scenari Intranet.

Se si configura ASP.NET per l'autenticazione di Windows, IIS esegue l'autenticazione dell'utente mediante il meccanismo di autenticazione IIS. L'esempio descritto è illustrato nella figura 8.4.

L'autenticazione di Windows ASP.NET utilizza IIS per autenticare i chiamanti

Figura 8.4
L'autenticazione di Windows ASP.NET utilizza IIS per autenticare i chiamanti

Il token di accesso del chiamante autenticato, che corrisponde all'account utente Internet anonimo nel caso in cui IIS sia stato configurato per l'autenticazione anonima, viene reso disponibile per l'applicazione ASP.NET. È necessario tenere presente quanto segue.

In questo modo si consente all'oggetto ASP.NET FileAuthorizationModule di eseguire i controlli di accesso rispetto ai file ASP.NET richiesti tramite il token di accesso del chiamante originale.

Importante: l'autorizzazione del file ASP.NET esegue i controlli di accesso esclusivamente rispetto ai tipi di file associati ad Aspnet_isapi.dll.

L'autorizzazione del file non richiede alcuna rappresentazione. Con la rappresentazione attivata, gli eventuali accessi alle risorse eseguiti dall'applicazione utilizzano l'identità del chiamante rappresentato. In tal caso, verificare che gli ACL allegati alle risorse contengano una voce di controllo di accesso (ACE) che conceda almeno l'accesso in lettura all'identità del chiamante originale.

Identificazione dell'utente autenticato

ASP.NET associa un oggetto WindowsPrincipal alla richiesta Web corrente. Tale oggetto contiene l'identità dell'utente di Windows autenticato insieme a un elenco dei ruoli a cui l'utente appartiene. Con l'autenticazione di Windows, l'elenco dei ruoli è costituito dall'insieme dei gruppi di Windows a cui l'utente appartiene.

Il codice riportato di seguito illustra la procedura per ottenere l'identità dell'utente di Windows autenticato ed eseguire una semplice verifica dei ruoli per l'autorizzazione.

WindowsPrincipal user = User as WindowsPrincipal;
if (null != user)
{
  string username = user.Identity.Name;
  // Perform a role check
  if ( user.IsInRole(@"DomainName\Manager") )
  {
    // User is authorized to perform manager functionality
  }
}
else
{
  // Throw security exception as we don't have a WindowsPrincipal
}  

Autenticazione basata su moduli

Quando si utilizza l'autenticazione basata su moduli, la sequenza di eventi avviata da un utente autenticato che tenta di accedere a un file o a una risorsa protetti (caso in cui l'autorizzazione dell'URL nega l'accesso all'utente) viene illustrata nella figura 8.5.

Sequenza di eventi dell'autenticazione basata su moduli

Figura 8.5
Sequenza di eventi dell'autenticazione basata su moduli

La sequenza di eventi illustrata nella figura 8.5 è la seguente:

1.

L'utente invia una richiesta Web per Default.aspx.

IIS consente la richiesta in quanto l'accesso anonimo è stato attivato. ASP.NET controlla gli elementi <authorization> e individua un elemento <deny users>=?" /.

2.

L'utente viene reindirizzato alla pagina di accesso Login.aspx, come indicato dall'attributo loginUrl dell'elemento <forms>.

3.

L'utente fornisce le credenziali e invia il modulo di accesso.

4.

Le credenziali vengono convalidate rispetto a un archivio (SQL Server o Active Directory) e, facoltativamente, vengono recuperati i ruoli. Se si desidera utilizzare l'autorizzazione basata sui ruoli è necessario recuperare un elenco dei ruoli.

5.

Viene creato un cookie con un FormsAuthenticationTicket che viene quindi inviato di nuovo al client. Se si desidera, i ruoli vengono archiviati nel ticket. L'archiviazione dell'elenco dei ruoli nel ticket consente di evitare l'accesso al database per recuperare di nuovo l'elenco a ogni richiesta Web successiva dello stesso utente.

6.

Con il reindirizzamento sul lato client, l'utente viene reindirizzato alla pagina originariamente richiesta (Default.aspx).

7.

Nel gestore eventi Application_AuthenticateRequest in Global.asax, il ticket viene utilizzato per creare un oggetto IPrincipal e viene quindi archiviato in HttpContext.User.

ASP.NET controlla gli elementi <<authorization> e individua un elemento <<deny users>=?" /. Tuttavia, questa volta l'utente viene autenticato.

ASP.NET controlla gli elementi authorization per verificare che l'utente sia presente nell'elemento <allow>.

All'utente viene concesso l'accesso alla pagina Default.aspx.

Procedura di sviluppo per l'autenticazione basata su moduli

Nell'elenco riportato di seguito vengono indicati i passaggi principali necessari per implementare l'autenticazione basata su moduli:

1.

Configurare IIS per l'accesso anonimo.

2.

Configurare ASP.NET per l'autenticazione basata su moduli.

3.

Creare un modulo Web di accesso e convalidare le credenziali fornite.

4.

Recuperare un elenco dei ruoli dall'archivio dati personalizzato.

5.

Creare un ticket di autenticazione basata su moduli e archiviare i ruoli nel ticket.

6.

Creare un oggetto IPrincipal.

7.

Inserire l'oggetto IPrincipal nel contesto HTTP corrente.

8.

Autorizzare l'utente in base al nome utente o all'appartenenza ai ruoli.

Configurazione di IIS per l'accesso anonimo

È necessario configurare la directory virtuale dell'applicazione in IIS per l'accesso anonimo.

Per configurare IIS per l'accesso anonimo

1.

Avviare lo strumento di amministrazione di Internet Information Services.

2.

Selezionare la directory virtuale dell'applicazione, fare clic con il pulsante destro del mouse su di essa, quindi scegliere Proprietà.

3.

Fare clic su Directory Security.

4.

Nel gruppo Controllo autenticazione e accesso anonimo, fare clic su Modifica.

5.

Selezionare Accesso anonimo.

Configurazione di ASP.NET per l'autenticazione basata su moduli

Di seguito viene riportato un esempio di configurazione.

<authentication mode="Forms">
  <forms name="MyAppFormsAuth" 
       loginUrl="login.aspx" 
       protection="Encryption"
       timeout="20" 
       path="/" >
  </forms>
</authentication>

Creazione di un modulo Web di accesso e convalida delle credenziali fornite

Convalidare le credenziali rispetto a un database SQL Server o ad Active Directory.

Ulteriori informazioni

Vedere "Procedura - Utilizzo dell'autenticazione basata su moduli mediante SQL Server 2000" in questa guida.

Vedere "Procedura - Utilizzo dell'autenticazione basata su moduli mediante Active Directory" in questa guida.

Recupero di un elenco dei ruoli dall'archivio dati personalizzato

Ottenere ruoli da una tabella all'interno del database SQL Server o gruppi/liste di distribuzione configurati all'interno di Active Directory. Per informazioni dettagliate, fare riferimento alle risorse precedenti.

Creazione di un ticket di autenticazione basata su moduli

Archiviare i ruoli recuperati nel ticket. L'operazione viene illustrata nel codice riportato di seguito.

// This event handler executes when the user clicks the Logon button
// having supplied a set of credentials
private void Logon_Click(object sender, System.EventArgs e)
{
  // Validate credentials against either a SQL Server database
  // or Active Directory
  bool isAuthenticated = IsAuthenticated( txtUserName.Text, 
                                          txtPassword.Text );
  if (isAuthenticated == true )
  {
    // Retrieve the set of roles for this user from the SQL Server
    // database or Active Directory. The roles are returned as a
    // string that contains pipe separated role names
    // for example "Manager|Employee|Sales|"
    // This makes it easy to store them in the authentication ticket

    string roles = RetrieveRoles( txtUserName.Text, txtPassword.Text );

    // Create the authentication ticket and store the roles in the
    // custom UserData property of the authentication ticket
    FormsAuthenticationTicket authTicket = new 
       FormsAuthenticationTicket(
                    1,                          // version
                    txtUserName.Text,           // user name
                    DateTime.Now,               // creation
                    DateTime.Now.AddMinutes(20),// Expiration
                    false,                      // Persistent
                    roles );                    // User data
     // Encrypt the ticket.
     string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
     // Create a cookie and add the encrypted ticket to the 
     // cookie as data.
     HttpCookie authCookie = 
               new HttpCookie(FormsAuthentication.FormsCookieName,
                              encryptedTicket);

     // Add the cookie to the outgoing cookies collection. 
     Response.Cookies.Add(authCookie); 
     // Redirect the user to the originally requested page
     Response.Redirect( FormsAuthentication.GetRedirectUrl(
                        txtUserName.Text, 
                        false ));
  }
}

Creazione di un oggetto IPrincipal

Creare l'oggetto IPrincipal nel gestore eventi Application_AuthenticationRequest in Global.asax. Utilizzare la classe GenericPrincipal, a meno che sia necessaria la funzionalità estesa basata sui ruoli. In tal caso, creare una classe personalizzata che implementa IPrincipal.

Inserimento dell'oggetto IPrincipal nel contesto HTTP corrente

Di seguito viene illustrata la creazione di un oggetto GenericPrincipal.

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
  // Extract the forms authentication cookie
  string cookieName = FormsAuthentication.FormsCookieName;
  HttpCookie authCookie = Context.Request.Cookies[cookieName];
  if(null == authCookie)
  {
    // There is no authentication cookie.
    return;
  } 
  FormsAuthenticationTicket authTicket = null;
  try
  {
    authTicket = FormsAuthentication.Decrypt(authCookie.Value);
  }
  catch(Exception ex)
  {
    // Log exception details (omitted for simplicity)
    return;
  }
  if (null == authTicket)
  {
    // Cookie failed to decrypt.
    return; 
  }
  // When the ticket was created, the UserData property was assigned a
  // pipe delimited string of role names.
  string[] roles = authTicket.UserData.Split(new char[]{'|'});

  // Create an Identity object
  FormsIdentity id = new FormsIdentity( authTicket ); 
  // This principal will flow throughout the request.
  GenericPrincipal principal = new GenericPrincipal(id, roles);
  // Attach the new principal object to the current HttpContext object
  Context.User = principal;
}

Autorizzazione dell'utente in base al nome utente o all'appartenenza ai ruoli

Per limitare l'accesso ai metodi, utilizzare le richieste di autorizzazione del principal dichiarative. Per eseguire l'autorizzazione specifica all'interno dei metodi, utilizzare le richieste di autorizzazione del principal imperative e/o i controlli dei ruoli espliciti (IPrincipal.IsInRole).

Indicazioni sull'implementazione dei moduli

Quando si acquisiscono le credenziali tramite un modulo HTML, è consigliabile utilizzare il protocollo SSL.
Oltre alla pagina di accesso, è bene utilizzare il protocollo SSL anche per le altre pagine, in tutti i casi in cui le credenziali o il cookie di autenticazione vengono trasmessi attraverso la rete. In questo modo è possibile ridurre il rischio associato agli attacchi di riproduzione dei cookie.

Autenticare gli utenti rispetto a un archivio dati personalizzato. Utilizzare SQL Server o Active Directory.

Recuperare un elenco dei ruoli dall'archivio dati personalizzato e archiviare un elenco delimitato di ruoli all'interno della proprietà UserData della classe FormsAuthenticationTicket. In tal modo si elimina la necessità di accedere ripetutamente all'archivio dati per ciascuna richiesta Web e si evita di archiviare le credenziali dell'utente nel cookie di autenticazione, con un conseguente miglioramento delle prestazioni.

Se le dimensioni dell'elenco dei ruoli sono eccessive ed esiste il rischio di superare il limite consentito per le dimensioni dei cookie, è possibile archiviare i dettagli dei ruoli nell'oggetto cache o nel database ASP.NET e recuperarli in seguito per ciascuna richiesta.

Per ognuna di esse, dopo l'autenticazione iniziale, è necessario effettuare le seguenti operazioni:

Recuperare i ruoli dal ticket nel gestore eventi Application_AuthenticateRequest.

Creare un oggetto IPrincipal e archiviarlo nel contesto HTTP (HttpContext.User). Anche .NET Framework lo associa al thread .NET corrente (Thread.CurrentPrincipal).

Utilizzare la classe GenericPrincipal, a meno che sia necessario creare un'implementazione IPrincipal personalizzata per motivi specifici, ad esempio per supportare operazioni avanzate basate sui ruoli.

Utilizzare due cookie, uno per la personalizzazione e uno per l'autenticazione e l'autorizzazione protetta. Rendere permanente la personalizzazione del cookie, assicurandosi che non contenga informazioni che consentirebbero a una richiesta di eseguire un'operazione a cui sono applicate limitazioni, ad esempio l'inoltro di un ordine in un'area protetta di un sito.

Mediante l'attributo Forms dell'elemento <forms>, utilizzare un nome e un percorso diversi per il cookie in ciascuna applicazione Web. In tal modo gli utenti autenticati rispetto a un'applicazione non verranno considerati autenticati quando utilizzeranno una seconda applicazione che risiede nello stesso server Web.

Assicurarsi che i cookie siano attivati nei browser client. Per l'approccio relativo all'autenticazione basata su moduli che non richiede cookie, vedere più avanti la sezione "Autenticazione basata su moduli senza cookie" in questo modulo.

Ulteriori informazioni

Vedere "Procedura - Utilizzo dell'autenticazione basata su moduli mediante SQL Server 2000" in questa guida.

Vedere "Procedura - Utilizzo dell'autenticazione basata su moduli mediante Active Directory" in questa guida.

Vedere "Procedura - Creazione di oggetti GenericPrincipal mediante l'autenticazione basata su moduli" in questa guida.

Hosting di più applicazioni con l'autenticazione basata su moduli

Se si sta eseguendo l'hosting di più applicazioni Web che utilizzano l'autenticazione basata su moduli nello stesso server Web, è possibile che un utente autenticato in un'applicazione invii una richiesta per un'altra applicazione senza tuttavia essere reindirizzato alla pagina di accesso di quest'ultima. È possibile che le regole di autorizzazione dell'URL all'interno della seconda applicazione neghino l'accesso all'utente, senza fornirgli tuttavia la possibilità di immettere le credenziali di accesso nell'apposito modulo.

Ciò si verifica soltanto se gli attributi di nome e percorso dell'elemento <forms> sono gli stessi per più applicazioni e ciascuna di esse utilizza un elemento <machineKey> comune nel file web.config.

Ulteriori informazioni

Per ulteriori informazioni su questo problema e sulle relative tecniche di risoluzione, vedere i seguenti articoli della Knowledge Base:

Q313116 "PRB: Forms Authentication Requests Are Not Directed to loginUrl Page" (in inglese)

Q310415 "PRB: Mobile Forms Authentication and Different Web Applications" (in inglese)

Autenticazione basata su moduli senza cookie

Se è necessario implementare una soluzione di autenticazione basata su moduli che non preveda l'uso di cookie, è consigliabile valutare l'opportunità di seguire l'approccio utilizzato in Microsoft Mobile Internet Toolkit. L'autenticazione mobile basata su moduli deriva dall'autenticazione semplice basata su moduli ma per trasmettere il ticket di autenticazione utilizza la stringa di query anziché i cookie.

Ulteriori informazioni

Per ulteriori informazioni sull'autenticazione mobile basata su moduli, vedere l'articolo Q311568 "INFO: How To Use Mobile Forms Authentication with Microsoft Mobile Internet Toolkit" della Microsoft Knowledge Base (in inglese).

Autenticazione Passport

È consigliabile utilizzare l'autenticazione Passport quando gli utenti dell'applicazione dispongono di account Passport e si desidera implementare una soluzione ad accesso singolo con altri siti che aderiscono al sistema Passport.

Quando si configura ASP.NET per l'autenticazione Passport, all'utente viene richiesto di eseguire una procedura di accesso al termine della quale viene reindirizzato al sito Passport. Una volta convalidate le credenziali, l'utente viene reindirizzato al sito originario.

Configurazione di ASP.NET per l'autenticazione Passport

Per configurare ASP.NET per l'autenticazione Passport, utilizzare le impostazioni del file web.config riportate di seguito.

<authentication mode="Passport">
  <passport redirectUrl="internal" />
</authentication>
<authorization>
  <deny users="?" />
  <allow users="*" />
</authorization>

Mapping di un identità Passport nei ruoli in Global.asax

Per associare un'identità Passport nei ruoli, implementare il gestore eventi PassportAuthentication_OnAuthentication in Global.asax come illustrato di seguito.

void PassportAuthentication_OnAuthenticate(Object sender, 
                                           PassportAuthenticationEventArgs e)
{
  if(e.Identity.Name == "0000000000000001")
  {
    string[] roles = new String[]{"Developer", "Admin", "Tester"};
    Context.User = new GenericPrincipal(e.Identity, roles);
  }
}

Verifica dell'appartenenza ai ruoli

Il frammento di codice riportato di seguito mostra la procedura necessaria per recuperare l'identità Passport autenticata e verificare l'appartenenza ai ruoli in una pagina aspx.

PassportIdentity passportId = Context.User.Identity as PassportIdentity;
if (null == passportId)
{
  Response.Write("Not a PassportIdentity<br>");
  return;
}
Response.Write("IsInRole: Develeoper? " + Context.User.IsInRole("Developer"));

Autenticazione personalizzata

Se nessuno dei moduli di autenticazione forniti con .NET Framework soddisfa le esigenze di autenticazione specifiche, è possibile implementare un meccanismo di autenticazione personalizzato. Ad esempio, è possibile che la propria azienda disponga già di una strategia di autenticazione personalizzata ampiamente utilizzata da altre applicazioni.

Per implementare l'autenticazione personalizzata in ASP.NET, effettuare le seguenti operazioni:

Configurare la modalità di autenticazione nel file web.config come indicato di seguito. In tal modo si segnala ad ASP.NET di non richiamare nessuno dei moduli di autenticazione incorporati.

<authentication mode="None" />

Creare una classe che implementa l'interfaccia System.Web.IHttpModule per la creazione di un modulo HTTP personalizzato. Tale modulo esegue un hook dell'evento HttpApplication.AuthenticateRequest e fornisce un delegato da chiamare ogni volta che viene presentata una richiesta all'applicazione nei casi in cui è necessaria l'autenticazione.

Un modulo di autenticazione deve effettuare le seguenti operazioni:

Ottenere le credenziali dal chiamante.

Convalidare le credenziali rispetto a un archivio.

Creare un oggetto IPrincipal e archiviarlo in HttpContext.User.

Creare e proteggere un token di autenticazione e inviarlo di nuovo all'utente, generalmente all'interno di una stringa di query, un cookie o un campo nascosto di un modulo.

Ottenere il token di autenticazione per le richieste successive, convalidarlo e inviarlo di nuovo.

Ulteriori informazioni

Per ulteriori informazioni sulla procedura di implementazione di un modulo HTTP personalizzato, vedere l'articolo Q307996 "HOW TO: Create an ASP.NET HTTP Module Using Visual C# .NET" (in inglese) della Microsoft Knowledge Base.

Identità del processo per ASP.NET

Eseguire ASP.NET, in particolare il processo di lavoro Aspnet_wp.exe, mediante un account con privilegi minimi.

Utilizzo di un account con privilegi minimi

Utilizzare un account con privilegi minimi per ridurre il rischio associato alla compromissione dei processi. Se un pirata informatico particolarmente determinato riesce a compromettere il processo ASP.NET che esegue l'applicazione Web, può facilmente ereditare e sfruttare i privilegi e i diritti di accesso di cui dispone l'account del processo. Un account configurato con privilegi minimi consente di limitare gli eventuali danni potenziali.

Motivi per evitare l'esecuzione come SYSTEM

Evitare di utilizzare l'account SYSTEM, dotato di privilegi massimi, per eseguire ASP.NET e non concedere il privilegio "Agisci come parte del sistema operativo" all'account del processo ASP.NET. In alcuni casi si ricorre a una delle due opzioni per consentire al codice di chiamare l'API LogonUser in modo da ottenere un'identità fissa, in genere per l'accesso alle risorse di rete. Per informazioni su approcci alternativi, vedere più avanti la sezione "Accesso alle risorse di rete" in questo modulo.

È consigliabile evitare di ricorrere all'esecuzione come SYSTEM o di concedere il privilegio "Agisci come parte del sistema operativo" per i seguenti motivi:

Viene accentuato in modo significativo il danno potenziale causato da un pirata informatico in caso di compromissione del sistema, senza influire tuttavia sul rischio di vulnerabilità a questo tipo di attacco.

Vengono annullati i vantaggi derivanti dall'applicazione del principio dei privilegi minimi. L'account ASPNET è stato configurato in modo specifico come account con privilegi minimi progettato per l'esecuzione delle applicazioni Web ASP.NET.

Ulteriori informazioni

Per ulteriori informazioni sul privilegio "Agisci come parte del sistema operativo", vedere la rubrica Security Briefs del Microsoft Systems Journal nell'edizione dell'agosto 1999.

Controller di dominio e account del processo ASP.NET

In generale, una compromissione del server comporterebbe la compromissione del dominio e non è pertanto consigliabile eseguire il server Web in un controller di dominio. Se è indispensabile eseguire ASP.NET in un controller di dominio, è necessario concedere all'account del processo ASP.NET i privilegi appropriati, come indicato nell'articolo Q315158 "BUG: ASP.NET Does Not Work with the Default ASPNET Account on a Domain Controller" (in inglese) della Microsoft Knowledge Base.

Utilizzo dell'account predefinito ASPNET

L'account ASPNET locale è stato configurato appositamente per eseguire applicazioni Web ASP.NET con il minor numero possibile di privilegi. Se possibile, è preferibile quindi utilizzare tale account.

Per impostazione predefinita, le applicazioni Web ASP.NET vengono eseguite utilizzando questo account in base alla configurazione dell'elemento <processModel> nel file machine.config.

<processModel userName="machine" password="AutoGenerate" />

Nota: il nome utente machine indica l'account ASPNET. Quanto si installa .NET Framework, viene creato l'account con una password sicura crittografata. Oltre a essere configurata all'interno del database del sistema di gestione degli account di protezione (SAM), la password viene anche archiviata all'interno dell'autorità di protezione locale (LSA) nel computer locale. Quando il sistema avvia il processo di lavoro ASP.NET, recupera la password dall'autorità di protezione locale.

Se l'applicazione accede alle risorse di rete, è necessario che l'account ASPNET possa essere autenticato dal computer remoto. Le opzioni possibili sono due.

Reimpostare su un valore noto la password dell'account ASPNET e creare quindi un account duplicato, con nome e password identici, nel computer remoto. L'approccio descritto è l'unico possibile nei seguenti casi:

Il server Web e il computer remoto si trovano in domini distinti senza alcuna relazione di trust.

Il server Web e il computer remoto sono separati da un firewall e non si desidera aprire le porte necessarie per supportare l'autenticazione di Windows.

Se l'obiettivo principale è quello di semplificare l'amministrazione, utilizzare un account di dominio con privilegi minimi.
Per evitare di aggiornare e sincronizzare manualmente le password, è possibile utilizzare un account di dominio con privilegi minimi per eseguire ASP.NET. È essenziale che l'account di dominio sia completamente bloccato al fine di ridurre al minimo il rischio di compromissione del processo. Se un pirata informatico riesce a compromettere il processo di lavoro ASP.NET, potrà accedere anche alle risorse di dominio, a meno che l'account sia stato completamente bloccato.

Nota: se l'account locale utilizzato viene compromesso, gli unici computer esposti agli attacchi sono quelli in cui sono stati creati account duplicati. Se si utilizza un account di dominio, questo è visibile su ogni computer del dominio. Per accedere agli altri computer, è necessario tuttavia che l'account disponga dell'apposita autorizzazione.

Elemento <processModel>

L'elemento <processModel> nel file machine.config contiene gli attributi userName e password, che specificano l'account da utilizzare per l'esecuzione del processo di lavoro ASP.NET (Aspnet_wp.exe).

Nota: a differenza della modalità di esecuzione delle applicazioni ASP tradizionali, il codice ASP.NET non viene mai eseguito nel processo dllhost.exe o come account IWAM_MACHINENAME, anche quando il livello di protezione dell'applicazione è impostato su Alta (isolata) in IIS.

Le richieste ASP.NET inviate a IIS vengono indirizzate direttamente al processo di lavoro ASP.NET (Aspnet_wp.exe). L'estensione ISAPI ASP.NET, Aspnet_isapi.dll, viene eseguita nello spazio degli indirizzi del processo IIS (Inetinfo.exe) ed è controllata dalla voce di metabase InProcessIsapiApps, che non deve essere modificata. L'estensione ISAPI è responsabile del routing delle richieste al processo di lavoro ASP.NET. Le applicazioni ASP.NET vengono quindi eseguite nel processo di lavoro ASP.NET, dove i relativi domini forniscono i limiti di isolamento.

La versione 6 di IIS consentirà di isolare le applicazioni ASP.NET tramite la configurazione dei pool di applicazioni, dove ogni pool potrà disporre della propria istanza di applicazione.

Per la configurazione dell'attributo <processModel> userName sono disponibili diverse opzioni. Ad esempio:

"machine". Il processo di lavoro viene eseguito come account ASPNET predefinito con privilegi minimi. L'account dispone dell'accesso alla rete ma non può essere autenticato in nessun altro computer della rete poiché si tratta di un account locale per il computer in uso e nessuna autorità può garantire per esso. Nella rete, questo account viene rappresentato come "MachineName\ASPNET".

"system". Il processo di lavoro viene eseguito come account SYSTEM locale. L'account dispone di privilegi estesi sul computer locale e inoltre può accedere alla rete utilizzando le credenziali del computer. Nella rete, questo account viene rappresentato come " DomainName\MachineName$".

Credenziali specifiche. Quando vengono fornite le credenziali per userName e password, è necessario tenere conto del principio dei privilegi minimi. Se si specifica un account locale, l'applicazione Web non può essere autenticata in rete a meno che venga creato un account duplicato nel computer remoto. Se si sceglie di utilizzare un account di dominio con privilegi minimi, assicurarsi che non disponga dell'autorizzazione per accedere a più computer in rete di quanti non siano necessari.

Archiviazione di credenziali <processModel> crittografate

Se si utilizzano credenziali personalizzate, archiviarle in forma crittografata nel Registro di sistema mediante l'utilità aspnet_setreg.exe. Evitare di archiviare credenziali non crittografate nel file machine.config.

Per informazioni dettagliate su questa utilità e sul relativo download, vedere l'articolo Q329290 "HOW TO: Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings" (in inglese) della Microsoft Knowledge Base.

Nell'esempio riportato di seguito viene illustrato il formato degli attributi userName e password rispettivamente prima e dopo l'utilizzo di questa utilità. Si noti che i valori di attributo puntano alla chiave del Registro di sistema e ai valori denominati protetti contenenti le credenziali crittografate.

<!-- Before -->
<processModel userName="SomeCustomAccount"
              password="ClearTextPassword" . . ./>

<!-- After -->
<processModel
        userName="registry:HKLM\SOFTWARE\YourSecureApp\processModel\
                  ASPNET_SETREG,userName"
        password="registry:HKLM\SOFTWARE\YourSecureApp\processModel\
                  ASPNET_SETREG,password" . . ./>
   

Ulteriori informazioni

Per ulteriori informazioni sull'accesso alle risorse di rete dalle applicazioni Web ASP.NET, vedere più avanti la sezione "Accesso alle risorse di rete" in questo modulo.

Per informazioni dettagliate sulla procedura di creazione di un account personalizzato per l'esecuzione di ASP.NET, vedere "Procedura - Creazione di un account personalizzato per eseguire ASP.NET" in questa guida.

Rappresentazione

Con l'introduzione di FileAuthorizationModule e l'utilizzo efficiente dei gatekeeper e dei limiti di attendibilità, la rappresentazione potrebbe presentare più svantaggi che vantaggi per ASP.NET.

Rappresentazione e risorse locali

Se si utilizza la rappresentazione per accedere alle risorse locali dal codice dell'applicazione Web, è necessario configurare gli ACL allegati a ciascuna risorsa protetta in modo che contengano una voce di controllo di accesso che conceda all'utente autenticato almeno l'accesso in lettura.

Un approccio migliore consiste nell'evitare la rappresentazione, concedere le autorizzazioni all'account del processo ASP.NET e utilizzare l'autorizzazione dell'URL, l'autorizzazione del file e una combinazione di controlli basati sui ruoli di tipo sia dichiarativo che imperativo.

Rappresentazione e risorse remote

Se si utilizza la rappresentazione e quindi si accede alle risorse remote dal codice dell'applicazione Web, la procedura di accesso avrà esito positivo solo a condizione che venga utilizzata l'autenticazione di base, basata su moduli o Kerberos. Se si utilizza l'autenticazione Kerberos, è necessario configurare opportunamente gli account utente per la delega e contrassegnarli con l'opzione "L'account è sensibile e non può essere delegato" all'interno di Active Directory.

Ulteriori informazioni

Per ulteriori informazioni sulla procedura di configurazione della delega Kerberos, vedere quanto segue:

"Trasferimento del chiamante originale " nel modulo 5 "Protezione di applicazioni Intranet".

"Procedura - Implementazione della delega Kerberos per Windows 2000" in questa guida.

Rappresentazione e threading

Se un thread che sta eseguendo la rappresentazione crea un nuovo thread, quest'ultimo eredita il contesto di protezione dell'account del processo ASP.NET anziché quello dell'account rappresentato.

Accesso alle risorse di sistema

Per impostazione predefinita, ASP.NET non esegue alcuna rappresentazione. Se l'applicazione Web accede alle risorse del sistema locale, l'accesso viene eseguito pertanto mediante il contesto di protezione associato al processo di lavoro Aspnet_wp.exe. Il contesto di protezione è determinato dall'account utilizzato per eseguire il processo di lavoro.

Accesso al registro eventi

Gli account con privilegi minimi dispongono di autorizzazioni sufficienti per scrivere dei record nel registro eventi mediante le origini eventi esistenti. Non dispongono tuttavia delle autorizzazioni necessarie per creare nuove origini eventi, per le quali è necessario immettere una nuova voce al di sotto dell'hive del Registro di sistema.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\<log>

Per evitare questo problema, creare le origini eventi utilizzate dall'applicazione al momento dell'installazione, quando sono disponibili i privilegi di amministratore. Un approccio ottimale consiste nell'utilizzo di una classe del programma di installazione .NET di cui è possibile creare un'istanza mediante Windows Installer se si utilizza la distribuzione msi o, in caso contrario, mediante l'utilità di sistema InstallUtil.exe.

Se non è possibile creare le origini eventi al momento dell'installazione, è necessario aggiungere l'autorizzazione alla chiave del Registro di sistema seguente e concedere l'accesso all'account del processo ASP.NET di qualsiasi account rappresentato, qualora l'applicazione utilizzi la rappresentazione.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog 

Gli account devono disporre delle seguenti autorizzazioni minime:

Ricerca valore chiave

Impostazione valore chiave

Creazione sottochiave

Enumerazione sottochiavi

Notifica

Lettura

Per scrivere nel registro eventi dell'applicazione da ASP.NET dopo avere applicato le autorizzazioni al Registro di sistema, è possibile utilizzare il seguente codice:

string source = "Your Application Source";
string logToWriteTo = "Application";
string eventText = "Sample Event";

if (!EventLog.SourceExists(source))
{
  EventLog.CreateEventSource(source, logToWriteTo);
}
EventLog.WriteEntry(source, eventText, EventLogEntryType.Warning, 234);

Accesso al Registro di sistema

Per accedere a qualsiasi chiave del Registro di sistema dall'applicazione è necessario disporre di una voce di controllo di accesso nell'ACL che conceda almeno l'accesso in lettura all'account del processo ASP.NET.

Ulteriori informazioni

Per ulteriori informazioni sulle classi dei programmi di installazione e sull'utilità InstallUtil.exe, vedere la sezione ".NET Framework Tools" (in inglese) nel sito MSDN.

Accesso agli oggetti COM

Nei contesti ASP tradizionali, le richieste vengono elaborate mediante thread del pool STA (Single Threaded Apartment). In ASP.NET, le richieste vengono invece elaborate mediante thread del pool MTA (Multithreaded Apartment). Il tipo di elaborazione influisce sulle applicazioni Web ASP.NET che chiamano gli oggetti del modello di threading Apartment.

Oggetti del modello Apartment

Quando un'applicazione Web ASP.NET chiama un oggetto del modello Apartment, ad esempio un oggetto Visual Basic 6 COM, è necessario tenere presente i due punti seguenti:

È necessario contrassegnare la pagina ASP.NET con l'istruzione AspCompat , come indicato di seguito.

<%@ Page Language="C#" AspCompat="True" %>

Evitare di creare gli oggetti COM al di fuori di gestori eventi Page specifici. Creare sempre gli oggetti COM in gestori eventi Page quali Page_Load e Page_Init ed evitare di crearli nel costruttore della pagina.

Perché è necessaria l'istruzione AspCompat

Per impostazione predefinita, ASP.NET utilizza i thread MTA per elaborare le richieste. Quando un oggetto del modello Apartment viene chiamato da ASP.NET, si verifica pertanto una commutazione di thread in quanto non è possibile accedere direttamente a tale oggetto mediante thread MTA. In COM, infatti, viene utilizzato un thread STA.

Se si specifica AspCompat, la pagina viene elaborata da un thread STA, evitando in tal modo la commutazione da thread MTA a thread STA. Questo aspetto assume importanza in termini di protezione nel caso in cui l'applicazione Web stia eseguendo la rappresentazione, in quanto la commutazione di thread determina la perdita del token di rappresentazione. In questo caso, al nuovo thread non viene associato alcun token di rappresentazione.

L'istruzione AspCompat non è supportata dai servizi Web ASP.NET. Quando si chiama un oggetto del modello Apartment dal codice del servizio Web, si verifica pertanto una commutazione di thread e si perde il token di rappresentazione del thread, generando di solito un'eccezione di Accesso negato.

Ulteriori informazioni

Per ulteriori informazioni, consultare i seguenti articoli della Knowledge Base:

Articolo Q303375 "INFO: XML Web Services and Apartment Objects" (in inglese)

Articolo Q325791 "PRB: Access Denied Error Message Occurs When You Impersonate an Account in ASP.NET and Then Call STA COM Components" (in inglese)

Per ulteriori informazioni sulla procedura per determinare l'identità del codice in esecuzione, vedere la sezione "Determinazione dell'identità" del modulo 13 "Risoluzione dei problemi di protezione".

Perché evitare la creazione di oggetti COM al di fuori di eventi Page specifici

È consigliabile evitare di creare gli oggetti COM al di fuori di gestori eventi Page specifici. Nel frammento di codice riportato di seguito vengono illustrati gli errori da evitare.

<%@ Page Language="C#" AspCompat="True" %>
<script runat="server">
  // COM object created outside of Page events
  YourComObject obj = new apartmentObject();
  public void Page_Load()
  {
    obj.Foo()
  }
</script>

Quando si utilizzano oggetti del modello Apartment è importante creare l'oggetto all'interno di eventi Page specifici, ad esempio Page_Load, come indicato di seguito.

<%@ Page Language="C#" AspCompat="True" %>
<script runat="server">
public void Page_Load()
{
  YourComObject obj  = new apartmentObject();
  obj.Foo()
}
</script>

Ulteriori informazioni

Per ulteriori informazioni, vedere l'articolo Q308095 , "PRB: Creating STA Components in the Constructor in ASP.NET ASPCOMPAT Mode Negatively Impacts Performance" (in inglese) della Microsoft Knowledge Base.

Oggetti C# e VB .NET in COM+

Lo strumento di sviluppo Microsoft C#(r) e il sistema di sviluppo Microsoft Visual Basic(r) .NET supportano tutti i modelli di threading, ovvero Free-threaded, Neutral, Both e Apartment. Per impostazione predefinita, quando l'hosting degli oggetti C# e Visual Basic .NET viene eseguito in COM+, gli oggetti sono contrassegnati come Both. Di conseguenza, quando vengono chiamati da ASP.NET, l'accesso è diretto e non si verifica alcuna commutazione di thread.

Accesso alle risorse di rete

È probabile che l'applicazione debba accedere alle risorse di rete. In tal caso, è importante identificare quanto segue:

Le risorse a cui l'applicazione deve accedere.

Ad esempio, file in condivisioni file, database, server DCOM, oggetti Active Directory e così via.

L'identità utilizzata per eseguire l'accesso alle risorse.

Se l'applicazione in uso accede a risorse remote, è necessario che l'identità possa essere autenticata dal computer remoto.

Nota: per informazioni specifiche sull'accesso ai database SQL Server remoti, vedere il modulo 12 "Protezione dell'accesso ai dati".

È possibile accedere alle risorse remote dall'applicazione ASP.NET mediante una delle seguenti tecniche:

Utilizzo dell'identità del processo ASP.NET

Utilizzo di un componente servito

Utilizzo dell'account utente Internet anonimo, ad esempio IUSR_MACHINE

Utilizzo dell'API LogonUser e rappresentazione di un'identità di Windows specifica

Utilizzo del chiamante originale

Utilizzo dell'identità del processo ASP.NET

Se l'applicazione non è configurata per la rappresentazione e tenta di accedere alle risorse remote, l'identità del processo ASP.NET fornisce l'identità predefinita. Se si desidera utilizzare l'account del processo ASP.NET per l'accesso alle risorse remote, è possibile scegliere tra le tre alternative seguenti:

Utilizzare account speculari.
Si tratta dell'approccio più semplice e consiste nel creare un account locale con nome utente e password corrispondenti sul computer remoto. È necessario modificare la password dell'account ASPNET in User Manager impostandola su un valore noto, preferibilmente una password sicura. Quindi impostarla in modo esplicito nell'elemento <processModel> del file machine.config e sostituire il valore "AutoGenerate" esistente. Evitare credenziali non crittografate. Archiviare le credenziali crittografate nel Registro di sistema mediante l'utilità aspnet_setreg.exe, come descritto in precedenza.

Importante: se si modifica la password di ASPNET impostandola su un valore noto, la password dell'autorità di protezione locale non corrisponderà più a quella dell'account Gestione account di protezione. Per ripristinare il valore predefinito "AutoGenerate" sarà necessario utilizzare una delle seguenti procedure:

Eseguire il file Aspnet_regiis.exe per reimpostare la configurazione predefinita di ASP.NET. Per ulteriori informazioni, vedere l'articolo Q306005 "HOW TO: Repair IIS Mapping After You Remove and Reinstall IIS" (in inglese) della Microsoft Knowledge Base.

Creare un account locale personalizzato con privilegi minimi per eseguire ASP.NET e crearne quindi un account duplicato nel computer remoto.

Eseguire ASP.NET utilizzando un account di dominio con privilegi minimi.

Questa procedura si basa sul presupposto che i computer client e server si trovino nello stesso dominio o in domini di tipo trusting.

Ulteriori informazioni

Per ulteriori informazioni sulla configurazione di un account del processo ASP.NET, vedere "Procedura - Creazione di un account personalizzato per eseguire ASP.NET" in questa guida.

Utilizzo di un componente servito

Per accedere alle risorse di rete è possibile utilizzare un componente servito out-of-process, configurato per essere eseguito come identità fissa. L'approccio descritto è illustrato nella figura 8.6.

Utilizzo di un componente servito out-of-process per fornire un'identità fissa per l'accesso alle risorse di rete

Figura 8.6
Utilizzo di un componente servito out-of-process per fornire un'identità fissa per l'accesso alle risorse di rete

L'utilizzo di un componente servito out-of-process in un'applicazione server Enterprise Services presenta i seguenti vantaggi:

Flessibilità in termini di identità utilizzata, evitando di fare affidamento esclusivamente sull'identità ASP.NET.

Possibilità di isolare codice trusted o con privilegi superiori dall'applicazione Web principale.

Presenza di un ulteriore hop di processo che aumenta il livello di protezione, rendendo di gran lunga più difficile ai pirati informatici attraversare il limite di un processo per passare ad un altro che richiede privilegi superiori.

Se è necessario eseguire manualmente la rappresentazione con le chiamate API LogonUser, è possibile scegliere a tale scopo un processo separato dall'applicazione Web principale.

Nota: per chiamare LogonUser è necessario assegnare il privilegio "Agisci come parte del sistema operativo" all'account del processo Enterprise Services. L'innalzamento dei privilegi di un processo separato dall'applicazione Web non presenta particolari rischi in termini di protezione.

Utilizzo dell'account utente Internet anonimo

Se IIS viene configurato per l'autenticazione anonima, è possibile accedere alle risorse di rete utilizzando l'account utente Internet anonimo. Tale approccio è consigliato se è vera una delle due condizioni seguenti:

L'applicazione supporta l'accesso anonimo.

L'applicazione utilizza l'autenticazione basata su moduli, Passport o personalizzata, a condizione che IIS sia configurato per l'accesso anonimo.

Per utilizzare l'account anonimo per l'accesso remoto alle risorse

1.

Configurare IIS per l'autenticazione anonima. È possibile impostare la modalità di autenticazione ASP.NET di Windows, basata su moduli, Passport o nessuna, in base ai requisiti di autenticazione dell'applicazione.

2.

Configurare ASP.NET per la rappresentazione. Utilizzare l'impostazione seguente nel file web.config:

<identity impersonate="true" />

3.

Configurare l'account anonimo come account di dominio con privilegi minimi.

- oppure -

Duplicare l'account anonimo utilizzando gli stessi nome utente e password nel computer remoto. Questo approccio è necessario quando si eseguono chiamate in domini non di tipo trusting o attraverso firewall in cui le porte necessarie per supportare l'autenticazione integrata di Windows non sono aperte.

Per supportare tale approccio è necessario effettuare inoltre le seguenti operazioni:

1.

Utilizzare la Gestione servizi Internet per deselezionare la casella di controllo Abilita controllo delle password dell'account anonimo.

Se si seleziona questa opzione, alla sessione di accesso creata con l'account anonimo specificato vengono assegnate le credenziali di rete NULL e non è quindi più possibile utilizzarla per accedere alle risorse di rete. Se invece non si seleziona questa opzione, la sessione di accesso è una sessione interattiva con credenziali di rete.

2.

Impostare le credenziali dell'account sia in User Manager che in Gestione servizi Internet.

Importante: se si esegue la rappresentazione dell'account anonimo, ad esempio IUSR_MACHINE, è necessario proteggere le risorse rispetto a questo account mediante ACL opportunamente configurati. È necessario che le risorse a cui l'applicazione deve accedere concedano almeno l'accesso in lettura per l'account anonimo. Tutte le altre risorse dovrebbero invece negare l'accesso all'account anonimo.

Hosting di più applicazioni Web

È possibile utilizzare un account utente Internet anonimo distinto per ciascuna directory principale virtuale contenuta nel sito Web. In un ambiente di hosting, ciò consente di autorizzare, registrare e controllare separatamente le richieste generate da applicazioni Web diverse. L'approccio descritto è illustrato nella figura 8.7.

Rappresentazione di account utente Internet anonimi per singola applicazione (v-dir)

Figura 8.7
Rappresentazione di account utente Internet anonimi per singola applicazione (v-dir)

Per configurare l'account utente Internet anonimo per una directory virtuale specifica

1.

Nel gruppo di programmi Strumenti di amministrazione, avviare Gestione servizi Internet.

2.

Selezionare la directory virtuale da configurare, fare clic su di essa con il pulsante destro del mouse, quindi scegliere Proprietà.

3.

Fare clic sulla scheda Protezione directory.

4.

Nel gruppo Controllo autenticazione e accesso anonimo, fare clic su Modifica.

5.

Selezionare Accesso anonimo, quindi fare clic su Modifica.

6.

Immettere il nome utente e la password dell'account che IIS deve utilizzare quando gli utenti anonimi si collegano al sito.

7.

Assicurarsi che l'opzione Abilita controllo delle password NON sia selezionata.

Utilizzo di LogonUser e rappresentazione di un'identità di Windows specifica

È possibile eseguire la rappresentazione di un'identità specifica configurando gli attributi di nome utente e password nell'elemento <identity> del file web.config o chiamando l'API LogonUser Win32(r) nel codice dell'applicazione.

Importante: Come descritto in precedenza in questo modulo, non è consigliabile utilizzare LogonUser o un'identità rappresentata fissa con .NET Framework 1.0 su server Windows 2000, in quanto impone l'assegnazione del privilegio "Agisci come parte del sistema operativo" all'account del processo ASP.NET.

In Windows .NET Server 2003 questa limitazione verrà eliminata. Nella versione 1.1 di .NET Framework verrà introdotto inoltre un miglioramento per questo scenario relativo a Windows 2000. L'accesso verrà eseguito dal processo IIS, in modo che ASP.NET non richieda il privilegio "Agisci come parte del sistema operativo".

Utilizzo del chiamante originale

Per utilizzare l'identità del chiamante originale per l'accesso remoto alle risorse è necessario che il server Web sia in grado di delegare il contesto di protezione del chiamante al computer remoto.

Avviso sulla scalabilità: l'accesso al livello dei servizi dati dell'applicazione tramite la rappresentazione dell'identità del chiamante originale influisce negativamente sulla scalabilità dell'applicazione, in quanto limita l'efficienza del pooling delle connessioni al database. Il contesto di protezione delle connessioni al database è diverso per ciascun utente.

La delega è supportata dai seguenti schemi di autenticazione:

Kerberos. Per ulteriori informazioni, vedere "Procedura - Implementazione della delega Kerberos per Windows 2000" in questa guida.

Certificati client associati agli account di Windows. Il mapping deve essere eseguito da IIS.

Di base. L'autenticazione di base supporta l'accesso remoto alle risorse poiché le credenziali del chiamante originale sono disponibili in formato testo non crittografato nel server Web. È possibile utilizzare tali credenziali per rispondere alle richieste di autenticazione dei computer remoti.
L'autenticazione di base deve essere utilizzata con una sessione di accesso interattiva o batch. Il tipo di sessione di accesso derivante dall'autenticazione di base può essere configurato nella metabase di IIS. Per ulteriori informazioni, vedere Platform SDK: Internet Information Services 5.1 (in inglese) nel sito MSDN.

Importante: tra gli approcci che supportano la delega, l'autenticazione di base è il meno sicuro poiché il nome utente e la password non crittografati vengono trasmessi in rete dal browser al server e vengono memorizzati nella cache del server Web. Per proteggere le credenziali durante il trasferimento è possibile utilizzare il protocollo SSL ma, se possibile, è consigliabile evitare di memorizzare nella cache del server Web le credenziali non crittografate.

Per utilizzare il chiamante originale per l'accesso remoto alle risorse

1.

Configurare IIS per l'autenticazione integrata di Windows (Kerberos), con certificato (mediante il mapping dei certificati IIS) o di base.

2.

Configurare ASP.NET per l'autenticazione di Windows e la rappresentazione.

<authentication mode="Window" />
<identity impersonate="true" />

3.

Se si utilizza la delega Kerberos, configurare gli account Active Directory per la delega.

Ulteriori informazioni

Per ulteriori informazioni sulla configurazione della delega Kerberos, vedere "Procedura - Implementazione della delega Kerberos per Windows 2000" in questa guida.

Per ulteriori informazioni sul mapping dei certificati IIS, vedere http://www.microsoft.com/technet/treeview/default.asp?url=/technet/prodtechnol/ad/windows2000/howto/mapcerts.asp (in inglese).

Per ulteriori informazioni sulla rappresentazione ASP.NET, vedere .NET Framework Developers Guide (in inglese) nel sito MSDN.

Accesso ai file in una condivisione file UNC

Se l'applicazione deve accedere ai file inclusi in una condivisione UNC (Universal Naming Convention) tramite ASP.NET, è importante aggiungere le autorizzazioni NTFS alla cartella della condivisione. È necessario impostare anche le autorizzazioni della condivisione affinché concedano almeno l'accesso in lettura all'account del processo ASP.NET o all'identità di cui si esegue la rappresentazione, qualora sia prevista dalla configurazione dell'applicazione.

Accesso a risorse di rete diverse da Windows

Se l'applicazione deve accedere a risorse diverse da Windows quali i database situati in piattaforme o in applicazioni mainframe diverse da Windows, è necessario tenere presente quanto segue:

Gatekeeper e limiti di trust associati alla risorsa in questione

Credenziali necessarie per l'autenticazione

Determinare se la risorsa deve conoscere l'identità del chiamante originale o considerare attendibile l'applicazione chiamante, utilizzando un'identità fissa di processo o di servizio.

Costo delle prestazioni previsto per stabilire le connessioni. Qualora tale costo sia significativo, può essere necessario implementare il pool delle connessioni, ad esempio utilizzando la funzione di pooling degli oggetti di Enterprise Services.

Se la risorsa deve essere in grado di autenticare il chiamante originale e non è possibile scegliere l'autenticazione di Windows, sono disponibili le seguenti opzioni:

Trasmettere le credenziali utilizzando i parametri di chiamata di metodo.

Trasmettere le credenziali in una stringa di connessione. Utilizzare i protocolli SSL o IPSec per proteggere le credenziali non crittografate trasmesse in rete.
Archiviare in modo sicuro le credenziali nell'applicazione, ad esempio utilizzando DPAPI. Per ulteriori informazioni sulla procedura per archiviare in modo sicuro le stringhe di connessione al database, vedere "Archiviazione protetta delle stringhe di connessione al database" nel modulo 12 "Protezione dell'accesso ai dati".

Utilizzare un archivio dati centralizzato a cui possano accedere entrambe le piattaforme, ad esempio una directory LDAP.

Comunicazione protetta

Utilizzare il protocollo SSL per proteggere il collegamento di comunicazione tra browser e server Web. Il protocollo SSL garantisce la riservatezza e l'integrità dei messaggi. Utilizzare il protocollo SSL e/o IPSec per fornire un canale sicuro dal server Web al server applicazioni o al server di database.

Ulteriori informazioni

Per ulteriori informazioni sulla comunicazione protetta, vedere il modulo 4 "Comunicazione protetta".

Archiviazione di segreti

Per le applicazioni Web, spesso è necessario archiviare i segreti per salvaguardarli da amministratori inaffidabili e utenti Web malintenzionati.

Amministratori inaffidabili. È consigliabile non consentire la visualizzazione di informazioni privilegiate ad amministratori inaffidabili e ad altri utenti privi di scrupoli. Ad esempio, all'amministratore del server Web non dovrebbe essere consentito di leggere la password di un account di accesso a SQL Server su un computer SQL Server collegato alla rete.

Utenti Web malintenzionati. Sebbene esistano componenti come l'oggetto FileAuthorizationModule che impediscono l'accesso degli utenti a file privilegiati, è consigliabile archiviare il segreto in formato testo crittografato nel file di configurazione nell'eventualità che un pirata informatico riesca ad accedere al file.

Di seguito vengono elencati alcuni esempi tipici di segreti.

Stringhe di connessione SQL. È un errore assai diffuso quello di archiviare nome utente e password in testo non crittografato. Si consiglia pertanto di utilizzare l'autenticazione di Windows anziché l'autenticazione SQL. Se ciò non è possibile, vedere le sezioni successive del modulo 12 "Protezione dell'accesso ai dati", in cui sono presentate alcune alternative sicure.

"Archiviazione protetta delle stringhe di connessione al database"

"Comunicazione protetta"

Credenziali utilizzate per i ruoli di applicazioni SQL. Per attivare i ruoli di applicazioni SQL è necessaria una stored procedure che richiede il nome del ruolo e la password associata. Per ulteriori informazioni, vedere la sezione "Autorizzazione" nel modulo 12 "Protezione dell'accesso ai dati".

Identità fisse in web.config. Ad esempio:

<identity impersonate="true" userName="bob" password="inClearText"/>

L'utilità aspnet_setreg.exe consente di sostituire le credenziali in formato testo non crittografato con un puntatore alla chiave del Registro di sistema contenente le credenziali crittografate.

Identità del processo in machine.config. Ad esempio:

<process userName="cUsTuMUzerName" password="kUsTumPazzWerD" >

In base all'elemento <identity>, è consigliabile archiviare le credenziali crittografate nel Registro di sistema mediante l'utilità aspnet_setreg.exe.

Chiavi utilizzate per archiviare i dati in modo sicuro. È impossibile archiviare in modo sicuro le chiavi nel software. Tuttavia, alcune attività consentono di ridurre il rischio. Un esempio è la creazione di un gestore della sezione di configurazione personalizzata che utilizza la crittografia asimmetrica per crittografare una chiave di sessione, che quindi può essere archiviata in un file di configurazione.

Stato di sessione SQL Server. Per gestire lo stato di sessione dell'applicazione Web ASP.NET mediante SQL Server, utilizzare le seguenti impostazioni del file web.config.

<sessionState ... stateConnectionString="tcpip=127.0.0.1:42424"
                sqlConnectionString="data source=127.0.0.1;
                user id=UserName;password=MyPassword" />

L'utilità aspnet_setreg.exe supporta anche gli attributi stateConnectionString e sqlConnectionString per l'elemento <sessionState>, che consente di archiviare questi valori in formato crittografato nel Registro di sistema.

Password utilizzate per l'autenticazione basata su moduli rispetto a un database.

Se l'applicazione convalida le credenziali di autenticazione rispetto a un database, evitare di archiviare le password nel database. Utilizzare un hash della password con un valore salt e confrontare gli hash.

Per ulteriori informazioni, vedere "Autenticazione degli utenti rispetto a un database" nel modulo 12 "Protezione dell'accesso ai dati."

Opzioni per l'archiviazione di segreti in ASP.NET

Gli sviluppatori di applicazioni Web .NET possono disporre di vari approcci per l'archiviazione di segreti, tra cui:

Classi di crittografia .NET. .NET Framework comprende alcune classi che è possibile utilizzare per la crittografia e la decrittografia. In questo caso è necessario archiviare la chiave di crittografia in modo sicuro.

DPAPI (Data Protection API). L'interfaccia DPAPI è costituita da una coppia di API Win32 che consentono di crittografare e decrittografare i dati mediante una chiave derivata dalla password dell'utente. Quando si utilizza l'interfaccia DPAPI, la gestione delle chiavi viene eseguita dal sistema operativo, che controlla la chiave corrispondente alla password dell'utente.

Stringhe costruttore COM+. Se l'applicazione utilizza componenti serviti, è possibile archiviare il segreto in una stringa di costruzione oggetti nel catalogo COM+ in forma non crittografata.

CAPICOM. È un oggetto Microsoft COM che fornisce l'accesso COM alla funzione CryptoAPI sottostante.

CryptoAPI. Si tratta di API Win32 di basso livello che eseguono crittografia e decrittografia.

Ulteriori informazioni

Per ulteriori informazioni, vedere le voci relative a crittografia, CryptoAPI e CAPICOM in Platform SDK (in inglese) nel sito MSDN.

Archiviazione di segreti in file su volumi logici distinti

È possibile installare le directory delle applicazioni Web in un volume logico diverso da quello in cui è installato il sistema operativo, ad esempio E: anziché C:. In tal caso il file machine.config situato nella directory C:\WINNT\Microsoft.NET e gli eventuali altri file contenenti segreti, ad esempio i file UDL (Universal Data Link), si trovano in un volume logico diverso rispetto alle directory delle applicazioni Web.

L'obiettivo logico di questo approccio è garantire la protezione contro la normalizzazione dei file e gli errori di attraversamento delle directory, in quanto:

Gli errori di normalizzazione possono esporre i file nelle cartelle delle applicazioni Web.

Nota: le routine di normalizzazione dei file restituiscono la forma canonica del percorso di un file. In genere si tratta del percorso assoluto in cui tutti i riferimenti relativi e i riferimenti alla directory corrente sono stati interamente risolti.

Gli errori di attraversamento delle directory possono esporre i file in altre cartelle dello stesso volume logico.

Tuttavia non è stata ancora pubblicata alcuna documentazione sull'errore precedentemente descritto che espone i file in altri volumi logici.

Protezione dello stato di sessione e visualizzazione

Le applicazioni Web devono gestire tipi diversi di stato, tra cui lo stato di visualizzazione e lo stato di sessione. In questa sezione viene descritta la gestione protetta dello stato per le applicazioni Web ASP.NET.

Protezione dello stato di visualizzazione

Se le applicazioni Web ASP.NET utilizzano lo stato di visualizzazione, effettuare le seguenti operazioni:

Proteggere l'integrità dello stato di visualizzazione affinché non venga alterata in alcun modo durante il trasferimento, impostando enableViewStateMac su true come illustrato di seguito. In questo modo ASP.NET genera un codice MAC (Message Authentication Code) nello stato di visualizzazione della pagina quando questa viene restituita dal client.

<% @ Page enableViewStateMac=true %>

Configurare l'attributo validation dell'elemento <machineKey> nel file machine.config allo scopo di specificare l'algoritmo da utilizzare per la convalida dei dati e la crittografia. Per eseguire tale operazione, tenere presenti i seguenti punti relativi all'attributo validation:

SHA1 (Secure Hash Algorithm 1) produce un hash di dimensioni maggiori rispetto a MD5 (Message Digest 5) e pertanto è considerato più sicuro. Lo stato di visualizzazione protetto con SHA1 o MD5 può tuttavia essere decrittografato durante il trasferimento o sul lato client; inoltre è possibile visualizzarlo eventualmente in testo normale.

Utilizzare lo standard 3DES (3 Data Encryption Standard) per rilevare le modifiche dello stato di visualizzazione, nonché per crittografare lo stato durante il trasferimento. In questa fase, non è possibile visualizzare lo stato in testo normale, anche se è decrittografato.

Protezione dei cookie

Durante il trasferimento, è consigliabile proteggere i cookie contenenti dati di autenticazione, di autorizzazione o altri dati riservati tramite il protocollo SSL. Per l'autenticazione basata su moduli, è possibile utilizzare il metodo FormsAuthentication.Encrypt per crittografare il ticket di autenticazione scambiato tra client e server in un cookie.

Protezione dello stato di sessione SQL

Il gestore predefinito (in-process) dello stato di sessione ASP.NET presenta alcune limitazioni. Ad esempio, non può essere utilizzato nei computer di una Web farm. Per ovviare a questa limitazione, ASP.NET consente l'archiviazione dello stato di sessione in un servizio di stato remoto o un database SQL Server.

È possibile configurare lo stato di sessione SQL nei file machine.config o web.config. L'impostazione predefinita nel file machine.config è riportata di seguito.

<sessionState mode="InProc" 
              stateConnectionString="tcpip=127.0.0.1:42424" 
              stateNetworkTimeout="10"
              sqlConnectionString="data source=127.0.0.1;user id=sa;password="
              cookieless="false" timeout="20"/>

Per impostazione predefinita, lo script SQL InstallSqlState.sql, impiegato per la creazione del database utilizzato per lo stato di sessione SQL, viene installato nel seguente percorso:

C:\WINNT\Microsoft.NET\Framework\v1.0.3705

Quando si utilizza lo stato di sessione SQL, occorre tenere conto di due problemi.

È necessario proteggere la stringa di connessione al database.

È necessario proteggere lo stato di sessione mentre attraversa la rete.

Protezione della stringa di connessione al database

Se si utilizza l'autenticazione SQL per la connessione al server, la stringa di connessione specificata nell'attributo sqlConnectionString contiene un nome utente e una password. Per archiviare una stringa di connessione crittografata nel Registro di sistema, utilizzare l'utilità aspnet_setreg.exe. Nell'esempio riportato di seguito viene illustrato l'elemento <sessionState> rispettivamente prima e dopo l'utilizzo di aspnet_setreg.exe.

<!-- Before -->
<sessionState 
    mode="SQLServer", 
    sqlConnectionString="data source=Server;user id=userID;password=pwd" . . . />
<!-- After -->
<sessionState mode="SQLServer"
              sqlConnectionString="registry:HKLM\SOFTWARE\YourSecureApp\
              sessionState\ASPNET_SETREG,sqlConnectionString" />

Nota: se si utilizza il servizio di stato ASP.NET, è possibile utilizzare aspnet_setreg.exe anche per crittografare l'attributo stateConnectionString.

Se possibile, utilizzare l'autenticazione di Windows nel database di stato SQL Server in quanto presenta due vantaggi aggiuntivi, ovvero le credenziali non sono contenute nella stringa di connessione e non vengono trasferite in rete al server di database.

Per l'autenticazione di Windows è possibile utilizzare l'identità del processo ASP.NET, in genere ASPNET.

1.

Creare un account duplicato, con nome utente e password identici, nel server di database.

2.

Creare un accesso SQL per l'account.

3.

Creare un utente nel database ASPState e associare l'accesso SQL al nuovo utente.
Il database ASPState viene creato dallo script InstallSQLState.sql.

4.

Creare un ruolo del database definito dall'utente e aggiungere ad esso l'utente del database.

5.

Configurare nel database le autorizzazioni per il ruolo del database.

Successivamente è possibile modificare la stringa di connessione per utilizzare una connessione trusted, come illustrato di seguito.

sqlConnectionString="server=127.0.0.1;
                     database=StateDatabase;
                     Integrated Security=SSPI;"

Protezione dello stato di sessione nella rete

Potrebbe essere necessario proteggere lo stato di sessione durante il trasferimento in rete al database SQL Server. Ciò dipende dal livello di protezione della rete che esegue l'hosting del server Web e dei server di dati. Se il database è protetto fisicamente in un ambiente trusted, potrebbe essere possibile fare a meno di questa misura di protezione aggiuntiva.

È possibile utilizzare il protocollo IPSec per proteggere tutto il traffico IP tra i server Web e SQL Server oppure, in alternativa, utilizzare il protocollo SSL per proteggere il collegamento a SQL Server. Questo approccio consente inoltre di crittografare esclusivamente la connessione utilizzata per lo stato di sessione anziché tutto il traffico scambiato tra i computer.

Ulteriori informazioni

Per ulteriori informazioni sulla procedura di impostazione dello stato di sessione SQL, vedere l'articolo Q317604 "HOW TO: Configure SQL Server to Store ASP.NET Session State" (in inglese) della Microsoft Knowledge Base.

Per ulteriori informazioni sull'utilizzo del protocollo SSL in SQL Server, vedere "Procedura - Utilizzo di SSL per proteggere la comunicazione con SQL Server 2000" in questa guida.

Per ulteriori informazioni sull'utilizzo di IPSec, vedere "Procedura - Utilizzo di IPSec per la comunicazione protetta tra due server" in questa guida.

Considerazione sulle Web farm

Nello scenario di una Web farm, non vi è alcuna garanzia che le richieste successive dello stesso client vengano elaborate dallo stesso server Web. Questo fatto ha implicazioni precise sulla gestione dello stato e su qualsiasi tipo di crittografia basata sugli attributi gestiti dall'elemento <machineKey> nel file machine.config.

Stato di sessione

La gestione dello stato di sessione in-process ASP.NET predefinito, che rispecchia la precedente funzionalità ASP, determina l'affinità con il server e non può quindi essere utilizzata in uno scenario di una Web farm. Per la distribuzione in una Web farm è necessario che lo stato di sessione sia archiviato con modalità out-of-process nel servizio di stato ASP.NET o in un database SQL Server, come descritto in precedenza.

Nota: poiché lo stato dell'applicazione non è condiviso da più processi o computer, non è possibile affidare ad esso la gestione dei contatori globali o dei valori univoci negli scenari di Web farm, in cui l'applicazione Web è configurata per l'esecuzione su più server, o Web garden, in cui l'applicazione Web è configurata per l'esecuzione su più processori.

DPAPI

L'interfaccia DPAPI può essere utilizzata con l'archivio del computer oppure con l'archivio dell'utente, che richiede il caricamento di un profilo utente. Nel primo caso, la stringa crittografata è specifica di un determinato computer e pertanto è necessario generare i dati crittografati su ogni computer. Non copiare i dati crittografati da un computer all'altro in una Web farm o in un cluster.

Se invece si utilizza l'interfaccia DPAPI con l'archivio dell'utente, è possibile decrittografare i dati in qualsiasi computer mediante un profilo utente comune.

Ulteriori informazioni

Per ulteriori informazioni sull'interfaccia DPAPI, vedere il modulo 12 "Protezione dell'accesso ai dati".

Utilizzo dell'autenticazione basata su moduli in una Web farm

Se si utilizza l'autenticazione basata su moduli, è essenziale che tutti i server della Web farm condividano una chiave del computer comune per la crittografia, la decrittografia e la convalida del ticket di autenticazione.

La chiave del computer viene gestita dall'elemento <machineKey> all'interno del file machine.config. Di seguito è riportata l'impostazione predefinita.

<machineKey validationKey="AutoGenerate" 
            decryptionKey="AutoGenerate" 
            validation="SHA1"/> 

In base a questa impostazione, tutti i computer generano una chiave di convalida e di decrittografia diversa. È necessario modificare l'elemento <machineKey> e inserire valori di chiave comuni in tutti i server della Web farm.

Elemento <machineKey>

L'elemento <machineKey> configurare le chiavi utilizzate per la crittografia e la decrittografia dei dati del cookie di autenticazione basata su moduli, nonché per il controllo e la crittografia dell'integrità dello stato di visualizzazione.

Quando vengono chiamati i metodi FormsAuthentication.Encrypt o FormsAuthentication.Decrypt e viene creato o recuperato lo stato di visualizzazione, vengono consultati i valori contenuti nell'elemento <machineKey>.

<machineKey validationKey="autogenerate|value"
            decryptionKey="autogenerate|value"
            validation="SHA1|MD5|3DES" />

Attributo validationKey

Il valore dell'attributo validationKey viene utilizzato per creare e convalidare i codici MAC per lo stato di visualizzazione e i ticket di autenticazione basata su moduli. L'attributo di convalida indica l'algoritmo da utilizzare per la generazione dei codici MAC. È necessario tenere presente quanto segue.

Con l'autenticazione basata su moduli, la chiave agisce in abbinamento all'attributo <forms> protection. Quando l'attributo di protezione viene impostato su Validation e quindi si chiama il metodo FormsAuthentication.Encrypt , il valore del ticket e l'attributo validationKey vengono utilizzati per calcolare un codice MAC da aggiungere al cookie. Quando si chiama il metodo FormsAuthentication.Decrypt, il codice MAC viene calcolato e confrontato con quello aggiunto al ticket.

Con lo stato di visualizzazione, il valore dello stato di visualizzazione di un controllo e l'attributo validationKey vengono utilizzati per calcolare un codice MAC da aggiungere allo stato di visualizzazione. Quando lo stato di visualizzazione viene restituito dal client, il codice MAC viene ricalcolato e confrontato con quello aggiunto allo stato di visualizzazione.

Attributo decryptionKey

Il valore dell'attributo decryptionKey viene utilizzato per crittografare e decrittografare i ticket di autenticazione basata su moduli e lo stato di visualizzazione. Vengono utilizzati gli algoritmi DES o Triple DES (3DES). La scelta dell'algoritmo specifico viene effettuata a seconda che sul server sia installato o meno Windows 2000 High Encryption Pack. Se è installato, viene utilizzato 3DES; in caso contrario, viene utilizzato DES. È necessario tenere presente quanto segue.

Con l'autenticazione basata su moduli, la chiave agisce in abbinamento all'attributo <forms>protection. Quando l'attributo protection viene impostato su Encryption e vengono chiamati i metodi FormsAuthentication.Encrypt o Decrypt, ili valore del ticket viene crittografato o decrittografato con il valore decryptionKey specificato.

Con lo stato di visualizzazione, il valore dello stato di visualizzazione di un controllo viene crittografato con il valore decryptionKey quando viene inviato al client, mentre viene decrittografato quando il client invia i dati al server.

Attributo Validation

L'attributo determina l'algoritmo da utilizzare durante la convalida, la crittografia o la decrittografia. Può assumere i valori SHA1, MD5 o 3DES descritti di seguito.

SHA1. Quando l'impostazione è SHA1, in realtà viene utilizzato l'algoritmo HMACSHA1, che produce un hash o un digest dell'input di 160 bit (20 byte). HMACSHA1 è un algoritmo hash basato su chiavi e la chiave utilizzata come input corrispondente viene specificata dall'attributo validationKey .
SHA1 è un algoritmo assai diffuso grazie alle maggiori dimensioni digest che lo caratterizzano rispetto ad altri.

MD5. Produce un hash di 20 byte utilizzando l'algoritmo MD5.

3DES. Esegue la crittografia dei dati utilizzando l'algoritmo Triple DES (3DES).

Nota: quando l'attributo di convalida è impostato su 3DES, l'autenticazione basata su moduli non utilizza questo algoritmo ma SHA1.

Ulteriori informazioni

Per informazioni sulla procedura di creazione di chiavi appropriate da inserire nel file machine.config, vedere l'articolo Q312906 "HOW TO: Create Keys by using Visual C# .NET for Use in Forms Authentication" (in inglese) della Microsoft Knowledge Base.

Per ulteriori informazioni su Windows 2000 High Encryption Pack, vedere http://www.microsoft.com/windows2000/downloads/recommended/encryption/ (in inglese).

Riepilogo

In questo modulo è stata descritta una vasta gamma di tecniche e approcci per la protezione delle applicazioni Web ASP.NET. La maggior parte delle indicazioni e dei consigli presentati in questo modulo è valida anche per lo sviluppo di servizi Web ASP.NET e di oggetti .NET Remoting il cui hosting è eseguito da ASP.NET. I concetti di base di questo modulo possono essere riassunti nei punti seguenti:

Se l'applicazione utilizza l'autenticazione basata su moduli e le prestazioni risultano determinanti durante l'autenticazione di un utente, è consigliabile recuperare un elenco dei ruoli e archiviarlo nel ticket di autenticazione.

Se si utilizza l'autenticazione basata su moduli, è consigliabile creare un principal e archiviarlo nel contesto di ciascuna richiesta.

Se il numero dei ruoli da archiviare nel cookie di autenticazione è eccessivo, archiviarli nella cache globale dell'applicazione.

Evitare di creare un account personalizzato con privilegi minimi per eseguire ASP.NET e modificare invece la password dell'account ASPNET, quindi creare un account duplicato in qualsiasi server Windows remoto a cui l'applicazione deve accedere.

Se è necessario creare un account personalizzato per l'esecuzione di ASP.NET, adottare il principio dei privilegi minimi. Ad esempio:

Utilizzare un account di dominio con privilegi minimi se l'obiettivo principale è l'amministrazione.

Se si utilizza un account locale, è necessario creare un account duplicato in qualsiasi computer remoto a cui l'applicazione Web deve accedere. Gli account locali devono essere utilizzati nel caso in cui l'applicazione debba accedere a risorse situate in domini non di tipo trusting o in cui un firewall impedisce l'autenticazione di Windows.

Non eseguire ASP.NET con l'account SYSTEM locale.

Non assegnare il privilegio "Agisci come parte del sistema operativo" all'account ASPNET.

Utilizzare il protocollo SSL quando:

Browser e server Web si scambiano informazioni riservate in termini di protezione.

Viene utilizzata l'autenticazione di base per proteggere le credenziali.

Viene utilizzata l'autenticazione basata su moduli anziché un'autenticazione personalizzata.

Evitare di archiviare i segreti in formato testo non crittografato.

Non archiviare credenziali non crittografate nel file machine.config o web.config. Utilizzare l'utilità aspnet_setreg.exe per archiviare credenziali crittografate nel Registro di sistema per gli elementi <identity>, <processModel> e <sessionState>.


**
**