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

Solo El Mismo Usuario Dentro De La Web

Estas en el tema de Solo El Mismo Usuario Dentro De La Web en el foro de ASP Clásico en Foros del Web. Hola amigos, vereis el dilema que tengo es el siguiente. estoy diseñando una web a la que se entra con usuario y password sacadas de ...
  #1 (permalink)  
Antiguo 27/05/2003, 12:55
Avatar de epa2  
Fecha de Ingreso: abril-2002
Ubicación: Málaga
Mensajes: 1.475
Antigüedad: 22 años, 2 meses
Puntos: 9
Solo El Mismo Usuario Dentro De La Web

Hola amigos, vereis el dilema que tengo es el siguiente.

estoy diseñando una web a la que se entra con usuario y password sacadas de una bd.

Código:
set registros=conexion.execute("SELECT * FROM clientes WHERE  usuario='"&usuario&"' and password= '"&password&"'")

El problema es que me QUIERO ASEGURAR que dentro de la web solo esté el UNICO Y MISMO usuario con sus claves.

Quiero decir, que he comprobado que entrando con usuario y password desde DISTINTOS TERMINALES entro en la web, por lo que un usuario dandoles las claves a otra persona pueda entrar tambien con su perfil al mismo tiempo

como la web la tengo toda en asp, había pensado en utilizar las sessiones. no se, quizás utilizar una session y darle =TRUE de tal manera que comprobase que solo está un usuario.

uhhhh no se si me habré explicado bien.

Por favor, si sabeis como puedo hacerlo o donde consultar, contestarme.

Gracias de antemano
__________________

***Aprendiz de todo y maestro de nada***
  #2 (permalink)  
Antiguo 27/05/2003, 18:19
Avatar de maestro  
Fecha de Ingreso: febrero-2002
Ubicación: España
Mensajes: 2.364
Antigüedad: 22 años, 4 meses
Puntos: 1
Tanto session como aplication se centran al usuario en cuestion, los demas usuarios inician otra sesion diferente y no ven esas variables.

Lo mas facil es crear un campo llamado online de tipo true/false y que cuando el usuario entre este se active.
En todas las pagina debes comprobar que ese campo no esta activado en caso contrario le muestras el mensaje de error y le rediriges a la pagina principal.

Cuando el usuario salga, bien pulsando un enlace de session.abandon o cerrando el navegador, en el evento session on end, pones otra vez esa casilla como vacia.

¿Lo entiendes?
__________________
Jose Maria Fernandez
[email protected]
Http://www.expansionweb.net
  #3 (permalink)  
Antiguo 28/05/2003, 06:47
Avatar de epa2  
Fecha de Ingreso: abril-2002
Ubicación: Málaga
Mensajes: 1.475
Antigüedad: 22 años, 2 meses
Puntos: 9
lo de la bd lo entiendo

¿lo otro?
__________________

***Aprendiz de todo y maestro de nada***
  #4 (permalink)  
Antiguo 28/05/2003, 07:00
Avatar de maestro  
Fecha de Ingreso: febrero-2002
Ubicación: España
Mensajes: 2.364
Antigüedad: 22 años, 4 meses
Puntos: 1
Imagino que tendras un codgigo donde identificas al usuario, algo asi

<%
if usuario=rs("usuario") and password=rs("password") then
' instrucciones si es valido
' añades algo como esto
rs("activo")=true
else
' instrucciones si NO es valido
end if
%>

Despues en el global.asa crear una rutina para cuando se lanza el evento Sub Session_OnEnd , se vuelva a poner rs("activo")=false
__________________
Jose Maria Fernandez
[email protected]
Http://www.expansionweb.net
  #5 (permalink)  
Antiguo 29/05/2003, 03:44
Avatar de epa2  
Fecha de Ingreso: abril-2002
Ubicación: Málaga
Mensajes: 1.475
Antigüedad: 22 años, 2 meses
Puntos: 9
Bueno Maestro, siguiendo tus consejos me voy a poner manos a la obra,

¿puedo contar contigo para solventar las dudas de este novato?

hasta ahora.

ya estoy aquí de nuevo, he tardado un poquito pero ahora os cuento.

Bueno, maestro, vaya lio que he formado. ahora si que en verdad estoy más liado que antes.

un amigo y yo estuvimos ayer cerca de 8 horas con el código y no lo podemos sacar, te cuento para ver donde se encuentra el error.

como sabes, en la página login.asp se hace la conexion a la bd y se busca al usuario y password pero como tu me dijistes, metí en
la bd un campo llamado online con el tipo de dato true/false.

