2009-04-03 17 views
7

Uno dei requisiti proposti per un'applicazione ASP.NET è che lo stato della sessione è disabilitato globalmente. (Questo non è negoziabile.)Autenticazione utente senza stato sessione in ASP.NET

Un altro requisito è che abbiamo alcuni mezzi per l'autenticazione dell'utente. Sto pensando di utilizzare il modello di provider di appartenenze di ASP.NET.

È possibile disporre dell'autenticazione utente senza stato sessione?

Gli esempi specifici user-autenticazione che stiamo cercando sono:

  • utente va al sito web non autenticato
  • utente inserisce le informazioni di registrazione (campi di contatto, ecc)
  • Per il resto della loro sessione , l'utente ha accesso a determinati contenuti grazie al loro stato registrato

C'è un modo per farlo con i cookie?

Questo può essere fatto in modo sicuro, quindi il cookie non può essere facilmente falsificato?

Esiste una funzionalità integrata in ASP.NET per supportare questo o sarà necessario eseguire il rollover del nostro metodo?

risposta

12

L'autenticazione di moduli ASP.NET non utilizza SessionState. Utilizza un cookie per memorizzare il ticket di autenticazione.

È anche possibile forzare l'invio del ticket di autenticazione sul canale SSL modificando il file web.config.

Tutte le funzionalità necessarie sono disponibili in ASP.NET.

http://msdn.microsoft.com/en-us/library/aa480476.aspx

+0

Grande ... sembra che ho bisogno di validationKey e decryptionKey devono essere identici su tutti i server della web farm perché funzioni. – frankadelic

+0

se ci si trova in una Web farm, sì. –

0

Sì, è possibile utilizzare i cookie.

Il problema con i cookie, è che non è possibile conservare molti dati a loro. Per la registrazione del tipo di procedura guidata, memorizzo i dati nel database e quindi memorizzo la chiave di riga/ID in un cookie crittografato. In questo modo, quando l'utente passa al passaggio successivo, è possibile recuperare i dati dal database.

Per i cookie, è possibile impostare un timestamp e crittografare i valori dei cookie. Generalmente non gestisco lo stato di autenticazione dell'utente. Uso le classi FormsAuthentication integrate per gestire quell'aspetto delle mie applicazioni web.

Siti di grandi dimensioni come: Myspace e Live Search Club, si basano esclusivamente sui cookie come gestione dello stato.

2

Certo, un cookie lo farà.

Pensa ai fondamentali. Lo stato di sessione è gestito comunque dai cookie.

Ecco cosa fai.

Quando si collegano, si prendono il loro userid e un timeout (quindi il login dura solo, diciamo, 30 minuti o qualsiasi altra cosa).

Prendere quella stringa e cancellarla.

(Java, non è importante tho)

String cookie = userid + ":" + timeString + ":" + md5(userid + ":" + timeString + ":" + "secretpassword"); 

Poi, quando la richiesta raggiunge il vostro sito, controllare il cookie. Prima controlla l'integrità.

String parts[] = cookie.split(":"); 
String newHash = md5(parts[0] + ":" + parts[1] + ":" + "secret password"); 
if (!newHash.equals(parts[2])) { 
    // boom, cheater! 
} 

Quindi controllare la stringa di tempo per vedere se sono ancora "connessi" e andare da lì.

Assicurati di fare l'ora per aggiornare il cookie su ogni richiesta.

+1

questa è una pratica piuttosto cattiva, per quanto riguarda la sicurezza. Se la password segreta è trapelata una volta che chiunque può accedere all'app. E se è debole può essere rotto (specialmente quando MD5 sta scomparendo). Se farai in questo modo, almeno utilizza un "segreto" casuale diverso per ogni utente. Sarebbe molto più sicuro. –

+0

Come gestiresti una sessione chiave per utente diversa per autenticati? – yfeldblum

+0

Questo è un problema di controllo chiave, hai lo stesso problema con qualsiasi crittografia. Non ti piace MD5, scegli SHA. È un esempio di tecnica. –