Foros del Web » Programando para Internet » ASP Clásico »

Evitar que un usuario ingrese más de una vez

Estas en el tema de Evitar que un usuario ingrese más de una vez en el foro de ASP Clásico en Foros del Web. No es asi... puedes acortar el tiempo y mantener la sesion usando un Iframe de 1px por 1px que tenga un reload cada 30 segundo... ...

  #31 (permalink)  
Antiguo 30/04/2005, 14:53
Avatar de CoaxServices  
Fecha de Ingreso: diciembre-2004
Mensajes: 71
Antigüedad: 20 años, 5 meses
Puntos: 0
No es asi... puedes acortar el tiempo y mantener la sesion usando un Iframe de 1px por 1px que tenga un reload cada 30 segundo... eso te permite tener en tu aplicacion una sesion de hasta 5 minutos. (Hotmail y otros sitios webs usan este metodo) si mantienes sesiones por 3 horas te imaginas el consumo de memoria ram y de conexiones abiertas en IIS?

La idea es que se puede solucionar en un alto porcentaje si usas varios consejos que se han expuesto aca.
__________________
http://www.coaxservices.com
  #32 (permalink)  
Antiguo 30/04/2005, 15:38
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 20 años, 1 mes
Puntos: 2
ok

Lo del iframe si lo creo, es el mimo sistema que usa el objeto de Persist para mostrar la barra de progreso cuando usas un upload, pero el iframe lo que hara es mantener esa sesion mientras estas en un punto, entonces bien, si creo que asi lo apliquen en hotmail, etc, pero aun asi, si es cierto que tienen tiempos de session grandes, si no prueba en yahoo.com.mx cuanto tiempo tarda para el timeout, talvez no son 3 horas ahora, pero en algun tiempo lo lei asi porque me marco timeout y me dijo, despes de 3 horas hemos cerrado tu session, bueno... lo que dices tambien es cierto entre mas tiempo pones para el session timeout mas posibilidades de "SESSIONES sin uso" tienes ocupadas, lo que provoca que tienes memoria ocupada desperdiciada, y entre mas tiempo tienes para el session, entonces mas posibilidad de memoria muerta, eso es cierto, pero eso no significa que tengas conexiones activas, ni en IIS, ni en el servidor de bases de datos, etc, lo unio ocupado es memoria.

Por otra parte, con ese metodo del iframe no te cubre aun el problema del onClose, en onClose sigue siendo igual, y tener un sessionTimeOut de 5 minutos es muy poco, simplemente porque puedes estar en una pagina donde estas leyendo... como Tu en este presiso momento, jajajaja, entonces por eso tambien en yahoo, etc, tienen tiempos largo, no se trata solo de escribir, sino tambien de leer, y la opcion del IFRAME lo que pasara, es que puedes tener sessiones eternas, y la verdad no estoy muy seguro que MSN y esas grandes compañías corran el riesgo de tener sessiones eternas.

Otro metodo que comente arriba es un proceso dentro del SQL SERVER el cual si esta cada X tiempo revisando la actividad de los usuarios, y ahi si, cuando el usuario ha estado inactivo durante X tiempo entonces lo quita, entonces el usuario en su proxima iteracion mirara el timeout.

Pero bueno, todos estos metodos no son mas que parches para algo que nunca estamos realmente seguros de que esta pasando. Por eso digo que este caso del onClose requiere de una estructura y un sistema muy complejo para asegurar cada caso posible. Ya lo he intentado, como todos ustedes siempre he querido saber el momento exacto en que mi usuario se va para mis logs y estadisticas, simplemente para decir exactamente cuando esta activo y cuando no, lo que tengo que seguir manejando con parametros de actividad ahorita en mi base de datos. Pero si he visto muchos casos que pueden pasar, entonces tendria que validar muchos casos.

Suerte!!
  #33 (permalink)  
Antiguo 01/05/2005, 00:55
Avatar de dobled  
Fecha de Ingreso: enero-2002
Ubicación: Rancagua - Chile
Mensajes: 1.328
Antigüedad: 23 años, 3 meses
Puntos: 2
para que se complican tanto dando extensas explicaciones detallando lo mismo en cada post mejor digan NO SE PUEDE!!
__________________
Usa títulos específicos y con sentido
En las listas de correo o en los grupos de noticias, la cabecera del mensaje es tu oportunidad de oro para atraer la atención de expertos cualificados en aproximadamente 50 caracteres o menos. No los desperdicies en balbuceos como "Por favor ayúdame" (de "POR FAVOR AYÚDAME!!!" ya ni hablamos). No intentes impresionarnos con lo profundo de tu angustia; mejor usa ese preciado espacio para una descripción lo más concisa posible del problema.
  #34 (permalink)  
