2009-07-01 7 views
24

Quiero almacenar algunos datos como el alias del usuario y la identificación del usuario (clave principal de la tabla) en la sección de datos del usuario de la cookie de autenticación. El motivo por el que hago esto es retener estos datos cuando el navegador está cerrado, sin que el usuario vuelva a iniciar sesión.Datos del usuario de la tienda ASP.Net en la cookie de autenticación

Editar: ¡Vaya! Me di cuenta de que no me había explicado bien. No estoy intentando volver a autenticar a un usuario según su cookie. El usuario es ya autenticado por el sistema de membresía de ASP.Net - esta parte está bien. Mi problema es que si quiero mostrar el alias del usuario, por ejemplo, tengo que iniciar otra consulta SQL y luego almacenarla en la sesión. Pensé que tendría sentido almacenar esta información en la cookie de autenticación (nuevamente, la que ya se había creado por ASP.Net) en la sección UserData, que parece haber sido creada para este propósito.

No quiero usar perfiles porque tengo mi propia tabla de usuarios con datos de perfil, y necesitaba una solución liviana.

¿Cuál es una buena forma de codificar estos datos en la sección de datos de usuario de la cookie de autenticación? Estaba pensando en la serialización, pero eso podría ser excesivo. ¿Voy por esto de la manera incorrecta?

Respuesta

34

he escrito un tutorial en profundidad sobre cómo hacer esto aquí:

http://www.danharman.net/2011/07/07/storing-custom-data-in-forms-authentication-tickets/

esto mantiene el cifrado y la autenticación, yu ses json para serializar una clase en el campo UserData.

+0

¡Buen trabajo, debería tener más votos ascendentes! – flq

+0

Fantástica solución. Incluso sin la pieza de serialización json, esta es una gran manera de establecer la cadena UserData y mantener otros valores predeterminados/configurados a pesar de la horrible API de auth de formularios. –

+0

¡Su respuesta parece hacer exactamente lo que tenía pensado en ese momento! ¡Gracias! –

2

Tal vez podrías crear otra cookie ... Yo personalmente no me metería con la cookie de autenticación.

+0

En realidad estoy generando una nueva cookie de autenticación. Puedo continuar y almacenar una cadena de texto simple en la sección UserData de la nueva cookie. Mi pregunta es sobre la serialización de objetos más complejos. –

+0

Quise decir una cookie además de la cookie de autenticación. Deje solo la cookie de autenticación y cree una nueva cookie no encriptada para los datos temporales del usuario. –

+4

Nah, estaría almacenando la identificación de usuario y el alias. No quisiera almacenar datos tan confidenciales sin cifrado –

3

Sí. Si está almacenando la identificación de usuario y el inicio de sesión en la cookie, ¿qué impide que alguien cambie sus cookies a la identificación de usuario y al inicio de sesión de cualquier persona?

Debe configurar un sistema de tickets de autenticación. Básicamente es un valor de cookie que se verifica cuando no existe sesión. Si hay un valor presente, ejecútelo contra una tabla de tickets que debería contener su ID de usuario. Si encuentra el boleto, deles una sesión y un nuevo boleto.

+1

Hmm ... Estoy seguro de que ASP.Net ya está enviando un nuevo ticket cuando un usuario vuelve a autenticar el navegador según su cookie de autenticación. Sin embargo, creo que también está sugiriendo que incluso el ID de usuario cifrado almacenado en los datos del usuario podría ser sustituido por los propios datos cifrados del usuario malintencionado almacenados en su cookie de autenticación. ¡Pero entonces no estoy seguro de seguir el punto de la sección userdata en la cookie de autenticación en absoluto! –

0

Almacenar datos adicionales de usuario en la cookie significa una cookie más grande que se envía hacia y desde el cliente con cada solicitud.

Un mejor enfoque para evitar la base de datos adicional golpea le preocupa es que los datos a almacenar en caché en la memoria después el usuario inicie sesión.

ASP.NET tiene un caché por solicitud HttpContext.Current.Items y una aplicación caché de dominio HttpContext.Current.Cache, creo que está buscando HttpContext.Current.Cache en esta instancia.

Alternativamente, si usted necesita el almacenamiento en caché a través de servidores web (carga equilibrada servidores web) se puede mirar en las tiendas de 3 ª parte de valor clave como como memcached, Redis, velocidad, etc. nCache

+0

cómo es esto diferente de las variables de sesión –

Cuestiones relacionadas