la idea es que cuando se hace la conexión a la bd sacar el campo como true y luego en el archivo global.asa en Sub Session_OnEnd

hacer de nuevo la conexión a la bd y escribir o actualizar el campo online a False.

¡¡¡¡¡¡PERO NO CONSIGO QUE LO HAGA!!!!
¡¡¡¡¡EN EL GLOBAL.ASA NO CONSIGO QUE EN SESSION_OnEnd PONGA EL CAMPO ONLINE EN FALSE¡¡¡¡¡

¡¡¡Y AHORA AL ENTRAR EN LA WEB CON EL USUARIO Y PASSWORD NO ME DEJA ENTRAR, PORQUE ME DICE QUE EL USUARIO YA SE ENCUENTRA DENTRO¡¡¡¡
o sea, que el campo online en la bd tiene el valor true

AYUDA POR FAVOR¡¡¡¡¡¡¡¡¡¡¡¡¡¡

espero haberme explicado.
ufff, si lo sacamos, este post tiene que ir derecho a las faqs de asp ¿ok?

ESCRIBRO EL CÓDIGO A CONTINUACIÓN......

EN LA PÁGINA LOGIN.ASP LO SIGUIENTE

Código PHP:
basedatos=server.mappath("../data/clientes.mdb")
set conexion server.createobject("adodb.connection")
conexion.open "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" basedatos ";"
set registros server.CreateObject("adodb.Recordset")

registros.open "SELECT * FROM clientes WHERE  usuario='"&usuario&"' and password= '"&password&"'"conexion,  2
     
if registros.eof  and registros.bof then
        response
.redirect "login.asp?msg=Usuario%20o%20password%20incorrectos"
        
else
 if 
registros("online")=True then 
            response
.redirect "login.asp?msg= Ya existe un usuario utilizando su nombre de usuario y password "
        
else
        
registros("online") = True
        registros
.update
            
        session
("usuario")=registros("usuario")
        
session("nombre")=registros("nombre")
        
session("apellido1")=registros("apellido1")
        
session("apellido2")=registros("apellido2")
        
session("password")=registros("password")
                            

                
response.redirect "puente.asp"
                        
end if
        
registros.close
        conexion
.close
        set registros 
nothing
        set conexion 
nothing
        end 
if
    
end if 

LUEGO EN EL GLOBLAL.ASA LO TENGO DE LA SIGUIENTE MANERA....¡¡¡¡AQUI ESTÁ LA MADRE DEL CORDERO¡¡¡¡

Código PHP:


Sub Session_OnEnd
    
    application
.lock
    
    
'---------------------------------------------------    
    '
Conexión para usuario único en la web el login ASP
    basedatos
=server.mappath("../data/clientes.mdb")
    
set conexion server.createobject("adodb.connection")
    
conexion.open "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" basedatos ";"
    
conexion.execute "UPDATE clientes SET online=False WHERE usuario='"&session("usuario")&"' and password= '"&session("password")&"'"
    'set registros = server.CreateObject("adodb.Recordset")
    '
registros.open "SELECT * FROM clientes WHERE  usuario='"&"usuario"&"' and password= '"&"password"&"'"conexion,  2
    
'registros("online") = False
    '
registros.update
    
'registros.close
    '
set registros Nothing
    conexion
.close
    set conexion 
Nothing 
    
------------------------------
    
    
    
application("vactivos")=application("vactivos")-1
    application
.unlock
End Sub 

bueno, como vereis he estado realizando diferentes pruebas (lo tengo comentado las líneas en algunos sitios) pero no doy con ello. lo curioso es que ahora no puedo entrar en la web con usuario y passwor porque me da el valor true del campo online

espero y gracias de antemano
__________________

***Aprendiz de todo y maestro de nada***

Última edición por epa2; 29/05/2003 a las 03:44
  #6 (permalink)  
Antiguo 29/05/2003, 04:09
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 7 meses
Puntos: 5
Lo de que ahora no puedes loguearte en la web lo solucionas editando la tabla con access directamente y cambiando el campo a mano.

Una cosa que no entiendo... porque tienes lo del application.lock y lo de los usuarios activos dentro del EndSession? Para ello también existen StartApplicatin y EndApplication.

El global.asa lo tienes en la carpeta raíz de tu sitio web?

Además te remito a algunos enlaces que te explican el uso de global.asa, sesiones y variables de aplicacion que a mi me ayudaron bastante en su dia:

Variables de session

Global.asa y variables de aplicación

Aunque lo estés usando bien, quizás sea que no se lanza la funcion EndSession. Para asegurarte, quitalo todo y dile que te haga un response.write de lo que sea.