Antiguo 01/05/2005, 13:16
Avatar de mamon  
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 1.302
Antigüedad: 23 años, 4 meses
Puntos: 3
En vdd no es recomendable hacer eso... ya q no saben si van a haber problemas.. si trabajan con SSL, ahi si podrían
__________________
Yo si sé lo que es trabajar duro, porque lo he visto.
  #35 (permalink)  
Antiguo 02/05/2005, 05:07
 
Fecha de Ingreso: noviembre-2004
Ubicación: Sevilla
Mensajes: 139
Antigüedad: 20 años, 6 meses
Puntos: 0
yo tengo otro metodo que va muy bien y pienso que es menos complicado.

en la tabla usuarios, ademas de nombre y contraseña, guarda un campo codigo.

cuando introduces nombre y contraseña correctos.

1- cambias el codigo de la base de datos
2- guardas el codigo en session("codigousuario")

para comprobar que el usuario esta logueado, testas en la base de datos que el codigo es igual a session("codigousuario")

no pueden existir 2 usuarios logueados xq el ultimo siempre cambia el codigo y ya no le sirve al 1º

:)

------------------------------------------------------------------------------

un saludo
__________________
Punkis De Mierda

Foro punk rock
  #36 (permalink)  
Antiguo 02/05/2005, 09:31
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 20 años, 1 mes
Puntos: 2
Bien.

Buen metodo, entonces ese es como messenger por ejemplo, que cuando entra el segundo quita al primero. Pero entonces en cada pagina tienes que consultar la base de datos para verificar el codigo con lo que tienes en session verdad ?, y en caso de que no, entonces terminas la session.

Buen metodo.
  #37 (permalink)  
Antiguo 03/05/2005, 20:20
 
Fecha de Ingreso: octubre-2003
Ubicación: Bucaramanga, Santander, Colombia, Suramérica
Mensajes: 20
Antigüedad: 21 años, 7 meses
Puntos: 0
Sonrisa

saludos a todos y muchísimas gracias por responder

después de mucho trabajo, pude solucionar el problema de la siguiente manera:

la lógica es: en una variable de aplicación meter el código de empleado (es único entre los usuarios) cuando hayan iniciado sesión, para que si se va a volver a meter, se mira a ver si está ahí, y si está, no se le deja iniciar sesión, si no está, pues sí inicia normalmente. la información se tiene que eliminar de ese lado cuando la sesión se termine, ya sea por Session.Abandon() o por timeout.

lo que hice para validar que si un usuario ya ha iniciado sesión, no pueda hacerlo de nuevo desde el mismo o otro computador:

1. en el global.asa se creó una variable de aplicación de tipo recordset para ahí guardar los datos (sessionid -necesaria para eliminarla cuando termine sesión-, codempleado -necesario para hacer la validación en sí- y started -para saber cuándo y a qué horas inició sesión; no es necesario-) de los usuarios activos (los que han iniciado sesión).

2. en el application_onstart del global.asa, se definen los campos anteriormente nombrados y se abre el recordset

3. en la página de validación, cuando el usuario ya ha ingresado su login y pwd, y cuando ya se ha comprobado que existe en la BD, se valida si no tiene una sesión activa (si ya ha iniciado sesión) en ese momento, confrontando el código de empleado (que se trae en el query que busca si está en la BD el login y pwd) con los códigos de empleados de los que tienen la sesión activa (es un campo del recordset de aplicación que creamos en el punto 1).
si la validación es positiva (el usuario ya tiene una sesión iniciada en ese momento), redireccionamos a la misma página, con una bandera para que diga que "ya ha iniciado sesión".

4. si no está en ese momento logueado, es decir, si no ha iniciado sesión, es decir, si la validación anterior es negativa (no redireccionó), metemos entonces los datos del usuario al recordset.

5. en el archivo usuarios_activos.asp se pueden ver los datos de los usuarios que en ese momento están activos.

6. cuando el usuario termina sesión (dándole [salir] en algún lado, lo que lo lleva a validar_usuario.asp?salir=1, lo que hace Session.Abandon()), en el session_onend del global.asa se busca el usuario (por medio del sessionid) y se elimina del recordset. ésto también se cumple cuando se cumple el tiempo de vigencia de la sesión (10 minutos).
si el usuario NO termina su sesión (Session.Abandon()), sino que cierra el browser, y quiere entrar en menos de 10 minutos, tiene que esperar a que pasen 10 minutos para que su cuenta se acabe... por eso se debe recomendar que salgan por [salir]

