Autenticazione di ASP.NET: Forms Authentication

2 pagine in totale: <<Indietro 1 [2]

La presenza di questo cookie implica la sicurezza che l'utente è già stato autenticato ed il cookie contiene l'identità dell'utente. ASP.NET verifica quindi se l'utente possiede le credenziali per accedere alla risorsa richiesta e, in caso affermativo, la invia. In caso contrario l'utente non può accedere alla risorsa.

Se il cookie non è presente negli header della richiesta l'utente viene automaticamente reindirizzato alla pagina contente il form di login personalizzato. L'utente inserisce le credenziali che verranno verificate. In caso l'utente venga riconosciuto viene aggiunto agli header il cookie di autenticazione e la richiesta viene inviata per l'autenticazione alla fase successiva. Come in precedenza ASP.NET verifica le credenziali dell'utente che viene indirizzato o meno alla risorsa.

Configurazione dell'autenticazione basata su Form

Come visto in precedenza l'autenticazione basata su Form viene impostata all'interno della sezione del file di configurazione web.config specificando il valore forms per l'attributo mode:

<configuration>
   <system.web>
      <authentication mode="Forms">
         <forms
     name="nome_del_cookie"
     path="path_del_cookie"
     loginurl="url_di_login"
     protection="All|None|Encryption|Validation"
     timeout="minuti_di_vita_del_cookie"
   />
            <credentials passwordFormat="Clear|SHA1|MD5">
               <user name="username" password="password" />
            </credentials>
         </forms>
      </authentication>
   </system.web>
</configuration>

Vediamo ora in dettaglio gli attributi dell'elemento :

name

Specifica il nome del cookie di autenticazione che verrà creato

path

Specifica il path per cui il cookie è valido. Normalmente viene impostato a / per proteggere il sito completo

loginurl

Specifica il percorso virtuale del file contenente il form di accesso

protection

Specifica il livello di protezione per il cookie:
  • All: utilizza sia la crittografia che la convalida dei dati;
  • None: utilizzata se viene utilizzata una convalida personalizzata;
  • Encryption: il cookie è criptato ma non viene eseguita la convalida dei dati;
  • Validation: viene eseguita la convalida dei dati e il cookie non è criptato.

timeout

Specifica i minuti per la scadenza del cookie

Indentate nell'elemento <forms> troviamo un l'elemento opzionale <credentials> che specifica l'algoritmo utilizzato per criptare le password degli utenti mediante l'attributo passwordFormat. A sua volta l'elemento <credentials> può contenere l'elenco degli utenti che potranno accedere alle risorse, mediante l'attributo <user>.

Il form di login

Giunti a questo punto, dopo aver analizzato la struttura delle sezioni relative del file web.config, passiamo alla pratica creando il form di accesso che servirà per recuperare le credenziali dell'utente che vuole accedere alle nostre risorse protette.

Il seguente codice mostra la parte HTML della pagina FormLogin.aspx che utilizzeremo nel corso di questo articolo:

<%@Page Language="VB" %>
<%@Import Namespace="System.Web.Security" %>

<html>
<head>
 <title>Autenticazione con ASP.NET basata su Form</title>
 <link rel="stylesheet" href="stile.css" type="text/css">
</head>
<body>
 <h1>Login: inserimento Username e Password</h1>
 <form runat="server">
   Username: <input id="txtUsername" type="text" runat="server" /><p />
   Password: <input id="txtPassword" type="password" runat="server" /><p />
   <input type="submit" value="Effettua il Login" runat="server" onserverclick="DoLogin" /><p />
   <div id="outMessage" runat="server" />
 </form>
</body>
</html>

Il codice genera un semplice pagina di login con 2 campi di testo per l'inserimento di Username e Password. Il bottone per l'invio dei dati attiva l'evento DoLogin che implementerà la procedura di controllo delle credenziali fornite. Ultimo elemento presente nella pagine è un <div> utilizzato per la visualizzazione degli errori.

La routine di login

Una volta che l'utente inserisce le proprie credenziali all'interno del form di accesso e preme il pulsante Effettua il Login, si scatenerà l'evento DoLogin associato al pulsante stesso.

Sarà necessario quindi scrivere il codice per autenticare l'utente; per far questo faremo riferimento al namespace System.Web.Security utilizzando la classe FormsAuthentication, che gestisce la protezione basata su form.

Per prima cosa vediamo quali sono i metodi e le proprietà comunemente utilizzate da questa classe:

Autenticate

Verifica se le credenziali fornite dall'utente sono valide confrontandole con quelle inserite nel file web.config

GetAuthCookie

Restituisce il cookie di autenticazione senza aggiungerlo agli header della risposta (utile per personalizzare il cookie)

GetRedirectUrl

Restituisce il percorso della pagina che l'utente ha richiesto prima di essere reindirizzato alla pagina di login

RedirectFromLoginPage

Esegue le azioni necessarie dopo l'autenticazione dell'utente, quali la creazione del cookie criptato, l'aggiunta agli header della richiesta e il reindirizzamento alla pagina richiesta

SetAuthCookie

Crea il cookie criptato e lo aggiunge agli header ma non reindirizza l'utente.

