Share via


Cenni preliminare sullo stato della sessione ASP.NET

Aggiornamento: novembre 2007

Lo stato della sessione ASP.NET può essere utilizzato per archiviare e recuperare i valori per un utente.

Vengono illustrati i seguenti argomenti:

  • Informazioni di supporto

  • Esempi di codice

  • Riferimento alle classi

Informazioni di supporto

La funzionalità relativa allo stato sessione di ASP.NET consente di archiviare e recuperare i valori per un utente mentre questi si sposta tra le pagine ASP.NET in un'applicazione Web. HTTP è un protocollo indipendente dallo stato. Ciò significa che un server Web considera ogni richiesta HTTP per una pagina come indipendente. Il server non memorizza i valori delle variabili utilizzate durante le richieste precedenti. La funzionalità relativa allo stato sessione di ASP.NET, invece, identifica come singola sessione le richieste provenienti dallo stesso browser durante un intervallo di tempo limitato e può mantenere i valori delle variabili per l'intera durata della sessione. Per impostazione predefinita, lo stato sessione ASP.NET è attivato per tutte le applicazioni ASP.NET.

Alternative alla funzionalità relativa allo stato della sessione includono gli elementi seguenti:

  • Stato dell'applicazione, che archivia variabili a cui possono accedere tutti gli utenti di un'applicazione ASP.NET.

  • Proprietà del profilo, che salvano in modo permanente i valori dell'utente in un archivio dati senza farli scadere.

  • Memorizzazione nella cache ASP.NET, che archivia i valori in memoria disponibili per tutte le applicazioni ASP.NET.

  • Visualizzazione dello stato, che salva in modo permanente valori in una pagina.

  • Cookie.

  • La stringa di query e i campi su un modulo HTML disponibili da una richiesta HTTP.

Per un confronto tre le diverse opzioni di gestione dello stato, vedere Suggerimenti per la gestione dello stato di ASP.NET.

Variabili di sessione

Le variabili di sessione vengono archiviate in un oggetto SessionStateItemCollection, esposto tramite la proprietà HttpContext.Session. In una pagina ASP.NET, le variabili della sessione correnti sono esposte tramite la proprietà Session dell'oggetto Page.

L'insieme delle variabili di sessione è indicizzato sulla base del nome della variabile o di un valore integer. Le variabili di sessione vengono create semplicemente facendo riferimento alla variabile di sessione tramite il nome. Non è necessario dichiarare una variabile di sessione o aggiungerla all'insieme in modo esplicito. Nel seguente codice di esempio le variabili di sessione vengono create per rappresentare il nome e il cognome di un utente, quindi impostate sui valori recuperati da controlli TextBox.

Session("FirstName") = FirstNameTextBox.Text
Session("LastName") = LastNameTextBox.Text
Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;

Le variabili di sessione non possono essere alcun tipo .NET Framework valido. Nell'esempio seguente viene archiviato un oggetto ArrayList in una variabile della sessione denominata StockPicks. Il valore restituito dalla variabile di sessione StockPicks deve essere impostato sul tipo appropriato durante il recupero dall'oggetto SessionStateItemCollection.

' When retrieving an object from session state, cast it to 
' the appropriate type.
Dim stockPicks As ArrayList = CType(Session("StockPicks"), ArrayList)

' Write the modified stock picks list back to session state.
Session("StockPicks") = stockPicks
// When retrieving an object from session state, cast it to 
// the appropriate type.
ArrayList stockPicks = (ArrayList)Session["StockPicks"];

// Write the modified stock picks list back to session state.
Session["StockPicks"] = stockPicks;
Nota:

Quando si utilizza una modalità dello stato della sessione diversa da InProc, il tipo di variabile della sessione deve essere un tipo .NET primitivo o serializzabile. Questo perché il valore della variabile di sessione viene memorizzato come archivio dati esterno. Per ulteriori informazioni, vedere Modalità stato sessione.

Identificatori di sessione

Le sessioni sono identificate da un identificatore univoco che può essere letto tramite la proprietà SessionID. Quando lo stato sessione è attivato per un'applicazione ASP.NET, ogni richiesta di una pagina nell'applicazione viene esaminata per individuare un valore SessionID inviato dal browser. Se non viene fornito alcun valore SessionID, ASP.NET avvia una nuova sessione e il relativo valore SessionID verrà inviato al browser insieme alla risposta.

Per impostazione predefinita, i valori SessionID vengono archiviati in un cookie. È tuttavia possibile configurare l'applicazione per archiviare i valori SessionID nell’URL per una sessione "senza cookie".

Una sessione è considerata attiva finché vengono effettuate richieste con lo stesso valore SessionID. Se il tempo tra due richieste per una specifica sessione supera il valore di timeout specificato in minuti, la sessione verrà considerata scaduta. Se viene inoltrata una richiesta con un valore SessionID scaduto, verrà avviata una nuova sessione.