Luego aparte de la solución que ya has tomado para arreglarlo, según lo que se sobre variables de session y aplicación, yo creo que todo se arregla teniendo variables de aplicación únicamente ya que éstas no sólo la ve un cliente sino que son compartidas por todos los usuarios que están conectados en cada momento. Entonces sólo tendrías que comprobar si existe esa variable de aplicación.

Un beso y suerte

P.D.:Siento haberte dado una respuesta tan desordenada pero lo escribi todo muy rápido.

Ooops!!!

Otra cosa que vi en tu codigo del global.asa.

No añadas el password en la consulta, hazlo solo por usuario y pasale el trim a las variables y los campos:

Cita:
conexion.execute "UPDATE clientes SET online=False WHERE trim(usuario)='"&trim(session("usuario"))&"' and trim(password)= '"&trim(session("password"))&"'"
A lo mejor no es Trim... pero sí Ltrim(Rtrim(loquesea))... buscalo tu exactamente.. Es para quitar espacios en blanco al principio y al final de una cadena.
  #7 (permalink)  
Antiguo 29/05/2003, 09:21
Avatar de epa2  
Fecha de Ingreso: abril-2002
Ubicación: Málaga
Mensajes: 1.475
Antigüedad: 22 años, 2 meses
Puntos: 9
Gracias por contestar, voy a ver esto ....

hasta ahora

bueno, un momento helbira, no se mucho de esto, pero...

en la consulta que me pones del global.asa utilizas dentro del SQL Visual Basic. ¿eso no se podía hacer?

en cuanto a lo del response.write para ponerlo en el evento OnEnd del global.asa no tengo ni idea.

Estoy casi seguro que el fallo es que el evento OnEnd no se ejecuta, ¿como puedo asegurarme?

espero, gracias
__________________

***Aprendiz de todo y maestro de nada***

Última edición por epa2; 29/05/2003 a las 09:21
  #8 (permalink)  
Antiguo 29/05/2003, 09:36
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 7 meses
Puntos: 5
Ummm.

Respecto a lo de la consulta... solo me equivoqué en una cosa.. pero es correcto usar una funcion del tipo trim en una consulta sql. Sería así:

Código PHP:
user trim(Session("usuario"))
pass trim(Session("password"))

conexion.execute "UPDATE clientes SET online=False WHERE trim(usuario)='" user "' and trim(password)= '" pass "'" 
Luego.. yo intentaría probar otra solución. Olvídate del campo online de la base de datos y cuando el usuario se loguee create una variable de Aplicación.

Cada vez que se loguee alguien comprueba si esa variable de aplicación existe y en ese caso no podrá autentificarse. Si no existiera entonces haces el procedimiento normal.

Mírate los enlaces que te pasé .. lo explica todo perfectamente.. como crear variables de aplicación etcétera.
  #9 (permalink)  
Antiguo 31/05/2003, 02:20
Avatar de epa2  
Fecha de Ingreso: abril-2002
Ubicación: Málaga
Mensajes: 1.475
Antigüedad: 22 años, 2 meses
Puntos: 9
Gracias de nuevo Helbira,

sigo con ello, luego te digo.

hasta ahora
__________________

***Aprendiz de todo y maestro de nada***
  #10 (permalink)  
Antiguo 11/06/2003, 11:28
Avatar de epa2  
Fecha de Ingreso: abril-2002
Ubicación: Málaga
Mensajes: 1.475
Antigüedad: 22 años, 2 meses
Puntos: 9
necesito ayuda, un amigo y yo estamos intentando que esto funcione pero no nos sale. Os cuento lo que hemos hecho, despues de sopesar los pros y los contras nos hemos decantado por utilizar el objeto Application del global.asa.

el archivo Global.asa es el siguiente....

Código PHP:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>

Sub Application_OnStart
        
    
'CONTROLAR LA CONEXION SIMULTANEA DE LOS USUARIOS
                Application.Lock
                set Application("online")=Server.CreateObject("Scripting.Dictionary")
                set Application("online")=nothing
                Application.Unlock
    
End Sub


Sub Session_OnEnd
    '
-----------------------------------------------------    
    
nkey=session("password") & "," session("usuario")
    if 
