Newsgroup: it.comp.www.asp
Titolo: Controllo delle sessioni utente.

Salve, dovrei trovare un modo per tenere traccia delle sessioni aperte dagli
utenti della mia applicazione, lo scopo è quello di fare in modo che in ogni
istante vi sia solo un utente  loggato con una stessa login.
Ho individuato due soluzioni possibili: la prima sarebbe quella di
aggiungere una tabella nel database utilizzato dall'applicazione in
questione, dove si tenga traccia delle sessioni aperte dagli utenti; l'altra
quella di utilizzare una matrice n x 2, dove memorizzare in (n,0) il
Session.sessionID ed in (n,1) la login dell'utente.
All'inizio ero più propenso per la seconda soluzione: l'operazione in se è
banale, perchè allora utilizzare una connessione al database; ho così
sviluppato il codice che tra l'altro ho allegato. Purtroppo non riesco a
capire il motivo per cui non si riesce ad inserire dei dati in una variabile
d'applicazione vista come un array (n,1). Vi chiedo quindi un aiuto per
debuggare questo codice, se mai ne abbiate voglia s'intenda.
Comunque riflettendo meglio, mi sono quasi convertito ad adottare la prima
soluzione, anche perchè il mio committente mi ha detto che vorrebbe avere
uno storico degli accessi al sito; registrare anche l'attività delle
sessioni aperte dagli utenti nel database potrebbe essere comodo.
STAT.ASP
<%@ LANGUAGE="VBSCRIPT" %>
<!--#INCLUDE FILE="../../AppManager/APactiveSes.asp"-->
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" content="text/html; charset=iso-8859-1">
<TITLE>DMR - Active Session List</TITLE>
</HEAD>
<BODY>
<br>Active Session List
<%
 maxCU=100 'Max number of concurrent users
 dim a()
 Redim a(maxCU,1) '[i,0]=SessionID,[i,1]=USERDATA
 Application("openSessions")=a
 Application("maxUsers")=maxCU
 Application("current")=0
 add "us005",now()
 add "ad001",now()
 'add "us005",now()
 print
 response.write "<br>get:"&get("us005")
%>
</BODY>
</HTML>
APactiveSes.asp
<SCRIPT LANGUAGE="VBScript" RUNAT=Server>
function get(byval key)
 get=null
 for i=0 to Application("current")
 if Application("openSessions")(i,0)=key  then
    get=Application("openSessions")(i,1)
    exit function
 end if
 next
end function
sub add(byval key,byval value)
 Application.lock
 response.write "<br>Add "&Application("current")&":("&key&","&value&")"
 if Application("current")<= Application("maxUsers") then
  if isNull(get(key)) then
   current=Application("current")
   Application("openSessions")(current,0)=key
   response.write "<br>Add feature "&current&"
key="&Application("openSessions")(current,0)
   Application("openSessions")(current,1)=value
   response.write "<br>Add feature "&current&"
value="&Application("openSessions")(current,1)
   Application("current")=current+1
  else
   response.write "<br>User Already logged"
  end if
 else
   response.write "<br>The server is busy, try later"
 end if
 Application.unlock
end sub
sub remove(byval key)
 dim i
 Application.lock
 for i=0 to Application("current")
  if Application("openSessions")(i,0)=key  then
     exit for
  end if
 next
 if (i= Application("current")) and (Application("openSessions")(i,0)=key)
then
  Application("current")=Application("current")-1
 elseif (i< Application("current")) and
(Application("openSessions")(i,0)=key) then
  for h=i to Application("current")-1
   Application("openSessions")(h,0)=Application("openSessions")(h+1,0)
   Application("openSessions")(h,1)=Application("openSessions")(h+1,1)
  next
  Application("current")=Application("current")-1
 end if
 Application.unlock
end sub
sub removeAll
 Application.lock
 Application("current")=0
 Application.unlock
end sub
sub print
 response.write "<br>#Session Opened:"&Application("current")
 response.write("<table width=50% border=1><tr><td align=center
width=50%>SessionID</td><td align=center width=50%>UserID</td></tr>")
 for i=0 to Application("current")-1
  response.write "<tr><td align=center>"
  response.write Application("openSessions")(i,0)&"</td>"
  response.write "<td align=center>"
  response.write Application("openSessions")(i,1)&"</td></tr>"
 next
 response.write("</table>")
end sub
</SCRIPT>

 istante vi sia solo un utente  loggato con una stessa login.
Non ho molto tempo per guardare il tuo codice oggi, magari lo faccio nei
prox giorni (visto che potrebbe servirmi una cosa del genere).
Io avevo un'esigenza simile: non solo non si doveva loggare piu' di una
persona, ma il cliente non doveva poter passare la login e password ad
altri: da qui la soluzione:
un cookie oltre che la session ''logged'' sul client, il cookie e' generato
di volta in volta in maniera random e copiato oltre che sul client anche nel
record corrispondente alla login dell'utente, Se quando torna, non trovo il
cookie che ho lasciato, vuol dire:
o che naviga con due o piu' browser
o che ha provato ad accedere da un'altra macchina
Ho pero' previsto una procedura veloce per riattivare l'eventuale macchina
che dovesse risultare bloccata (provarci e' umano).
Ricorda pero' che la sicurezza e' inversamente proporzionale alla
dinamicita': ho quindi previsto anche l'opzione per poter spegnere, utente
per utente, la suddetta protezione aggiuntiva, nel caso la cosa risulti
controproducente.
Ciao, Fabio Zed Zamparelli
P.S. Se ti interessa qualche dettaglio in piu' chiedi pure.