Session su File con ASP.NET: FileSession

di Andrea Zani, in ASP.NET,

L'idea di un modulo per la gestione personalizzata delle Session è nato dall'esigenza di avere un mezzo sicuro di memorizzazione dati delle singole sessioni di un utente che utilizza una web application.

Sia con ASP che con ASP.NET, sono presenti le normali session, che svolgono bene questo compito, ma basandosi sui cookie mostrano tutta la loro vulnerabilità se utilizzati con client che non permettono la loro memorizzazione.

Le opzioni disponibili

Con ASP.NET questo problema è stato parzialmente risolto con l'utilizzo della memorizzazione delle session in modalità cookieless , che inserisce l'identificativo di sessione (SessionID) all'interno dell'URL della pagina:

http://www.nomesito.xx/(wpw53h45kk3520e5khuvk0ep)/default.aspx

Per ottenere questo comportamento è sufficiente impostare su true nella sezione "SessionState" del web.config l'attributo cookiesless:

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

Questa tecnica comporta però tre problemi. Il primo riguarda la natura stessa dell'URL così come lo abbiamo appena visto.

Se un altro sito inserisce un link al nostro, lasciando inalterato l'indirizzo comprensivo dell'identificativo di sessione, qualsiasi visitatore che entrerà nel nostro sito sarà identificato da un unico SessionId e dunque non riconoscibile univocamente. Il secondo problema riguarda l'autenticazione.

Con questa opzione attiva, infatti, si baserà sui cookie con il conseguente fallimento di un qualsiasi tentativo di autenticazione da parte di client il cui supporto per i cookie è disattivato, anche se questo problema sarà risolto dalla versione 2.0 di ASP.NET . Il terzo problema che, personalmente, reputo fastidioso soprattutto se si ha a che fare con connessioni lente, è dovuta alla tecnica di bufferizzazione dei file come immagini dei browser: infatti file come le immagini saranno memorizzate nella cache del browser con il nome completo compreso di SessionId, per esempio:

http://www.nomesito.xx/(wpw53h45kk3520e5khuvk0ep)/immagine.jpg

Al successivo accesso e variazione di SessionId , nella cache del browser, l'immagine sarà cercata nuovamente, con un notevole consumo di banda.

Anche se si tratterrà della stessa immagine, il browser crederà di aver di fronte una nuova immagina e la ricaricherà nuovamente.

Genesi del FileSession

La soluzione ottimale per la risoluzione dell'ultimo problema - soluzione utilizzata in moltissimi siti - è l'aggiunta dell'identificativo di sessione direttamente come parametro della pagina:

http://www.nomesito.xx/default.aspx?SessionId=wpw53h45kk3520e5khuvk0ep

Ed è proprio questo quello di cui si occuperà il modulo FileSessionModule : la gestione di un SessionId personalizzato e della memorizzazione su file, in modo da avere un altro punto a nostro favore: potremo riavviare la web application o l'intero server e saremo sicuri che non perderemo alcun dato , problema che invece hanno le Session tradizionali.

Per implementare questo modulo nella nostra web application è sufficiente copiare la dll "FileSessionHttpModule.dll" all'interno della directory bin della nostra applicazione, quindi inserire queste righe nel web.config:

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
   <section name="FileSession" type="PersonalConfig,FileSessionHttpModule" allowDefinition="MachineToApplication" />
  </configSections>
  <FileSession 
         auto_delete_file="true"
         timeout="10"
         check_file_time="1"
         default_directory="~\PrivateSession"
         auto_insert_sid="true"
         loginUrl="protetta\Login.aspx"
         />
  <system.web>
  <httpModules>
  <remove name="FormsAuthentication" />
  <add type="myHttpModule,FileSessionHttpModule"
         name="FileSessionHttpModule" />
  </httpModules>
  ...

Questo è quanto è sufficiente per partire. Ora al resto penserà il modulo appena creato per noi.

Nella sezione "ConfigSection" specifichiamo che nel web.config è presente una nuova sesione di nome "FileSession" e sarà gestita dalla classe "PersonalConfig" presente nella dll "FileSessionHttpModule.dll" (quella che abbiamo inserito nella directory bin).

In questa sezione possiamo specificare le seguenti opzioni:

  • auto_delete_file (true/false, valore di default, true): specifica che il modulo cancellerà automaticamente i file contenenti i dati di Session di ogni singolo utente dopo il tempo prestabilito da "Timeout".
  • Timeout (valore di default, 10 minuti): minuti di vita di ogni singolo file di session dopo del quale, sarà cancellato.
  • check_file_time (valore di default, Timeout/2): minuti di intervallo per i controlli sul tempo di vita dei file di session.
  • default_directory (cartella di default, la root della web-application): directory in cui saranno memorizzati i file di session.
  • auto_insert_si d (true/false, valore di default, true): il modulo inserirà in modo del tutto automatico il parametro Sid e il valore corrispondente dell'id di sessione nei link presenti nella pagina.
  • loginUrl (di default, "login.aspx"): pagina di login per la sezione di autenticazione personalizzata basata sul modulo "FileSessionHttpModule".

Infine, nel web.config, nella sezione httpModules , aggiungiamo il supporto al nostro modulo personalizzato. Come si può vedere nel codice qui sopra, è presente anche la rimozione del modulo "FormsAuthentication", in modo da sfruttare FileSessionHttpModule per questo compito.

3 pagine in totale: 1 2 3

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti