Simulando sesión en una aplicación de Windows
-
03-07-2019 - |
Pregunta
Estoy trabajando en una aplicación de Windows. Necesito simular una sesión (que tenemos en una aplicación web) en la aplicación win, donde si el usuario está inactivo por cierto período, se desconecta. El estado de inicio de sesión del usuario se mantiene en la base de datos.
¿Alguna idea innovadora?
Solución
No necesita Session (o CallContext, o cualquier otra cosa), solo un Singleton " tienda de usuarios " con una restricción:
Después de que el usuario haya iniciado sesión o haya mostrado alguna actividad, debe guardar la fecha / hora de eso. La próxima vez, cuando el usuario quiera hacer algo, simplemente compare (lastactivity + logouttime) con la fecha / hora real.
El esquema del proceso podría ser:
[User login]
|
!
[User 'store' saves user date + login time]
[This is a singleton ]
...
[Next time user wants to do something. The ]
[program asks user data from the user 'store']
|
!
[If the actual time is greater than user ]
[lastactivity + LOGOUTTIME, user cannot do it]
[If not, then update last activity ]
UserStore puede implementarse como un Diccionario y usarse como:
// Log in
Singleton.UserStore.Add("John", new UserData( yourUserObject, DateTime.Now));
...
// Check (ie. in a property-get)
var userData = Singleton.UserStore["John"];
if (userData.LastActivityDate + _LOGOUTIME > DateTime.Now())
{
throw UserAutomaticallyLoggedOut();
}
else
{
userData.LastActivityDate = DateTime.Now();
}
Otros consejos
Lo que viene a la mente es usar un BackgroundWorker para cerrar la sesión del usuario cuando el temporizador llega a cero. Este temporizador se reinicia en cada acción que el usuario realiza. O incluso podría estar conectado a eventos de mouse o teclado para que cuando el usuario no mueva el mouse o no esté usando el teclado, el temporizador realice una cuenta regresiva hasta que alcance el tiempo de cierre de sesión.
Puede crear una clase en su aplicación que tenga algún tipo de tiempo de espera que se reinicie cada vez que el usuario interactúe con el software. Si se alcanza el tiempo de espera, el usuario se desconecta.
Lo complicado aquí es detectar la interacción del usuario. En ASP.NET es bastante fácil, básicamente necesita verificar solo las solicitudes de página. En una aplicación de formularios de Windows, deberá supervisar la entrada en un nivel mucho más detallado (cualquier pulsación de tecla en cualquier cuadro de texto será, por ejemplo, una interacción del usuario). Supongo que la propiedad KeyPreview junto con un detector de eventos KeyPress en el formulario podría ser una buena forma de avanzar.
Bueno, primero, ¿qué quieres decir con inactivo? En la web estás intentando simular un estado donde no hay ninguno. Sin embargo, en una aplicación cliente, obtiene todos los eventos de ordenación, incluso MouseMove. La idea principal es que usted podría crear UserControls fuera de los controles de entrada estándar como TextBox, Button, etc. y hacer que actualicen algún tipo de objeto de temporizador cuando se invocan eventos. La otra es renunciar a las cosas de UserControl y simplemente actualizar el temporizador en cada controlador de eventos que cree. Probablemente sería más sencillo simplemente actualizar el temporizador basado en los eventos MouseMove o KeyDown en el propio Formulario.