2012-01-17 12 views
5

Necesito almacenar algunos datos relacionados con la sesión para un usuario. No es necesario encriptar estos datos, pero quiero asegurarme de que el usuario no pueda modificarlos. Creo que mis opciones son almacenarlo en un campo oculto, almacenarlo en una cookie o almacenarlo en el estado de sesión de ASP.Net. Necesito que la solución sea segura para la granja de servidores.¿Almacenar información de sesión en ASP.Net Cookie o Session State?

Si está almacenado en una cookie o en un campo oculto, entonces necesito una forma de garantizar que el usuario no pueda modificarlo.

¿Cuál crees que es el mejor enfoque para este tipo de datos?

Respuesta

5

Primera pregunta Me pregunto sobre los datos de la sesión: ¿Realmente los necesito? Recuerde que la web no tiene estado, por lo que quizás pueda modificar la ingeniería de su aplicación para que no utilice el estado de la sesión. Las sesiones requieren una gran cantidad de recursos de administración y servidor.

Mientras tanto usted tiene dos soluciones:

  • porque estás en una granja puso su sesión en SQL Server configuración de estado de sesión en web.config (que requiere recursos y es un poco más lento, pero es la forma más segura para almacenar los datos de sesión para asegurar que el usuario no puede modificarlo)

  • agregar un mecanismo de cifrado/descifrado para su cookie con un servidor de claves privadas

+2

Estoy de acuerdo en que la primera pregunta debería ser: ¿realmente necesito hacerlo de esta manera? Más allá de almacenar información de autenticación, realmente debes apuntar a ser tan apátrida como sea posible. –

+0

Buena respuesta. Una alternativa es la memoria caché de velocidad de AppFabric para almacenar el estado; consulte mi respuesta a continuación. –

2

Personalmente, creo que es mejor para almacenar la información en el cache, aunque se podría perfectamente bien almacenarla en el session o cifrar y almacenarlo en un cookie y es sólo una cuestión de preferencia personal

El La razón por la que prefiero el cache es que no es vulnerable al secuestro de sesión, por lo que no hay forma posible de que el usuario pueda modificarlo ya que está almacenado en el servidor (al igual que session al respecto).

Hice una pregunta sobre el uso de un principal personalizado e incluí un poco de código que podría ayudarle.

Código para almacenar información de usuario adicional en caché:Is this Custom Principal in Base Controller ASP.NET MVC 3 terribly inefficient?

EDIT: Y la razón por la que prefiero para almacenar esta información en algún lugar cercano a la mano es que yo no quiero kep pellizcando fuera a la base de datos todo el tiempo, ya que es muy ineficiente para hacerlo.

4

Un usuario siempre puede modificar las cookies, porque es de almacenamiento del lado del cliente. Debe almacenar los datos del lado del servidor.

ASP.NET Session State es una solución aceptable para su problema, aunque hay algunas advertencias con respecto a las granjas de servidores. Este MSDN article explica cómo hacer que el estado de sesión funcione para su entorno de granja de servidores. La respuesta de Be.St toca el enfoque sugerido fuera del proceso.

Una tercera alternativa es crear un almacenamiento de sesión controlado por la base de datos que no dependa necesariamente del estado de la sesión. Considero que Session State es un poco complicado con diferentes entornos de implementación (por ejemplo, granjas de servidores), por lo que a veces utilizaré este enfoque.A continuación, puede acceder a estos datos adjuntando una clave de sesión a la cadena de consulta o almacenando la clave de sesión en la cookie (aún potencialmente modificable por el usuario, pero es menos probable que sea un objetivo para dicha acción).

1

Si necesita utilizar una granja de servidores y desea compartir el estado de la sesión entre los nodos sin volver a la base de datos todo el tiempo, puede usar AppFabric Session Provider. Hay un poco de una curva de aprendizaje que lo configura, pero cumple su función y es rápido (aunque no lo ejecute en el mismo cuadro que su aplicación).

Cuestiones relacionadas