Application("online").Exist(nkeyTHEN
    Application
("online").Remove nkey
    End 
if
    ---------------------------------------------------
    
    
End Sub

</SCRIPT>
 
esto en la página del GLOBAL.ASA y en la página del login.asp tenemos lo siguiente


Código PHP:
<%else
'eliminamos las posibles comillas de la entrada
'
para evitar la introducción de sentencias SQL
usuario
=replace(request.form("usuario"),"'","")
password=replace(request.form("password"),"'","")
usuario=request.form("usuario")
password=request.form("password")
nkey="password" "," "usuario"
basedatos=server.mappath("../data/clientes.mdb")
set conexion server.createobject("adodb.connection")
conexion.open "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" basedatos ";"
set registros=conexion.execute("SELECT * FROM clientes WHERE  usuario='"&usuario&"' and password= '"&password&"'")

                        if 
registros.eof then
                    response
.redirect "login.asp?msg=Usuario%20o%20password%20incorrectos"
                        
end if
                        
                        if 
Application("online").Exist(nkeyTHEN
                        response
.redirect "login.asp?msg= Lo sentimos, ya existe un usuario dentro  utilizando su nombre de usuario y password "

                         
ELSE
                        
Application("online").Add nkey ""
                        
session("password")=registros("password")
                            
session("usuario")=registros("usuario")
                                
session("nombre")=registros("nombre")
                                    
session("apellido1")=registros("apellido1")
                                        
session("apellido2")=registros("apellido2")
                                            
session("autorizacion")=1
                                                session
.TimeOut 20
                        registros
.close
                            conexion
.close
                                set registros 
nothing
                                    set conexion 
nothing
                        
                                        response
.redirect "fullscreen.htm"

end if
end if

%> 
bueno, este es el codigo, espero que hayan tenido paciencia para leerlos, (perdon si me he enrollado poniendo código)

el problema es que cuando ABRO LA PÁGINA DEL LOGIN.ASP EL NAVEGADOR ME DA UN ERROR QUE JAMAS HABIAMOS VISTO NI TENEMOS IDEA,

si alguíen puede colaborar, gracias de antemano.

el error es el siguiente....

Código PHP:
Objeto Application error 'ASP 0197 : 80004005' 

Uso no autorizado de objeto 

//global.asa, line 16 

Sólo los objetos con el modelo de subprocesamiento controlado se pueden agregar al objeto intrínseco aplicación
ni idea amigos, favor de un cable,

EN LA LINEA 16 DONDE INDICA EL ERROR, TENGO LO SIGUIENTE...
Código PHP:
set Application("online")=Server.CreateObject("Scripting.Dictionary"

SOS
SOS
SOS
SOS

hombre, yo sabía que el tema era dificil, pero


¿no hay nadie por ahí?
__________________

***Aprendiz de todo y maestro de nada***

Última edición por epa2; 11/06/2003 a las 11:28
  #11 (permalink)  
Antiguo 11/06/2003, 11:33
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 7 meses
Puntos: 5
Ese tipo Diccionario ahí es lo que me tiene descuadrada...

No dudo que no se pueda hacer.. pero es que.. no puedo entretenerme.... y eso es para entretenerse un ratito haciendo probaturas.

Es tiempo el problema..

Un beso y suerte
  #12 (permalink)  
Antiguo 11/06/2003, 13:39
Avatar de epa2  
Fecha de Ingreso: abril-2002
Ubicación: Málaga
Mensajes: 1.475
Antigüedad: 22 años, 2 meses
Puntos: 9
¡¡¡¡¡POR FIN, POR FIN LO TENGO¡¡¡¡


¡¡¡¡FUNCIONAAAAA¡¡¡¡¡ YUPIIIIIIII

Cita:
MUCHISIMAS GRACIAS A LA INESTIMABLE AYUDA DE EPA5, SIN EL, ESTE POST NO HUBIERA SALIDO ADELANTE
Gracias.

(Esto es digno de colgarlo dentro de las FAQS de ASP)

pues seguro que a muchos le intereseran el tema del control de acceso por medio de usuario y password de una bd je je je.

espero vuestra opinión amigos
__________________

***Aprendiz de todo y maestro de nada***
  #13 (permalink)  
Antiguo 11/06/2003, 13:42
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 7 meses
Puntos: 5
Por lo menos di que era para los que hemos dedicado tiempo en buscar que fallaba sin esperar nada a cambio.
  #14 (permalink)  
Antiguo 11/06/2003, 14:52
Avatar de affv  
Fecha de Ingreso: diciembre-2002
Ubicación: Ahora aqui
Mensajes: 485
Antigüedad: 21 años, 6 meses
Puntos: 0
Claro.. yo soy uno de esas personas que le interesa el codigo yo hace un tiempo estube probando pero no lo logre, entonces me gustaria ver el codigo completo para ver en donde estaba mi error

Muy buen post.!!!
__________________
Todo tiene un comienzo y un fin!!
Postea tus proyectos
  #15 (permalink)  
Antiguo 12/06/2003, 05:33
Avatar de epa2  
Fecha de Ingreso: abril-2002
Ubicación: Málaga
Mensajes: 1.475
Antigüedad: 22 años, 2 meses
Puntos: 9
Hola Helbira, me alegro de que andes por este post,

el tenerte cerca es una garantía de profesionalidad,

pero por favor, (quizás llevado por la emoción hablé muy pronto)

en principio el codigo funciona, lo que pasa es que lo estoy chekeando completamente y no quiero ponerlo sin estar completamente seguro.

un momento nada más por favor y lo cuelgo pronto.

Gracias.

Lo prometido es deuda.

aquí está el codigo.

Básicamente, es que desde el archivo Global.asa creamos un objeto. MUY IMPORTANTE, ESE OBJETO NO PUEDE IR DENTRO DEL TAG <SCRIPT> DEL GLOBAL.ASA (al menos eso pone la documentación que he leido)

ARCHIVO GLOBAL.ASA

Código PHP:
<object runat="server" scope="application" id="online"
progid="Scripting.Dictionary"">
</object>

<SCRIPT LANGUAGE=VBScript RUNAT=Server>

Sub Application_OnStart
    
End Sub

Sub Session_OnStart

End Sub

Sub Session_OnEnd
    '-----------------------------------------------------
    'INSERTAMOS EN LA VARIABLE NKEY LAS SESIONES PARA COMPROBAR SI EXISTE YA UN USUARIO EN LA WEB    
    nkey=session("
password") & "," & session("usuario")
    if online.Exists(nkey) THEN
        online.Remove nkey
    End if
        
End Sub

</SCRIPT> 

Y EN LA PÁGINA EN LA QUE SE HACE LA CONSULTA A LA BASE DE DATOS CON USUARIO Y PASSWORD VA LO SIGUIENTE....

Código PHP:
'eliminamos las posibles comillas de la entrada
'
para evitar la introducción de sentencias SQL
usuario
=replace(request.form("usuario"),"'","")
password=replace(request.form("password"),"'","")
usuario=request.form("usuario")
password=request.form("password")
'-----------------------------------------------------------------------------------------------------------------------------------------
'
LA SIGUIENTE LINEA NOS SIRVE PARA CONTROLAR QUE UN USUARIO NO ESTE AL MISMO TIEMPO 
'DOS VECES DENTRO DE LA WEB CON SU USUARIO Y PASSWORD.PARA MAS INFORMACION MIRAR EL ARCHIVO GLOBAL.ASA
nkey=password & "," & usuario
'
------------------------------------------------------------------------------------------------------------------------------------------
basedatos=server.mappath("../data/clientes.mdb")
set conexion server.createobject("adodb.connection")
conexion.open "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" basedatos ";"
set registros=conexion.execute("SELECT * FROM clientes WHERE  usuario='"&usuario&"' and password= '"&password&"'")

                        if 
registros.eof then
                            response
.redirect "login.asp?msg=Usuario%20o%20password%20incorrectos"
                        
end if
                        
'-----------------------------------------------------------------------------------------------------------------------------
                        '
EN ESTA LINEA COMPROBAMOS SI EL USUARIO YA SE ENCUENTRA DENTRO DE LA WEB
                        
if online.Exists(nkeyTHEN
                        response
.redirect "login.asp?msg= Lo sentimos, ya existe un usuario dentro del campus utilizando su nombre de usuario y password "
                        '--------------------------------------------------------------------------------------------------------------------------------
 
                         ELSE
                        '
SI NO SE HA CREADO AÚN EL USUARIO DESDE EL GLOBAL.ASA CREAMOS LAS SESIONES Y LE DEJAMOS ENTRAR
                        online
.Add nkey "a"
                        
session("password")=registros("password")
                            
session("usuario")=registros("usuario")
                                
session("nombre")=registros("nombre")
                                    
session("apellido1")=registros("apellido1")
                                        
session("apellido2")=registros("apellido2")
                                            
session("autorizacion")=1
                                                session
.TimeOut 20
                        registros
.close
                            conexion
.close
                                set registros 
nothing
                                    set conexion 
nothing
                        
                                        response
.redirect "fullscreen.htm"

                                        
end if
                                        
end if

%> 
Bueno amigos, si quereis probarlo a ver como va, a mi me funciona bien.

Un saludo
__________________

***Aprendiz de todo y maestro de nada***

Última edición por epa2; 12/06/2003 a las 05:36
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 23:26.