Modo migliore per gestire la sessione

giovedì 06 dicembre 2007 - 13.14

paquito_ita Profilo | Senior Member

Ciao,

mi sapreste suggerire il modo migliore per gestire la sessione allinterno di un sito web?

Ora vi spiego melgi ola mia situazione: nel mio caso (è un prototipo al momento) devo solo mantere l' ID dell'utente (ottenuto dopo il login) ed il ruolo dell'utente all'interno di un progetto (tale info viene desunta quando l'utente seleziona uno dei progetti che gestisce).

Al momento uso due variabili Session per manterene questi dati. In ogni pagina in cui mi serve l'ID dell'utente eseguo un controllo del tipo:
if(Session["userID"] == null) { Server.Transfer("Login.aspx"); }

Cioe' se non è settato lo userID(o perché la sessione è scaduta o perché l'utente cerca di accedere ad una pagina direttamente senza aver fatto login) l'applicazione ridirige alla pagina iniziale di login. E' corretto agire in questo modo? Nel file Global.asax uso semplicemente l'evento Session_End dove invoco: Session.RemoveAll().

Le due variabili di Sessione infatti le inizializzo all'interno dell'applicazione e al momento non mi serve impostare altro.

Vi pare che sia corretto questo procedimento o potreste suggerirmene un'altro?

Uso Visual Web Developer per testare (in locale) l'applicazione, dato che non ho IIS avendo Win XP Home. Talvolta passando da un apagina ad un'altra (pur non essendo passati i 20 min di default di durata dellla sessione) vengo ridiretto alla pagina di login (quindi Session["userID"] risulta null).
Potrebbe essere causato dal fatto che lavoro in locale senza IIS oppure è un mio errore da qualche parte?

Grazie mille in anticipo.

schifidus Profilo | Junior Member

Ciao,
beh diciamo che non è il modo + elegante per gestire l'autenticazione...
comunque se vuoi usare questa architettura per gestire l'autenticazione prò andare...
Ti consiglio comunuque di guardare l'autenticazione form che ti risparmia questo lavoro "sporco" di gestire tu l'autenticazione...

paquito_ita Profilo | Senior Member

>Ti consiglio comunuque di guardare l'autenticazione form che
>ti risparmia questo lavoro "sporco" di gestire tu l'autenticazione...

Con autenticazione intendi il controllo dell'oggetto Session vero e non il processo di Login iniziale? Quando dici "autenticazione form" cosa intendi? Sono alle prima armi con ASP.NET ho solitamente programmato in Java per applicazioni Desktop, quindi non sono molto familiare dell'ambiente.

Potresti farmi un esempio di come poso usare questo tipo di form nel mio caso per gestire le variabili di sessione (o solo il controllo che la variabile Session["userId "] non sia nulla)?

Grazie di nuovo.

schifidus Profilo | Junior Member

Ciao nel web config imposti
<authentication mode="Forms">

</authentication>

poi utilizzerai una tua form per l'utenticazione, se non vuoi usare un provider, puoi scriverti tu l'autenticazione...e dopo aver verificato che le credenziali inserite corrispondono ad un utente valido ti è sufficiente
impostare il cookie di autenticazione con il metodo SetAuthCookie

FormsAuthentication.SetAuthCookie (String, Boolean)

dove passi il nome del cookie che verrà creato e il fatto che sia persistente o meno...
Avrai infine un tasto di logout dove avrai come codeBehind dell'evento click

Session.Abandon();
FormsAuthentication.SignOut();

Marco

ravalon Profilo | Expert

Io ho creato uno usercontrol che disegna il box per l'autenticazione dell'utente

All'interno di questo usercontrol ho delle sub che prendono in carico i dati inseriti, li controllano, fanno una ricerca sul DB e nel caso le credenziali siano corrette imposto una sessione che poi riprendo ovunque dal sito tramite una procedura globale di estrazione della session...

Il controllo della sessione l'ho messo nel PRE_RENDER del controllo, che è caricato in una masterpage, per cui ogni pagina che apro mi controlla sempre se l'utente è autenticato o meno ... se lo è il box si trasforma mostrando oggetti dell'utente, carrello ecc....se non lo è vedo nuovamente la maschera di login..

non uso i cookies perchè non mi piacciono, quindi vado solo con la session...

non so se ti può essere utile...

paquito_ita Profilo | Senior Member

>Io ho creato uno usercontrol che disegna il box per l'autenticazione
>dell'utente
>
>All'interno di questo usercontrol ho delle sub che prendono in
>carico i dati inseriti, li controllano, fanno una ricerca sul
>DB e nel caso le credenziali siano corrette imposto una sessione
>che poi riprendo ovunque dal sito tramite una procedura globale
>di estrazione della session...
>
Anche io faccio esattamente come te (fin qui).

>Il controllo della sessione l'ho messo nel PRE_RENDER del controllo,
>che è caricato in una masterpage, per cui ogni pagina che apro
>mi controlla sempre se l'utente è autenticato o meno ... se lo
>è il box si trasforma mostrando oggetti dell'utente, carrello
>ecc....se non lo è vedo nuovamente la maschera di login..
>

Con PRE_RENDER intendi che hai aggiunto un metodo (tipo page_load) che viene eseguito PRIMA di eseguire il rendering degli oggetti?
Io sto usando un semplice if (Session["userID"] == null) ma forse non è la soluzione più elegante.
Tuttavia nel mio caso l'evento pre_render non è possibile, dato che non uso Master Page (il mio è un sito dedicato per PDA quindi con layout delle pagine particolare). Quindi il controllo lo faccio quando la pagina viene caricata.
Ma a parte questo il funzionamento di base mi pare lo stesso, o sbaglio?

Tu quindi non usi affatto l'autentication form suggerito da Schifidus?




ravalon Profilo | Expert

Esattamente, è un evento come il LOAD della page, solo che se fai un controllo sulla session nel LOAD non fa in tempo a verificare l'effettivo valore, mentre nel PRERENDER si...non so se capita questo perchè io ho usato la masterpage o se succede sempre

Sono relativamente nuovo di ASP.NET ed ho imparato che ci sono diversi modi per fare la stessa cosa, si tratta solo di cercare la soluzione più idonea per te e magari più elegante o meglio sarebbe "più futuristica", nel senso che bisogna cercare una soluzione che consenta di apportare velocemente modifiche settorializzate in futuro...

per questo ho usato un usercontrol, cosi modificando quello che inserisco dove serve, modifico automaticamente il comportamento dell'intero sito

Poi potevo farlo con le form authentication, con sub derivate da classi, direttamente in ogni pagina, solo nella master page come evento PRIVATE ecc.ecc. io ho preferito pensare al futuro....
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5