chau!
  #38 (permalink)  
Antiguo 03/05/2005, 21:32
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 20 años, 1 mes
Puntos: 2
Hola

Que bueno que ya lo resolviste y que todo esta bien... lo unico que puedo recomendarte es que en lugar de que uses un recordset, utilizes uno tipo directorio, con el recordset tendras una consulta (conexion) directa a la base de datos durante todo el tiempo que tu servidor este prendido, eso puede ocacionar fugas de memoria y errores futuros...

El objeto directorio es mas ligero, facil de manejar y ademas es mas seguro que el recorset...

No tengo mi global.asa ahorita para decirte como y no lo recuerdo, te podre el codigo de como hacerlo mañana.

Suerte!!
  #39 (permalink)  
Antiguo 04/05/2005, 09:51
 
Fecha de Ingreso: octubre-2003
Ubicación: Bucaramanga, Santander, Colombia, Suramérica
Mensajes: 20
Antigüedad: 21 años, 7 meses
Puntos: 0
saludos

en realidad el recordset no consulta a la Base de Datos. simplemente lo uso para almacenar ahí los datos de los usuarios conectados (SessionID, código de empleado y fecha_hora de inicio de sesión), por lo que (creo que) no habría problema por estar consultando a la BD.

de cualquier forma sí me interesa el objeto directorio que dices.

chau!
  #40 (permalink)  
Antiguo 04/05/2005, 10:24
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 20 años, 1 mes
Puntos: 2
Humm....

No entiendo como dices que no consulta a la base de datos... porque no pones el codigo para saber que esta pasando ?

Del Directorio..

global.asa

<OBJECT RUNAT=Server SCOPE=Application ID=DictUsuarios PROGID="Scripting.Dictionary"></OBJECT>

Para insertar en este directorio desde ASP:

<%
Application.Lock

DictUsuarios.Add Variable, Valor

Application.UnLock
%>

Para quitar el directorio desde ASP:

<%
Application.Lock

DictUsuarios.Remove Variable

Application.UnLock
%>

Ocupas hacer pruebas para que entiendas este metodo..

Variable es el nombre que le daras a la variable, y valor es el valor que le asignas.

Suerte!!
  #41 (permalink)  
Antiguo 04/05/2005, 17:03
 
Fecha de Ingreso: octubre-2003
Ubicación: Bucaramanga, Santander, Colombia, Suramérica
Mensajes: 20
Antigüedad: 21 años, 7 meses
Puntos: 0
<object runat="Server" scope="Application" id="rstActiveUsers" progid="ADODB.Recordset">
</object>

ése código va de primero en el Global.asa, antes que cualquier cosa.

en el AppOnStart, le creo los campos que necesito, en los archivos asp correspondientes le agrego registros (los usuarios que van ingresando al sistema), en el SessionEnd elimino el registro y listo!

gracias por lo del directorio,

chau!
  #42 (permalink)  
Antiguo 04/05/2005, 17:25
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 20 años, 1 mes
Puntos: 2
Hola

La verdad aun no me queda claro, me pondrias el codigo por favor para verlo, es decir asi como te puse como agregar borrar, etc, me gustaria ver como lo defines, como agregas, borras, etc.

Gracias.
  #43 (permalink)  
Antiguo 18/05/2005, 12:19
 
Fecha de Ingreso: octubre-2003
Ubicación: Bucaramanga, Santander, Colombia, Suramérica
Mensajes: 20
Antigüedad: 21 años, 7 meses
Puntos: 0
Sub Application_OnStart()
Const adInteger = 3
Const adVarChar = 200
Const adDate = 7

rstActiveUsers.Fields.Append "id", adInteger
rstActiveUsers.Fields.Append "codempleado", adInteger
rstActiveUsers.Fields.Append "started", adDate
rstActiveUsers.Open
End Sub

Sub Session_OnEnd()
Const adAffectCurrent = 1
rstActiveUsers.MoveFirst
Do While Not rstActiveUsers.EOF
If CLng(rstActiveUsers.Fields("id").Value) = CLng(Session.SessionID) Then rstActiveUsers.Delete adAffectCurrent
End If
rstActiveUsers.MoveNext
Loop
rstActiveUsers.Update
End Sub
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:31.