Scarica l'esempio (VB.NET e C#)
Vedremo come risolvere un problema che può presentarsi quando ci ritroviamo a dover usare la FormsAuthentication di ASP.NET, ma che ci venga allo stesso tempo negato, dalle specifiche per lo sviluppo dell'applicazione, l'utilizzo dei cookies client-side.
Lo scopo di questo articolo sarà quindi quello di trovare un workaround al problema dei cookies, per continuare ad usufruire della struttura messa a disposizione dalla FormsAuthentication, evitando la memorizzazione del ticket di autenticazione sul client dell'utente sotto forma di cookie.
Illustrerò la procedura suddividendola in 6 passi fondamentali. In questo articolo verranno inseriti dei pezzi di codice necessari per la spiegazione, troverete comunque l'intero sorgente nel progetto di esempio allegato all'articolo stesso, che potete scaricare ed analizzare con calma sul vostro pc.
La procedura che andrò ad illustrare verrà inserita nell'handler dell'evento Click del bottone di login di un form di autenticazione, a cui l'utente non autenticato verrà rediretto quando cercherà di accedere ad una pagina protetta tramite la FormsAuthentication di ASP.NET.
1. Verifica delle credenziali immesse dall'utente
In questo passo si andranno a verificare le credenziali, e cioè username e password, che l'utente ha immesso nelle 2 textbox del web form di login.
if (FormsAuthentication.Authenticate(username.Text, pass.Text))
{
// resto del codice, per i passi successivi...
Per semplicità ho memorizzato le credenziali degli utenti che hanno accesso all'applicazione nel web.config, e pertanto posso utilizzare il metodo Authenticate della classe FormsAuthentication per verificarne la validità, in base all'input dell'utente.
2. Creare un Ticket di autenticazione
Dopo aver autenticato le credenziali dell'utente, è necessario creare un ticket di autenticazione. Grazie alla presenza di questo ticket allegato alle successive richieste da parte del client, il runtime di ASP.NET, e quindi il modulo http che si occupa dell'autenticazione Form (e cioè la classe System.Web.Security.FormsAuthenticationModule), sarà in grado di autenticare l'utente senza richiederne nuovamente le credenziali.
Quando si utilizza l'implementazione standard della FormsAuthentication, questo ticket viene creato automaticamente e salvato sul client sotto forma di cookie (persistente o meno) tramite la chiamata ai metodi SetAuthCookie o RedirectFromLoginPage, e viene quindi allegato dal browser a tutte le successive richieste dell'utente all'applicazione web.
Per evitare l'utilizzo dei cookie non possiamo usare i 2 metodi di sopra, e dovremo quindi crearci la nostra istanza della classe FormsAuthenticationTicket, in modo "manuale".
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(username.Text, false , 30);
Al costruttore sono stati passati lo username dell'utente, un valore booleano che indica se il ticket è persistente o meno, ed il numero di minuti trascorsi i quali il ticket può considerarsi scaduto.
3. Criptare il ticket in una stringa
Dopo aver creato un'istanza del ticket, è necessario criptarlo e memorizzarlo in una stringa, per renderlo trasportabile via http.
string encryptedTicket = "";
encryptedTicket = FormsAuthentication.Encrypt(ticket);
Per ottentere questo risultato passiamo l'istanza di FormsAuthenticationTicket al metodo Encrypt della classe FormsAuthentication, che è un metodo statico e non è quindi necessario creare un'istanza di FormsAuthentication per poterlo richiamare.
4. Ottenere l'url della pagina richiesta dall'utente
A questo punto è necessario recuperare l'url della pagina che l'utente aveva richiesto, prima di essere rediretto sul form di autenticazione.
Per far questo possiamo avvalerci del metodo GetRedirectUrl della classe FormsAuthentication.
string redirectUrl = "";
redirectUrl = FormsAuthentication.GetRedirectUrl(username.Text, false );
5. Allegare il ticket come parametro GET
Abbiamo il ticket in formato stringa, da poter allegare alle successive richieste, per far in modo che ASP.NET lo individui ed effettui l'autenticazione dell'utente.
Normalmente il ticket verrebbe allegato alle richieste tramite un cookie. Per evitare di utilizzarli, allegheremo la stringa rappresentante il ticket come parametro GET quando faremo il redirect alla pagina che l'utente aveva richiesto prima di essere rediretto sul form di login.
redirectUrl += "?" + FormsAuthentication.FormsCookieName + "=" + encryptedTicket;
Siccome il parametro GET dovrà avere lo stesso nome del cookie di authenticazione specificato tramite l'attributo name dell'elemento del web.config, possiamo avvalerci della proprietà FormsCookieName, anch'essa statica, della classe FormsAuthentication per recuperarlo.
6. Effettuare il redirect alla pagina richiesta con l'aggiunta del parametro GET
Una volta creato l'url per il redirect, con allegato il parametro GET rappresentate il ticket di autenticazione, non ci resta che effettuarlo utilizzando l'oggetto Response.
Response.Redirect(redirectUrl);
Il runtime di ASP.NET riconoscerà il nostro parametro GET quando eseguirà la richiesta per la pagina del redirect, ed autenticherà l'utente dandogli il permesso di visualizzare la pagina stessa.
Conclusioni
Ovviamente sarà necessario implementare ancora qualche altro trucchetto per poter passare il parametro GET anche alle altre pagine. Infatti lo scopo di questo articolo è soltanto quello di mostrare come aggirare il problema dei cookies per l'autenticazione form, e di dare uno spunto per l'implementazione di sistemi più complessi.
posted on venerdì 8 luglio 2005 7.03
by
Stefano Giannone