|
ASP: la guida introduttiva
Capitolo 14 - Costruire un'area ad accesso riservato
14.0 Presentazione
del tutorial
14.1 Creazione
del database
14.2 La
pagina di iscrizione
14.3 La
pagina di "login"
14.4 I
documenti riservati
14.5 La
pagina di "logout"
14.6 Conclusioni
14.0 - Presentazione del tutorial
Le
conoscenze acquisite in materia di ActiveX, accesso ai database
e oggetti built-in verranno ora messe a frutto realizzando una
semplice, quanto funzionale, area ad accesso riservato. Con
questo termine si è soliti indicare una sezione di un sito Web
la cui visualizzazione, per diversi motivi, non è pubblica, ma
riservata ad un'utenza più ristretta. Ogni utente che vanti il
permesso di poter accedere a sezioni di questo tipo dispone
solitamente di una coppia di valori
username-password, che può utilizzare per farsi
riconoscere dal sistema e per farsi garantire l'accesso alla
porzione protetta del Web. I motivi che possono spingere alla
realizzazione di un servizio del genere sono molteplici,
distinti da situazione in situazione. Almeno due sono comunque i
casi più tipici. Il primo di questi è rappresentato da alcune
aziende che necessitino di mettere a disposizione dei propri
dipendenti delle informazioni riservate, comodamente accessibili
via Web, anche quando si è a diversi chilometri di distanza
dalla sede. Il secondo caso, invece, riguarda quei siti che
richiedono una certa garanzia dalla propria utenza per rendere
loro un servizio migliore, o comunque per fornire
un'applicazione la cui funzionalità sia basata proprio sul fatto
di saper distinguere un utente da un altro. La guida farà
riferimento a questo secondo caso, realizzando una pagina di
iscrizione pubblica, grazie alla quale chiunque potrà ottenere
la propria coppia di valori username-password per accedere
all'area protetta. Nulla toglie, comunque, che l'esempio resti
valido anche nel primo caso. Basterebbe infatti eliminare la
pagina di iscrizione pubblica e affidare la gestione e lo
smistamento dell'utenza ad un amministratore appositamente
designato. In ogni caso il tutorial, come al solito, non vuole
rendere al lettore un servizio bello e pronto, quanto piuttosto
guidarlo alla scoperta dei meccanismi che devono essere appresi
per affrontare un problema del genere, in maniera tale che
ognuno, in base alle differenti esigenze, possa poi essere in
grado di realizzare un'applicazione analoga, pensata però in
maniera specifica per un particolare caso.
14.1
- Creazione del database
Dovendo
fornire a numerosi utenti delle distinte coppie
username-password, è facile comprendere come sussista l'esigenza
di memorizzare ciascuna di queste coppie all'interno del Web
server, in maniera riservata, affinché il programma di
validazione dati sia in grado di analizzare i dati immessi
dall'utente e determinare in base ad essi se dover concedere o
meno l'accesso all'area protetta. La prima mossa necessaria
consiste quindi nello stabilire in quale maniera tali valori
debbano essere memorizzati. Per l'esempio qui presentato si
adotterà un database di Access, protetto tramite password.
Creare il database necessario per l'esercitazione risulta
abbasta semplice:
1.
Si apra la propria copia di Access.
2. Si selezioni dal menù iniziale la voce "Database di
Access vuoto".
3. Si nomini il nuovo database come
utenza.mdb e lo si vada a posizionare all'interno della
cartella che si intende utilizzare per l'esperimento.
4. Dalla finestra di gestione del database si selezioni
la voce "Crea una tabella in visualizzazione Struttura".
5. Si definiscano ora i 3 seguenti campi:
id, di tipo "Contatore";
username, di tipo "Testo",
password, di tipo "Testo" (opzionalmente
nella maschera di input è possibile specificare la dicitura
"Password", per ottenere una visualizzazione in asterischi del
campo quando il database viene aperto in Access).
6. Si selezioni la riga corrispondende al campo id e si
utilizzi il bottone raffigurante una chiave per definire questo
campo come chiave primaria.
7. Si salvi la tabella nominandola
utenti.
Il
database risulta già in questa forma adatto per l'utilizzo
all'interno dell'esempio. Tuttavia è bene proteggere con una
password ciascun database che possa contenere informazioni
riservate, come nel caso in analisi. Tenendo aperto il database
all'interno di Access, è possibile compiere tale operazione alla
seguente maniera:
1.
Dal menù si selezioni la voce "Strumenti > Protezione > Imposta
password database...".
2. Si digiti la password desiderata, ad esempio "prova".
3. Si digiti la stessa password nel campo "Verifica".
4. Si confermi con il tasto "Ok" l'intera operazione.
Da
questo momento in poi il database utenza.mdb risulterà protetto
da password. Chiudendo Access e tentando di riaprire il file,
infatti, se tutto è andato a buon fine, si dovrebbe ricevere la
richiesta di inserimento della password.
14.2
- La pagina di iscrizione
A
questo punto è necessario realizzare anzitutto uno script in
grado di consentire agli utenti di registrarsi, ottenendo una
coppia di valori username-password utilizzabili per accedere
successivamente all'area protetta. Servirà anzitutto una comune
pagina HTML (iscrizione.htm)
contenente il modulo da compilare per richiedere l'adesione al
servizio:
<html>
<head>
<title>Iscrizione al servizio</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div align="center">
<p><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">ISCRIZIONE AL SERVIZIO</font></b></p>
<form method="post" action="iscrivimi.asp">
<p>
<font face="Verdana, Arial, Helvetica, sans-serif" size="2">USERNAME:</font><br>
<input type="text" name="username" maxlength="20" size="25">
</p>
<p>
<font face="Verdana, Arial, Helvetica, sans-serif" size="2">PASSWORD:</font><br>
<input type="password" name="password1" size="25" maxlength="20">
</p>
<p>
<font face="Verdana, Arial, Helvetica, sans-serif" size="2">CONFERMA
PASSWORD:</font><br>
<input type="password" name="password2" size="25" maxlength="20">
</p>
<p><input type="submit" value="ISCRIVIMI"></p>
</form>
</div>
</body>
</html>
A ricevere e
processare i dati ci penserà quindi
iscrivimi.asp, come mostrato di seguito:
<%@ LANGUAGE = JScript %>
<%
function visualizzaErrore(messaggioDiErrore) {
// Mostra il messaggio di errore e interrompe il programma
Response.Write('<html>\n');
Response.Write('<head>\n');
Response.Write('<title>Iscrizione al servizio</title>\n');
Response.Write('<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">\n');
Response.Write('</head>\n');
Response.Write('<body bgcolor="#FFFFFF" text="#000000">\n');
Response.Write('<div align="center">\n');
Response.Write('<p> </p>\n');
Response.Write('<p><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#660000">');
Response.Write('ERRORE: ' + messaggioDiErrore);
Response.Write('</font></b></p>\n');
Response.Write('<p><font face="Verdana, Arial, Helvetica, sans-serif" size="2">[<a href="#" onClick="history.back()">TORNA INDIETRO</a>]</font></p>\n');
Response.Write('</div>\n');
Response.Write('</body>\n');
Response.Write('</html>\n');
Response.End;
}
// PASSO 1: si riceve e si valida il modulo
username = String(Request.Form("username"));
password1 = String(Request.Form("password1"));
password2 = String(Request.Form("password2"));
if (username=="" || username=="undefined") visualizzaErrore("SPECIFICARE LO USERNAME");
if (username.charAt(0)==" ") visualizzaErrore("HAI INSERITO UNO SPAZIO DI TROPPO PRIMA DELLO USERNAME");
if (username.charAt(username.length-1)==" ") visualizzaErrore("HAI INSERITO UNO SPAZIO DI TROPPO DOPO LO USERNAME");
if (username.length<3 || username.length>20) visualizzaErrore("LO USERNAME DEVE ESSERE COMPRESO TRA 3 E 20 CARATTERI");
if (password1=="" || password1=="undefined") visualizzaErrore("SPECIFICARE LA PASSWORD");
if (password1!=password2) visualizzaErrore("LE DUE PASSWORD NON COINCIDONO");
if (password1.length<3 || password1.length>20) visualizzaErrore("LA PASSWORD DEVE ESSERE COMPRESA TRA 3 E 20 CARATTERI");
// PASSO 2: viene aperta la connessione verso la fonte di dati
ADOConn = new ActiveXObject("ADODB.Connection");
strConn = "";
strConn += "driver={Microsoft Access Driver (*.mdb)};";
strConn += "dbq=" + Server.MapPath("utenza.mdb") + ";";
strConn += "pwd=prova"; // SELEZIONARE QUI LA PASSWORD DI ACCESSO AL DATABASE SCELTA!
ADOConn.Open(strConn);
// PASSO 3: VIENE VERIFICATO CHE LO USERNAME NON SIA GIA' IN USO
tempUsername = username.replace(/'/g,"''");
sql = "SELECT * FROM utenti WHERE username LIKE '" + tempUsername + "'";
ris = ADOConn.Execute(sql);
if (!ris.EOF) {
ris.Close();
ADOConn.Close();
visualizzaErrore("LO USERNAME SPECIFICATO GIA' RISULTA IN USO. MODIFICARE LA PROPRIA SCELTA.");
}
ris.Close();
// PASSO 4: IL NUOVO UTENTE VIENE REGISTRATO
RecSet = new ActiveXObject("ADODB.Recordset");
RecSet.Open("utenti",ADOConn,3,3);
RecSet.AddNew();
RecSet("username") = username;
RecSet("password") = password1;
RecSet.Update();
RecSet.Close();
ADOConn.Close();
%>
<html>
<head>
<title>Iscrizione al servizio riuscita!</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div align="center">
<p><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">COMPLIMENTI, ORA SEI ISCRITTO!</font></b></p>
</div>
</body>
</html>
I
passaggi utilizzati dal codice non sono di difficile
comprensione. E' stata realizzata la funzione
visualizzaErrore, utile per mandare
in output ogni eventuale messaggio di errore e per interrompere
l'esecuzione dello script. Il modulo viene ricevuto e validato
in base a dei criteri piuttosto generici, quindi la connessione
al database viene stabilita. Per prima cosa si verifica che lo
username specificato non sia già stato registrato da un altro
utente, mediante una ricerca case-insensitive (operatore
LIKE). Una volta superato tale
controllo un nuovo record, costituito dai dati appena ricevuti,
viene inserito nella tabella utilizzata. Se tali operazioni non
dovessero risultare di immediata comprensione si torni allora a
rivedere i Capitoli dal 9 al 12, interamente dedicati
all'utilizzo dei database all'interno delle pagine ASP.
14.3
- La pagina di "login"
Per
accedere all'area riservata è ora necessario realizzare una
pagina che consenta all'utente di farsi riconoscere. Ancora una
volta il processo non risulta complicato. Viene qui presentato
il codice di login.asp:
<%@ LANGUAGE = JScript %>
<%
errore = false;
username = String(Request.Form("username"));
password = String(Request.Form("password"));
from = String(Request.QueryString("from"));
if (username!="undefined" && username!="") {
from = Request.Form("from");
ADOConn = new ActiveXObject("ADODB.Connection");
strConn = "";
strConn += "driver={Microsoft Access Driver (*.mdb)};";
strConn += "dbq=" + Server.MapPath("utenza.mdb") + ";";
strConn += "pwd=prova"; // SELEZIONARE QUI LA PASSWORD DI ACCESSO AL DATABASE SCELTA!
ADOConn.Open(strConn);
tempUsername = username.replace(/'/g,"''");
tempPassword = password.replace(/'/g,"''");
sql = "SELECT * FROM utenti WHERE username LIKE '" + tempUsername + "' AND password = '" + tempPassword + "'";
ris = ADOConn.Execute(sql);
if (ris.EOF) errore = true;
else {
Session.Timeout = 15;
Session("username") = String(ris("username"));
ris.Close();
ADOConn.Close();
if (from!="undefined") Response.Redirect(from);
else Response.Redirect("main.asp");
}
ris.Close();
ADOConn.Close();
}
%>
<html>
<head>
<title>Accesso all'area riservata</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div align="center">
<p><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">ATTENZIONE! STAI PER ACCEDERE AD UN'AREA RISERVATA. DEVI AUTENTIFICARTI.</font></b></p>
<% if (errore) { %>
<p><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#FF0000">DATI NON TROVATI, ACCESSO NEGATO</font></b></p>
<% } %>
<form method="post" action="login.asp">
<input type="hidden" name="from" value="<%=from%>">
<p>
<font face="Verdana, Arial, Helvetica, sans-serif" size="2">USERNAME:</font><br>
<input type="text" name="username" maxlength="20" size="25">
</p>
<p>
<font face="Verdana, Arial, Helvetica, sans-serif" size="2">PASSWORD:</font><br>
<input type="password" name="password" size="25" maxlength="20">
</p>
<p><input type="submit" value="ACCEDI"></p>
</form>
</div>
</body>
</html>
Si
osservi il meccanismo utilizzato. Qualora il processo di
autentificazione dovesse andare a buon fine, lo script si
curerebbe allora di creare la variabile
Session("username"), inserendo al suo interno lo username
utilizzato dall'utente. Il perché dell'utilizzo dell'oggetto
built-in Session verrà illustrato nel corso del paragrafo
successivo.
Ci si soffermi ora ad osservare invece l'utilizzo della
particolare variabile from e del
meccanismo di reindirizzamento ad essa collegato. In buona
sostanza l'utente può finire su login.asp in due distinti casi:
quando vi accede direttamente con il proprio browser e quando
tenta di accedere ad un documento riservato senza essersi prima
autentificato. Il primo caso è il più semplice. Nessuna
querystring viene appesa all'URL della pagina, pertanto la
variabile from perde il suo significato. Una volta effettuato il
login l'utente verrà reindirizzato alla pagina
main.asp, qui non trattata, che
dovrebbe ipoteticamente rappresentare l'home page dell'intera
area ad accesso limitato. Quando l'utente tenterà invece di
accedere direttamente ad uno dei documenti protetti dal metodo
che tra poco sarà descritto, senza essersi però autentificato in
precedenza, allora verrà rimandato a login.asp, con l'aggiunta
dell'indirizzo della pagina di provenienza appeso in querystring.
In questa maniera, una volta autentificato, l'utente verrà
rispedito direttamente alla pagina alla quale aveva tentato
originariamente di accedere. Ovviamente essendosi autentificato
potrà in questo caso visualizzarne il contenuto senza problemi.
Si tratta di un'ottima funzionalità aggiuntiva!
14.4
- I documenti riservati
Far
appartenere un particolare documento all'area riservata
significa, di fatto, configurarlo in maniera adeguata secondo le
seguenti indicazioni.
1. Il
documento dovrà avere sempre e comunque estensione .asp, in
quanto includerà il controllo necessario sotto forma di script.
2. Le prime righe del documento dovranno necessariamente essere:
<%@
LANGUAGE = JScript %>
<%
if (Session("username")==null) {
from = escape(String(Request.ServerVariables("SCRIPT_NAME")));
Response.Redirect("login.asp?from=" + from);
}
%>
L'oggetto built-in Session è stato descritto nel Capitolo 13.
Nel caso le pagine dell'area non fossero tutte contenute nella
stessa cartella di login.asp, allora sarà necessario adattare di
volta in volta l'istruzione Response.Redirect, in modo da
puntare sempre alla giusta locazione della pagina utile per il
proprio riconoscimento.
Per testare la funzionalità dello script si realizzi la pagina
prova.asp:
<%@ LANGUAGE = JScript %>
<%
if (Session("username")==null) {
from = escape(String(Request.ServerVariables("SCRIPT_NAME")));
Response.Redirect("login.asp?from=" + from);
}
%>
<html>
<head>
<title>Pagina interna all'area riservata</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div align="center">
<p><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">BENVENUTO
<%=Session("username")%>!</font></b></p>
</div>
</body>
</html>
Si
registri quindi uno username passando per iscrizione.htm, quindi
si inserisca l'URL di prova.asp senza prima essersi
autentificati.
14.5
- La pagina di "logout"
Una
volta che l'utente si è autentificato gli sono concessi, secondo
l'esempio utilizzato, 15 minuti di inattività prima che la sua
sessione scada. Tuttavia in diversi casi è necessario che la
sessione, su comando dell'utente stesso, possa concludersi senza
dover attendere lo scorrere dei 15 minuti dall'ultima operazione
eseguita. Pertanto è oppurtuno inserire all'interno di ognuno
dei documenti protetti un collegamento verso
logout.asp:
<%@ LANGUAGE = JScript %>
<%
Session.Abandon();
%>
<html>
<head>
<title>Uscita dall'area riservata</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div align="center">
<p><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">ARRIVEDERCI!</font></b></p>
</div>
</body>
</html>
14.6
- Conclusioni
Si
conclude qui questo tutorial dedicato ai metodi di
realizzazione, tramite ASP, di un'area ad accesso riservato. Si
lascia ora alla fantasia e alle esigenze del lettore il compito
di adattare quanto appreso ai più disparati casi pratici. |