ciao!
ok, il problema che si è presentato all'inizio era quello di sessioni che scadono troppo di frequente. L'aver creato un cookie persistente grazie alla FormsAuthentication ci ha concesso di mantenere l'utente collegato per molto più tempo, anche dopo il riavvio del PC.
Ora affrontiamo un nuovo problema, anzi due.
doppiomango ha scritto:
tenere le informazioni in una o più sessioni evitando di richiamare il database 20 volte
...
Nel cookie mi servono varie informazioni come l'id utente, il nome, e alcune specifiche dell'amministrazione (ad esempio quali campi far vedere e quali no).
Il primo problema consiste nel numero di query di inviare al database. Vogliamo che questo numero sia basso quindi per risolverlo bisogna usare un meccanismo di caching come la sessione, i cookies o la cache di Asp.NET.
L'altro problema è legato alla confidenzialità dei dati da cachare. Non possiamo consentire che i privilegi assegnati all'utente (cioè i criteri che gli consentono di vedere o no alcuni campi), vengano memorizzati lato client. Dobbiamo tenerli al sicuro nel server perché se glieli inserissimo in charo in un cookie, lui potrebbe modificarli a piacimento e conferirsi privilegi che non gli spettano.
Cacharli in sessione era una buona scelta, perhé quei dati restano confinati nella memoria RAM del server e l'utente non ha possibilità di modificarli.
A questo punto non ha importanza se la Sessione scade spesso perché, se anche dovesse scadere, tu puoi sempre recuperare di nuovo di dati dal database e ri-cacharli subito in sessione.
//ottengo il nome dell'utente che in precedenza avevo cachato in sessione
var nome = Session["nome"];
//se il nome non era più in sessione...
if (nome == null){
//allora lo recupero dal database
nome = OttieniNomeUtenteDalDb();
//e lo rimetto in cache
Session["nome"] = nome;
}
Response.Write("Nome: " + nome);
doppiomango ha scritto:
In più ho letto la parte riguardo i browser con i cookies disabilitati e facendo una prova l'url sembra corretto (www.xxxx.it/codice/pagina.aspx), ma mi ritorna "The system cannot find the file specified."
Mmh, non so a quale "file" l'errore faccia riferimento. Nella pagina di errori vedi lo stack strace, con evidenziata la riga di codice che sta causando il problema? Se dipendesse dal fatto che pagina.aspx non viene trovata, semplicemente avresti un errore 404.
Quando l'utente ha i cookies disabilitati, al massimo non riuscirà a restare loggato al sito. Comunque tu hai impostato la modalità cookieless="AutoDetect" e quindi l'autenticazione funzionerà anche per lui (verrà inserito un codice lunghissimo nell'URL, che potrebbe causarti problemi con i percorsi lato client, ad esempio a .js e css).
doppiomango ha scritto:
Nel cookie mi servono varie informazioni come l'id utente, il nome, e alcune specifiche dell'amministrazione (ad esempio quali campi far vedere e quali no).
L'id utente non ti serve, puoi recuperarlo lato server da User.Identity.Name dopo aver loggato l'utente.
Per il nome e le specifiche puoi cacharle nella sessione, come vedevamo prima, altrimenti ci sono delle API di Asp.Net che puoi usare proprio a questo scopo.
La
Profile API ti consente di accedere ad informazioni accessorie dell'utente, come il Nome e altri dati anagrafici o preferenze varie.
Con la
Roles API puoi gestire i suoi ruoli, che ti consentiranno di capire se può accedere a determinate sezioni del sito, oppure se deve vedere o meno alcuni campi. I ruoli possono essere cachati su cookie in maniera crittograta, quindi le interrogazioni al db saranno ridotte al minimo.
ciao