Nota sulla sicurezza:

I valori P:System.Web.SessionState.HttpSessionState.SessionID vengono inviati sotto forma di testo non crittografato all'interno di un cookie oppure come parte dell'URL. Un utente malintenzionato potrebbe accedere alla sessione di un altro utente ottenendo il valore SessionID e inserendolo nelle richieste inviate al server. Se si archiviano informazioni personali o riservate nello stato sessione, si consiglia di utilizzare SSL per crittografare le comunicazioni tra il browser e il server contenenti il valore SessionID.

Per impostazione predefinita, il valore SessionID viene archiviato in un cookie di sessione non soggetto a scadenza nel browser. È tuttavia possibile scegliere di non archiviare gli ID di sessione in un cookie impostando l'attributo cookieless su true nella sezione sessionState del file Web.config.

Nell'esempio riportato di seguito viene illustrato un file Web.config che configura un'applicazione ASP.NET in modo che utilizzi ID di sessione senza cookie.

<configuration>
  <system.web>
    <sessionState cookieless="true"
      regenerateExpiredSessionId="true" />
  </system.web>
</configuration>

ASP.NET gestisce lo stato sessione senza cookie inserendo automaticamente un ID di sessione univoco nell'URL della pagina. Il seguente URL, ad esempio, è stato modificato da ASP.NET in modo da includere l'ID di sessione univoco lit3py55t21z5v55vlm25s55:

http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx

Quando ASP.NET invia una pagina al browser, modifica qualsiasi collegamento nella pagina che utilizza un percorso relativo all'applicazione incorporando un valore ID sessione nei collegamenti. (I collegamenti con i percorsi assoluti non vengono modificati.) Lo stato della sessione viene mantenuto finché l'utente fa clic su collegamenti modificati in questa maniera. Tuttavia, se il client riscrive un URL fornito dall'applicazione, ASP.NET potrebbe non essere in grado di risolvere l'ID di sessione e di associare la richiesta a una sessione esistente. In tal caso, verrà avviata una nuova sessione per la richiesta.

L'ID di sessione viene incorporato nell'URL dopo la barra che segue il nome dell'applicazione e prima di un eventuale identificatore di file o di directory virtuale. In questo modo ASP.NET può risolvere il nome dell'applicazione prima di coinvolgere l'oggetto SessionStateModule nella richiesta.

Nota:

Per migliorare la protezione dell'applicazione, è opportuno consentire agli utenti di disconnettersi dall'applicazione e impostare l'applicazione in modo che, durante la disconnessione, venga chiamato il metodo Abandon. Questa procedura consente di ridurre il rischio che un utente non autorizzato ottenga l'identificatore univoco nell'URL e lo utilizzi per recuperare i dati personali dell'utente archiviati nella sessione.

Rigenerazione degli ID di sessione scaduti

Per impostazione predefinita, i valori ID di sessione utilizzati in sessioni senza cookie vengono riciclati. In altri termini, se viene presentata una richiesta con un ID di sessione scaduto, verrà avviata una nuova sessione utilizzando il valore SessionID fornito con la richiesta. Questo può comportare una sessione condivisa inavvertitamente quando un collegamento che contiene un valore SessionID senza cookie è utilizzato dai più browser. (Ciò può verificarsi se il collegamento viene passato tramite un motore di ricerca, tramite un messaggio di posta elettronica o tramite un altro programma.) Per limitare il rischio di condivisione dei dati della sessione, configurare l’applicazione in modo da non riciclare gli ID di sessione. A questo scopo, impostare l'attributo regenerateExpiredSessionId dell'elemento di configurazione sessionState su true. Questa impostazione consente di generare un nuovo ID di sessione quando viene presentata una richiesta di sessione senza cookie con un ID di sessione scaduto.

Nota:

Se la richiesta viene presentata con un ID di sessione scaduto utilizzando il metodo HTTP POST, quando regenerateExpiredSessionId è true tutti i dati andranno perduti. Ciò si verifica perché ASP.NET esegue un reindirizzamento per assicurarsi che nell’URL del browser sia incluso il nuovo identificatore di sessione.

ID di sessione personalizzati

È possibile implementare una classe personalizzata per fornire e convalidare i valori SessionID. A tale scopo, creare una classe che eredita la classe SessionIDManager e ignorare i metodi CreateSessionID e Validate con le implementazioni personali. Per un esempio, vedere il metodo CreateSessionID nel codice.

È possibile sostituire la classe SessionIDManager creando una classe che implementi l'interfaccia ISessionIDManager. Si supponga, ad esempio, di disporre di un'applicazione Web che associa un identificatore univoco a pagine non ASP.NET, quali pagine HTML o immagini, utilizzando un filtro ISAPI. È possibile implementare una classe SessionIDManager personalizzata per utilizzare questo identificatore univoco con lo stato sessione ASP.NET. Se la classe personalizzata supporta ID di sessione senza cookie, sarà necessario implementare una soluzione per l'invio e il recupero di ID di sessione nell'URL.

