2011-12-27 8 views
6

Sé que el proveedor de Membresía almacena el nombre de usuario y una fecha de caducidad en una cookie cifrada y luego la usa para verificar que el usuario todavía esté conectado para una sesión.Contraseña de usuario de la tienda ASP.Net en la cookie de sesión?

¿Sería posible almacenar la contraseña de los usuarios en esta cookie encriptada también? Si es así, ¿cómo accedería al lado del servidor?

Necesito el nombre de usuario y la contraseña del servidor disponibles porque necesito llamar a los servicios web que usan esas mismas credenciales. ¿Hay alguna forma mejor de hacer esto?

Respuesta

10

Debe almacenarlo en estado de sesión, que nunca abandona el servidor.

También debería intentar cambiar esos servicios web para usar tickets de autenticación en lugar de contraseñas (por ejemplo, OAuth), porque nunca es una buena idea almacenar contraseñas en texto sin formato.

+2

¿Los guardaré en el estado de la sesión cuando el usuario se autenticó por primera vez? ¿Cómo se asegura de que la sesión de membresía caduque al mismo tiempo que la sesión? Los necesitaría para estar sincronizados, creo. –

+0

@metalideath - Sí, guárdelos tan pronto como pueda. Si la sesión finaliza, ya sea porque el usuario borre sus cookies (y pierda así cualquier referencia a su sesión) o el servidor agote el tiempo de espera de la sesión, tendrá que volver a autenticar al usuario y restaurar la contraseña en la sesión nuevamente. – Omar

+0

¿Funciona el estado de la sesión en un entorno de servidor múltiple? –

2

No se recomienda pero puede usar FormsAuthenticationTicket.UserData.

+0

Por lo que puedo decir, ¿no es lo mismo que recomienda SLaks? Realmente no entiendo la diferencia entre la sesión proporcionada por la membresía y el "estado de la sesión". Tal vez no haya diferencia y eso es lo que me está confundiendo. –

+0

@metalideath. La cookie de sesión es muy diferente a la cookie de autenticación de formularios. Lea el capítulo "Autenticación de formularios" del libro de Stefan Schackow para una comprensión completa. –

+0

@metalideath: Esto va directamente a la cookie de autenticación de formularios en el cliente. No lo recomendaría. – SLaks

3

Sí, puedes hacer eso. Se pasa la información codificada en el campo userData del constructor 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, esto debe hacerse a través de una conexión SSL, y la cookie de entradas debe ser marcado tanto con los atributos HTTPOnly y seguro.

Entonces, para recuperar el valor:

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

También puede simplemente establecer su propia galleta, separado del billete formas de autenticación.

Sin embargo, almacenar una contraseña directamente en una cookie, incluso si está encriptada, no es una buena idea desde el punto de vista de la seguridad. En su lugar, utilizar el estado de sesión:

Session["password"] = password; 

estado de la sesión también utiliza una cookie, pero la cookie en sí sólo contiene una clave. El servidor utiliza la clave para obtener un diccionario de pares clave/valor únicos para esa sesión, que permanecen en el servidor (o se serializan en la base de datos, dependiendo de cómo esté configurado).

+0

Gracias por un ejemplo del uso del estado de la sesión, +1 para eso . –

Cuestiones relacionadas