Quiero guardar algunos datos en el estado de la sesión. Necesito guardar estos datos cuando un usuario inicia sesión por primera vez a través de la autenticación de formularios. Necesito que esta variable de estado de sesión tenga la misma duración que el vencimiento del ticket de autenticación de formularios. ¿Hay alguna forma de garantizar que estos dos permanezcan sincronizados?

1
w.donahue 30 dic. 2011 a las 04:25
Solo puede hacer eso si ambos los revisan todo el tiempo. Por ejemplo, verifica si (SessionData existe && UserIsLogedOn) cada vez que necesita leer los datos de la sesión.
 – 
Aristos
30 dic. 2011 a las 04:33
Gracias. Los datos que quiero proteger son la contraseña de los usuarios (servicio web existente, por lo que no tengo otra opción) y pensé que el estado de la sesión sería más seguro que en el ticket de autenticación del formulario. No se te ocurre un lugar mejor para almacenarlo, así que no tengo estos problemas de sincronización, ¿verdad?
 – 
w.donahue
30 dic. 2011 a las 04:50
¡El estado de la sesión no es más seguro! la cookie del estado de la sesión se puede robar y obtener la sesión.
 – 
Aristos
30 dic. 2011 a las 06:51
Pero no pueden obtener los datos reales. Su único lado del servidor.
 – 
w.donahue
30 dic. 2011 a las 07:12
Si roban la cookie, la colocan en una página web y luego leen lo que envías en la página.
 – 
Aristos
30 dic. 2011 a las 13:05

1 respuesta

La mejor respuesta

¿Hay alguna forma de garantizar que estos dos permanezcan sincronizados?

Ambos tienen un valor de tiempo de espera en web.config que puede establecer en el mismo valor. Dicho esto, aquí es donde pueden comenzar sus problemas. Una cookie de autenticación de formularios puede tener una configuración de vencimiento deslizante, mientras que una sesión no. Por lo tanto, asegúrese de deshabilitar este vencimiento deslizante para la cookie de autenticación si desea que los dos valores de tiempo de espera coincidan. Y eso es solo el comienzo. Para la sesión, puede elegir dónde almacenarlo: Off, InProc, StateServer, SqlServer.

Cuando usa Off (personalmente lo que yo uso), la sesión ASP.NET está deshabilitada y básicamente no tiene ninguna sesión.

Cuando lo configura en InProc (que es el valor predeterminado), la sesión se almacena en la memoria. Excepto que IIS podría decidir reciclar el AppDomain en diferentes circunstancias: un período de inactividad, se alcanza cierto umbral de CPU / memoria, ... Esto básicamente significa que si la sesión se almacena en la memoria y el AppDomain es descargado por el servidor web, perder todo lo almacenado en esta sesión mientras que, obviamente, la cookie de autenticación sigue siendo válida.

StateServer y SQLServer son 2 modos diferentes de almacenamiento de sesiones fuera de proceso donde la información ya no se almacena en la memoria del servidor web y puede sobrevivir al reciclaje de AppDomain.

Básicamente, para resumir, es muy difícil sincronizar de manera confiable el ciclo de vida de la sesión ASP.NET y el ciclo de vida de las cookies de autenticación de formularios ASP.NET. Resuelvo este problema al no usar la sesión ASP.NET en absoluto.

3
Darin Dimitrov 30 dic. 2011 a las 17:25