Alessio Luffarelli - Sito Web
Sei qui: Guide e Tutorial / Web / Autenticazione in ASP.Net
Area riservata e autenticazione in ASP .Net

PREMESSA

In questo Tutorial vediamo come gestire l'autenticazione degli utenti in un sito web. Vedremo due forme tipiche di autenticazione: L'autenticazione di pochi amministratori in un'area privata del sito e l'autenticazione di tutti gli utenti registrati. Se vi interessa solo una di queste due forme di autenticazione saltate direttamente a quella di vostro interesse. Per una maggiore comprensione dell'argomento vi consiglio però di leggere l'intero articolo.

AREA RISERVATA

Una situazione abbastanza tipica nei siti web è quando si ha un parte del sito accessibile a qualunque visitatore e una parte riservata ai soli amministratori, attraverso la quale si possono effettuare operazioni di gestione. Vediamo come realizzare una situazione di questo tipo in ASP .Net.

Innanzitutto creiamo una cartella nel nostro sito web che sarà la nostra "area protetta". Nel nostro esempio tale cartella si chiamerà Admin e sarà presente nella directory principale del sito web. In tale cartella inseriremo un form di login (tra un attimo vedremo come), che chiameremo Login.aspx, e tutte le pagine di amministrazione che desideriamo. Alla fine della procedura, tali pagine saranno protette da accessi indesiderati. Cominciamo.

Nel file Web.config definiamo le impostazioni per realizzare quanto detto, in questo modo:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <!-- Altre eventuali impostazioni -->

  <system.web>

    <authentication mode="Forms">
      <forms name=".MYSITEAUTH" loginUrl="Admin/Login.aspx" protection="All" path="/">
        <credentials passwordFormat="Clear">
          <user name="paolino" password="paperino" />
          <user name="paperon" password="depaperoni" />
        </credentials>
      </forms>
    </authentication>

    <authorization>
      <allow users="*" />
    </authorization>

  </system.web>

  <location path="Admin">
    <system.web>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
  </location>

</configuration>

Vediamo di capire cosa abbiamo scritto. Con il blocco <authentication> abbiamo definito la presenza di un form di login all'indirizzo "Admin/Login.aspx" (loginUrl="Admin/Login.aspx"); abbiamo anche specificato che l'autenticazione sarà salvata in un cookie di nome .MYSITEAUTH (name=".MYSITEAUTH"). Nel blocco <credentials> abbiamo poi creato due credenziali (o account - username e password) con cui autenticarsi in tale form: uno è "paolino paperino" e l'altro "paperon depaperoni".

Nel blocco principale <authorization> dichiariamo con il carattere asterisco (*) che qualunque utente può entrare nel nostro sito. Nel blocco successivo restringeremo questo permesso.

Con il blocco <location> definiamo delle nuove impostazioni per la cartella Admin (path="Admin"). E infatti dentro il blocco <authorization> di Admin definiamo con il carattere punto interrogativo (?) che gli utenti sconosciuti (cioè che non si sono autenticati attraverso il login) non possono visualizzare le pagine di tale cartella.

Come funziona il tutto? In pratica, ogni volta che un utente tenta di accedere alla cartella Admin,  il motore di ASP.Net riconoscerà automaticamente che non è autenticato (non ha fatto il login) e lo ridirezionerà, sempre automaticamente, al form di autentizione definito nel blocco <authentication>.

Ora che abbiamo impostato correttamente il file Web.config, non ci resta che creare il form di autenticazione per effettuare il login. Creiamo quindi la pagina Login.aspx (dentro la cartella Admin). In questa pagina inseriamo i seguenti controlli:

  • Una TextBox di nome txtUser
  • Una TextBox di nome txtPass con la proprietà TextMode impostata su Password
  • Una ChekBox di nome chkPersistentCookie
  • Un Button di nome btnLogin

Dobbiamo ora inserire il codice di autenticazione nell'evento Click del Button, in questo modo:

If Web.Security.FormsAuthentication.Authenticate(txtUser.Text, txtPass.Text) Then
   Web.Security.FormsAuthentication.RedirectFromLoginPage(txtUser.Text, chkPersistentCookie.Checked)
Else
   ' Visualizzare un messaggio di autentizione fallita
End If

Con il controllo If...Authenticate(), diciamo ad ASP.Net di verificare automaticamente le credenziali dell'utente, dandogli come username e password quelli inseriti dall'utente e cioè contenuti rispettivamente in txtUser e txtPass. ASP .Net confronterà tali credenziali con quelle inserite nel blocco <credentials> del file Web.config. Se le credenziali corrispondono, autentichiamo l'utente con l'istruzione

Web.Security.FormsAuthentication.RedirectFromLoginPage(txtUser.Text, chkPersistentCookie.Checked)

