2012-01-26 12 views
6

¿Hay alguna forma de averiguar si un ID de sesión es válido desde un contexto de solicitud existente? En eso, si me dan una Id de sesión, y actualmente estoy en otra sesión iniciada por una Solicitud de Http y estoy en una página o en alguna clase, ¿puedo validar esa Id de sesión, si es válida y existe actualmente? y no ha sido abandonado?En ASP.Net, ¿puedo averiguar si existe otra sesión o si es válida por una Id de sesión?

El motivo es que debemos bloquear el proceso de inicio de sesión de usuario en la página del proyecto en el que estoy trabajando para que cualquier usuario pueda iniciar sesión solo una vez. Mi idea al respecto fue agregar una columna de ID de sesión a la tabla de usuarios, si es nula, se cierran la sesión y se establece cuando inician sesión y se borran cuando cierran sesión o en Session_End en global.asax. Sin embargo, si por alguna razón se abandona una sesión sin borrar eso, necesito poder volver a iniciar sesión y, en ese caso, cada vez que inician sesión y encuentra una ID de sesión en esa columna, creo que de alguna manera debería hacerlo. comprobar para ver si ese identificador de sesión es válida y activa, si no, va a restablecer a su nuevo identificador de sesión y permitir que se conecten.

Gracias

+0

¿Es necesario mantener su sesión de siempre? Lo que significa que ASP .NET eventualmente abandonará las sesiones caducadas. Pero desde la perspectiva del usuario, ¿el estado de la aplicación debe permanecer siempre igual? – Yuck

+0

No, tenemos un tiempo de espera de 30 minutos que requiere que el usuario vuelva a iniciar sesión. No estamos utilizando ninguna autenticación basada en cookies, solo la sesión activa y el almacenamiento del objeto del usuario en ella. Cuando la sesión expira, están "desconectados" y tienen que iniciar sesión de nuevo. –

Respuesta

0

no hay forma directa de validar SessionId. Opciones:

  • Se puede implementar su propio proveedor de estado de sesión (o tal vez ID manager sería suficiente) para exponer el acceso a esa información (http://msdn.microsoft.com/en-us/library/aa479024.aspx).
  • Simplemente intente hacer trampa configurando la cookie de ID de sesión en función de la ID que cree que debería tener el usuario actual y vuelva a procesar la página. Con una segunda solicitud, podrá ver si ese ID corresponde al estado válido y volver a iniciar sesión si es necesario.

Nota: No utilizaría Id. De sesión para tal fin, ya que dependerá de los detalles de implementación. Tal vez simplemente rechazar sesiones que no se ven como las últimas para este usuario funcionaría. Tener la propiedad "mi nombre de sesión actual" guardada en Session["someName"] y en la base de datos del usuario debería ser suficiente para rechazar la representación de sesiones anteriores.

2

Necesita almacenar las sesiones en la base de datos para encontrarlas antes.
Ver más en HOW TO: Configure SQL Server to Store ASP.NET Session State

+0

El comentario anterior tiene mal inglés, pero la idea correcta. Si utilizó el servidor SQL para su estado de sesión, creo que almacena la ID de sesión como una columna. Podrías comprobar eso. – Rocklan

1

La única manera que puedo pensar es hacer lo que dice Neperz y almacenar sus sesiones en una base de datos con el proveedor SQLServer sesión, lo que significa que puede utilizar una consulta SQL para ver lo que está disponible.

Pero hay algunas advertencias a tener en cuenta:

  1. creo que el identificador de sesión almacenado en la tabla de base de datos de sesión no es exactamente el mismo que el ID de sesión se puede acceder desde el código. No recuerdo exactamente dónde lo leí, pero creo que experimenté este problema cuando estaba haciendo algo similar para supervisar todas las sesiones activas.
  2. El evento global Session_End nunca se activará si usa el proveedor de sesión SQLServer.
  3. A menos que utilice explícitamente Session.Abandon() en su código para finalizar una sesión (por ejemplo, cuando un usuario cierra la sesión), sus sesiones pueden esperar hasta que un trabajo del Agente SQL limpie las sesiones caducadas. Esto significa que si alguien acaba de cerrar la ventana del navegador, su sesión seguirá apareciendo como "activa" lo que puede complicar su implementación.
1

Otra opción que tiene/tenía :-) sería utilizar WeakReferences:

  • un Dictionary<youruseridtype,WeakReference> se almacena a nivel de aplicación como aplicación [ "mySessionDictionnary"]
  • al iniciar una sesión, almacene el ID de usuario y una WeakReference en el objeto de sesión en el Dictionnary
  • cuando un usuario quiere iniciar sesión, consulte en Dictionnary su ID. Si hay una WeakReference no vacía para un objeto Session, puede Abandonar() este objeto Session existente, asegurando que no haya más de una sesión activa por usuario.

WeakReference garantiza que no sufrirá pérdidas de memoria.

NB: esto solo funcionaría con la gestión de sesiones inProc. Como el Dictionnary no sobreviviría a un reinicio de la aplicación, debería ser el mismo para las sesiones.

la esperanza de que ya ha encontrado la respuesta adecuada a su problema ;-)

Cuestiones relacionadas