Modalità di sessione

Lo stato sessione ASP.NET supporta numerose opzioni di archiviazione per le variabili di sessione, ognuna identificata come un tipo Mode dello stato sessione. Per impostazione predefinita, le variabili di sessione vengono archiviate nello spazio di memoria del processo di lavoro ASP.NET. È tuttavia possibile specificare che lo stato sessione venga archiviato in un processo separato, in un database di SQL Server oppure in un'origine dati personalizzata. Se non si desidera che lo stato sessione sia attivato per l'applicazione, impostare la modalità di sessione su Off.

Per ulteriori informazioni, vedere Modalità stato sessione.

Eventi di sessione

Due eventi che consentono di gestire sessioni utente sono forniti in ASP.NET. L'evento Session_OnStart viene generato quando si avvia una nuova sessione mentre l’evento Session_OnEnd viene generato quando una sessione viene abbandonata o scade. Gli eventi di sessione sono specificati nel file Global.asax per un'applicazione ASP.NET.

L'evento Session_OnEnd non è supportato se la proprietà Mode della sessione è impostata su un valore diverso da InProc, che corrisponde alla modalità predefinita.

Nota:

Se il file Global.asax o Web.config per un'applicazione ASP.NET viene modificato, l'applicazione sarà riavviata e tutti i valori archiviati nello stato applicazione o nello stato sessione verranno persi. Tenere presente che alcuni software antivirus possono aggiornare l'ora e la data modificate più di recente del file Global.asax o Web.config per un'applicazione.

Per ulteriori informazioni, vedere Eventi correlati allo stato sessione.

Configurazione dello stato sessione

Lo stato sessione viene configurato tramite l'elemento sessionState della sezione di configurazione system.web. È tuttavia possibile configurarlo utilizzando il valore EnableSessionState nella direttiva @ Page.

L’elemento sessionState consente di specificare le seguenti opzioni:

  • La modalità in cui la sessione archivierà dati.

  • La modalità in cui i valori dell'identificatore di sessione vengono inviati tra il client e il server.

  • Valore Timeout della sessione.

  • I valori di supporto basati sull’impostazione Mode della sessione.

Nell'esempio seguente è mostrato un elemento sessionState che configura un'applicazione per la modalità di sessione SQLServer. Imposta il valore Timeout su 30 minuti e specifica che gli identificatori di sessione sono archiviati nell’URL.

<sessionState mode="SQLServer"
  cookieless="true "
  regenerateExpiredSessionId="true "
  timeout="30"
  sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
  stateNetworkTimeout="30"/>

È possibile disattivare lo stato sessione per un'applicazione impostando la modalità di stato sessione su Off. Per disattivare lo stato sessione solo per una determinata pagina di un'applicazione, impostare il valore EnableSessionState nella direttiva @ Page su false. Il valore EnableSessionState può essere impostato anche su ReadOnly per fornire un accesso di sola lettura alle variabili di sessione.

Stato sessione e richieste simultanee

L'accesso allo stato sessione ASP.NET è garantito in esclusiva per ogni singola sessione. Se due utenti diversi effettuano richieste simultanee per due sessioni, l'accesso a ogni sessione separata verrà garantito contemporaneamente. Se tuttavia vengono effettuate due richieste simultanee per la stessa sessione (utilizzando lo stesso valore SessionID ), la prima richiesta ottiene accesso esclusivo alle informazioni di una sessione. La seconda richiesta viene eseguita solo al termine della prima. (La seconda sessione può ottenere accesso anche se il blocco esclusivo sulle informazioni viene liberato perché la prima richiesta supera il timeout del blocco.) Se il valore EnableSessionState nella direttiva @ Page è impostato su ReadOnly, una richiesta delle informazioni sulla sessione di sola lettura non causerà il blocco esclusivo dei dati di sessione. Le richieste di sola lettura per i dati di sessione potrebbero tuttavia essere messe in attesa finché non viene rimosso il blocco sui dati di sessione imposto da una richiesta di lettura-scrittura.

Torna all'inizio

Esempi di codice

Procedura: salvare i valori in uno stato sessione

Procedura: leggere i valori dallo stato sessione

Implementazione di un provider dell'archivio dello stato sessione

Torna all'inizio

Riferimento delle classi

Nella tabella seguente vengono elencate le classi principali correlate allo stato della sessione nello spazio dei nomi System.Web.SessionState.

Membro

Descrizione

SessionIDManager

Gestisce gli identificatori univoci per lo stato sessione ASP.NET.

SessionStateItemCollection

Utilizzato per archiviare variabili dello stato della sessione.

Torna all'inizio

Vedere anche

Concetti

Implementazione di un provider dell'archivio dello stato sessione