altrimenti visualizziamo un messaggio di errore. Il metodo RedirectFromLoginPage prende in ingresso due parametri: il nome dell'utente (nel nostro esempio contenuto in txtUser.Text) e un valore booleano che indica se salvare oppure no il login dell'utente in un cookie, in modo tale da non dover reinserire la username e la password ogni volta che si accede alla sezione riservata con una nuova sessione; nel nostro esempio sarà l'utente a decidere questa cosa attraverso la CheckBox. Il metodo RedirectFromLoginPage si occupa anche di redirigire l'utente alla pagina che aveva chiesto inizialmente.

Ora tutte le pagine contenute nella cartella Admin sono protette. Se da queste pagine vogliamo conoscere il nome dell'utente, lo possiamo fare con l'istruzione:

Dim User as String = User.Identity.Name

Se invece vogliamo inseire un link che effettua il logout dell'utente, possiamo inserire nella pagina una LinkButton di nome lbtnLogout e inserire questo codice nell'evento click di tale oggetto:

Web.Security.FormsAuthentication.SignOut()
Response.Redirect("../Index.aspx")

AUTENTICAZIONE MULTIUTENTE

Questa modalità è utile quando si ha un sito web che è visualizzabile a tutti i visitatori ma solo gli utenti registrati possono fare operazioni quali inserire commenti, fare acquisti, ecc..

A differenza del caso precedente, qui non abbiamo una cartella che contiene tutte e sole le pagine protette, ma l'intero sito web può essere mostrato in due modalità: una modalità, definiamola così, in "sola lettura" con cui i visitatori possono leggere i contenuti del sito e una modalità con cui si offre agli utenti registrati di effettuare alcune operazioni di interazione (cosa dipende poi dal tipo di applicazione che state realizzando).

Realizzare un sito web con questa struttura è abbastanza semplice, in quanto è sufficiente aggiungere al sito un form di login ed inserire del codice nelle pagine che riconosca se l'utente è loggato oppure no. In questo esempio supporremo che le credenziali degli utenti registrati siano contenute in un database; in particolare in una tabella di nome Utenti che ha un campo di nome User e uno di nome Pass.

Vediamo come realizzare il form di login. Creiamo una pagina di nome Login.aspx e inseriamo all'interno i seguenti controlli:

  • Una TextBox di nome txtUser
  • Una TextBox di nome txtPass con la proprietà TextMode impostata su Password
  • Un Button di nome btnLogin

Ora, supponendo come già detto che le credenziali degli utenti registrati siano contenuti in un database, inseriamo nell'evento Click del Button il seguente codice:

Dim connectionString As String = ' Inserire la connectionstring qui
Dim query As String
Query = "SELECT * FROM Utenti WHERE User='" & txtUser.Text & "' AND Pass='" & txtPass.Text & "'"
Dim conn As New OleDb.OleDbConnection(connectionString)
Dim cmd As New OleDb.OleDbCommand(query, conn)
Dim reader As OleDb.OleDbDataReader

Try
   conn.Open()
   reader = cmd.ExecuteReader
   If reader.Read() Then
     ' Controllo necessario per il case sensitive
     If txtUser.Text = reader("User") And txtPass.Text = reader("Pass") Then
       ' Aggiungo l'utente alla sessione ed effettuo il redirect alla Home
       Session.Add("User", txtUser.Text)
       Response.Redirect("Index.aspx")
     Else
       ' Username o Password errate
     End If
   Else
     ' Username o Password errate
   End If
Catch ex As Exception
   ' Errore
Finally
   ' Se la connessione è rimasta aperta, la chiudo
   If Not conn Is Nothing Then
     conn.Close()
   End If
End Try

In pratica abbiamo semplicemente verificato se la username e la password inserite dall'utente nel form sono presenti nel database; in caso negativo visualizziamo in qualche modo un messaggio di errore, mentre in caso affermativo aggiungiamo alla sessione lo username dell'utente e lo mandiamo alla home page del sito.

A questo punto, per sapere in una pagina se un utente ha effettuato il login oppure no, è sufficiente inserire questo codice (ad esempio nell'evento Page_Load della pagina):

If Session.Item("User") <> "" Then
   ' L'utente è registrato ed ha fatto il login
   ' Mostra i comandi da utente registrato
Else
   ' L'utente non ha fatto il login
   ' Visualizza solo la pagina, senza i comandi
End If

Per realizzare un link di logout, inserite nella pagina una LinkButton di nome lbtnLogout e inserite questo codice nell'evento Click():

Session.Abandon()
Response.Redirect("Index.aspx")

con cui prima abbandoniamo la sessione creata al momento del login e poi mandiamo l'utente alla home page del sito.

CONCLUSIONE

Questo tutorial finisce qui. Spero vi sia stato utile. Come al solito contattatemi pure per qualsiasi dubbio o anche semplicemente per dirmi cosa ne pensate.

(C) Alessio Luffarelli