Hola de nuevo.
Se me ha ocurrido una sencilla idea que considero medianamente "digna".
Cabe comentar que me han aconsejado utilizar membership y role provider para controlar las sesiones de forma precisa. Pero después de hacer algunas pruebas he visto que se trataba de bastantes cambios en la aplicación tal y como está montada, y como decía, la forma en que lo he realizado ofrece un buen resultado, si no eres muy exigente.
He montado una tabla Sesiones en la base de datos, con los campos CodigoSesion, FechaHora, IP, IDCliente, y luego sus clases para las inserciones, etc.
Este es el código del global.asax
Código VB.NET:
Ver originalSub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
'Obtenemos los datos de la sesion para guardarlos en la tabla Tienda_Sesiones
Session("CodigoSesion") = Guid.NewGuid.ToString
Dim misDetallesSesion As New DetallesSesion
misDetallesSesion.CodigoSesion = Session("CodigoSesion")
misDetallesSesion.FechaHora = Now
misDetallesSesion.IP = Request.ServerVariables("REMOTE_HOST")
misDetallesSesion.IDCliente = 0
If User.Identity.IsAuthenticated Then
FormsAuthentication.SetAuthCookie(User.Identity.Name, True)
'Al estar autenticado, nos guardamos el IDCliente para la tabla Tienda_Sesiones
misDetallesSesion.IDCliente = User.Identity.Name
End If
Dim objSesiones As New SesionesDB
objSesiones.Insertar(misDetallesSesion)
'Y eliminamos las sesiones expiradas
objSesiones.EliminarExpiradas()
End Sub
EliminarExpiradas lo que hace es eliminar aquellos registros con FechaHora < DateAdd(DateInterval.Minute, -FormsAuthentication.Timeout.Minutes, Now)
Luego, en cada Request del usuario voy actualizando el campo FechaHora de su sesión.
Y para controlar si es un usuario autenticado o anónimo, en la pantalla de login guardo el IDCliente del usuario en el campo IDCliente de su sesión correspondiente.
De la misma forma, en el codigo de Logout también limpio el campo IDCliente del usuario que se está deslogando.
Si alguien le interesa esta solución en más detalle podemos comentarlo aquí.
Saludos.