SignOut

Elimina il cookie criptato corrente e disconnette l'utente dall'applicazione

Per autenticare l'utente dovremmo quindi scrivere il gestore di eventi DoLogin che sarà eseguito quando l'utente premerà il pulsante Effettua il Login.

<script language="VB" runat="server">
Sub DoLogin(objSender As Object, objArgs As EventArgs)

 If FormsAuthentication.Authenticate(txtUsername.Value, txtPassword.Value) Then
   FormsAuthentication.RedirectFromLoginPage(txtUsername.Value, False)
 Else
   outMessage.InnerHtml = "<b>Username o password errati</b>"
 End If

End Sub
</script>

Il web.config

Passiamo ora alla creazione del file web.config, dove andremo ad indicare quali utenti avranno la possibilità di accedere o meno alle risorse.

<configuration>
<system.web>

 <authentication mode="Forms">
   <forms path="/" loginUrl="FormLogin.aspx" protection="All" timeout="30">
     <credentials passwordFormat="Clear">
      <user name="kappa" password="test" />
      <user name="webngo" password="test" />
     <user name="aspitalia" password="test" />
     </credentials>
   </forms>
 </authentication>

 <authorization>
   <allow users="kappa,webngo,aspitalia" />
   <deny users="?" />
 </authorization>

</system.web>
</configuration>

Analizzando la struttura del file web.config possiamo notare che è stata specificata la pagina FormLogin.aspx come loginUrl, quindi questa pagina sarà caricata nel momento in cui un utente non autenticato cercherà di accedere all'applicazione.

Nella sezione credentials sono specificati il nome utente e la password degli utenti a cui sarà consentito l'accesso all'applicazione.

La sezione authorization che segue indica che gli utenti kappa, webngo e aspitalia sono gli unici a cui è consentito l'accesso, in quanto è stato inserito l'elemento <deny users="?" /> che impedisce l'accesso anonimo all'applicazione.

Default.aspx

Quando l'utente accede per la prima volta alla pagina default.aspx nella cartella protetta sarà reindirizzato automaticamente alla pagina di login, dove verranno inserite username e password.

La parte HTML della pagina contiene semplicemente le due textarea dove l'utente inserirà le proprie credenziali ed un elemento <div> utilizzato per la visualizzazione degli errori.

<html>
<head>
<title>Autenticazione con ASP.NET basata su Form</title>
<link rel="stylesheet" href="stile.css" type="text/css">
</head>
<body>
<h1>Autenticazione con ASP.NET basata su Form</h1>

<div id="outMessagge" runat="server" /><p />

<form runat="server">
 <input type="submit" Value="Effettua il Logout" runat="server" onserverclick="DoLogout" /><p />
</form>

</body>
</html>

Per prima cosa nell'evento Page_Load della pagina verifichiamo se l'utente è già stato autenticato: in caso positivo accederemo alle proprietà dell'oggetto User.Identity per recuperare il nome ed il tipo di autenticazione utilizzato; in caso l'utente non possa essere autenticato verrà visualizzato nell'elemento <div> outMessagge un messaggio di errore.

Sub Page_Load()

 If User.Identity.IsAuthenticated Then
   outMessagge.InnerHtml = "Benvenuto <b>" & User.Identity.Name & "</b><br />" & "Il metodo di autenticazione utilizzato è: <b>" & User.Identity.AuthenticationType & "</b>"
 Else
   outMessagge.InnerHtml = "Ci spiace ma non sei autenticato"
 End If

End Sub

Nella pagina è presente anche un pulsante di logout, che se premuto scatenerà l'evento DoLogout utilizzato per disconnettere l'utente dall'applicazione, eliminando il cookie che contiene le informazioni di autenticazione dell'utente, che sarà reindirizzato alla pagina di login dove dovrà fornire nuovamente le proprie credenziali.

Sub DoLogout(objSender As Object, objArgs As EventArgs)

 FormsAuthentication.SignOut()
 Response.Clear()
 Response.Redirect(Request.UrlReferrer.ToString())

End Sub

Conclusioni

In questo articolo abbiamo visto come con ASP.NET risulti facile implementare una soluzione di protezione delle proprie applicazioni web. Un vantaggio indubbio rispetto a Classic ASP è l'utilizzo del file web.config che da' la possibilità di creare un sistema di protezione sicuro e allo stesso tempo semplice anche in situazioni in cui non è possibile andare a modificare le impostazioni di protezione di IIS, caso molto comune se la nostra applicazione è ospitata in hosting su macchine presso un provider.

Una cosa che si sarà notata analizzando il file web.config è che le password degli utenti sono memorizzate solo in testo, quindi chiunque potesse vedere il file (anche se questo risulta difficile, in quanto tutte le richieste di questo file sono automaticamente bloccate da ASP.NET) entrerebbe in possesso delle credenziali degli utenti abilitati.

Nel prossimo articolo di questa serie, infine, vedremo come risolvere questo problema, criptando le password all'interno del file web.config ed utilizzando sia un file XML sia un database relazionale come base per il salvataggio delle credenziali.

Approfondimenti

2 pagine in totale: <<Indietro 1 [2]

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC