2011-12-27 14 views
6

So che il provider di appartenenze memorizza il nome utente e una scadenza in un cookie crittografato e quindi lo utilizza per verificare che l'utente abbia ancora effettuato l'accesso per una sessione.ASP.Net Store Password utente nel cookie di sessione?

Sarebbe possibile memorizzare la password dell'utente anche in questo cookie crittografato. In tal caso, come accedervi dal lato server?

Ho bisogno degli utenti nome utente e password disponibili lato server perché devo chiamare i servizi web che utilizzano quelle stesse credenziali. C'è un modo migliore per farlo?

risposta

10

È necessario memorizzarlo nello stato di sessione, che non lascia mai il server.

Si dovrebbe anche provare a modificare tali servizi Web per utilizzare i ticket di autenticazione anziché le password (ad esempio, OAuth), perché non è mai una buona idea memorizzare le password in testo normale.

+2

Devo salvarli nello stato sessione in quanto l'utente è stato autenticato per la prima volta? Come si assicura che la sessione di iscrizione scada contemporaneamente allo stato della sessione? Avrei bisogno che restino sincronizzati, credo. –

+0

@metalideath - Sì, memorizzali non appena possibile. Se la sessione termina, sia dall'utente che cancella i propri cookie (e quindi perdendo qualsiasi riferimento alla propria sessione), sia che il server termini la sessione, sarà necessario autenticare nuovamente l'utente e ripristinare di nuovo la password nella sessione. – Omar

+0

Lo stato della sessione funziona in un ambiente con più server? –

2

Non consigliato ma è possibile utilizzare FormsAuthenticationTicket.UserData.

+0

Per quanto posso dire, non è la stessa cosa che SLaks sta raccomandando? Non capisco davvero la differenza tra la sessione di iscrizione e lo "stato di sessione". Forse non c'è differenza e questo è ciò che mi confonde. –

+0

@metalideath. Il cookie di sessione è molto diverso dal cookie di autenticazione dei moduli. Leggi il capitolo "Autenticazione moduli" del libro di Stefan Schackow per una comprensione completa. –

+0

@metalideath: va direttamente nel cookie auth dei moduli sul client. Non lo raccomanderei. – SLaks

3

Sì, puoi farlo. Si passa le informazioni codificate nel campo userData del costruttore FormsAuthenticationTicket:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(version, 
    name, issueDate, expirationDate, isPersistent, yourEncodedData); 
    string secureTicket = FormsAuthentication.Encrypt(ticket); 
    Response.Cookies.Add(
     new HttpCookie(FormsAuthentication.FormsCookieName, secureTicket)); 

Idealmente, questo dovrebbe essere fatto su una connessione SSL, e il cookie biglietto deve essere contrassegnato con entrambe le HttpOnly e sicuro attributi.

Poi, per recuperare il valore:

FormsIdentity id = (FormsIdentity)User.Identity; 
FormsAuthenticationTicket ticket = id.Ticket; 
string yourEncodedInfo = ticket.UserData; 

Si potrebbe anche solo impostare il proprio biscotto, separato dal biglietto di forme di autenticazione.

Tuttavia, memorizzare una password direttamente in un cookie, anche se crittografato, non è una buona idea dal punto di vista della sicurezza. Invece, utilizzare lo stato di sessione:

Session["password"] = password; 

stato sessione usa anche un cookie, ma il cookie in sé contiene solo una chiave. Il server utilizza la chiave per ottenere un dizionario di coppie chiave/valore univoche per quella sessione, che rimangono sul server (o vengono serializzate sul DB, a seconda di come è configurato).

+0

Grazie per un esempio di utilizzo dello stato sessione, +1 per quello . –

Problemi correlati