Procedura: implementare l'autenticazione basata su form semplice

Aggiornamento: novembre 2007

Nell'esempio riportato in questo argomento viene illustrata un'implementazione semplice di autenticazione basata su form ASP.NET. Lo scopo è quello di presentare i concetti base per l'utilizzo di questo tipo di autenticazione per consentire l'accesso degli utenti a un'applicazione ASP.NET.

xdt4thhy.alert_note(it-it,VS.100).gifNota:

L'autenticazione basata su form risulta particolarmente efficace se utilizzata insieme alle appartenenze e ai controlli di accesso di ASP.NET. Le appartenenze di ASP.NET consentono di memorizzare e gestire le informazioni utente e includono metodi per l'autenticazione degli utenti. I controlli di accesso di ASP.NET vengono utilizzati con le appartenenze di ASP.NET e incapsulano la logica necessaria per richiedere le credenziali agli utenti, convalidare gli utenti, recuperare o sostituire password e così via. Di fatto, i controlli di accesso e le appartenenze di ASP.NET forniscono un livello di astrazione sull'autenticazione basata su form e sostituiscono gran parte o tutto il lavoro che normalmente è necessario svolgere per l'utilizzo dell'autenticazione basata su form. Per ulteriori informazioni, vedere Gestione di utenti tramite l'appartenenza e Cenni preliminari sui controlli di accesso di ASP.NET.

Nello scenario dell'esempio gli utenti richiedono una risorsa protetta, ovvero una pagina chiamata Default.aspx. L'unico utente che dispone di accesso a tale risorsa è jchen@contoso.com, con la password "37Yj*99P". Il nome utente e la password sono stabiliti come hardcoded nel file Logon.aspx. Nell'esempio sono richiesti tre file, ovvero il file Web.config, una pagina denominata Logon.aspx e una pagina denominata Default.aspx. Tali file risiedono nella directory principale dell'applicazione.

Per configurare l'applicazione per l'autenticazione basata su form

  1. Se l'applicazione include un file Web.config nella radice dell'applicazione, aprirlo.

  2. Se l'applicazione non include ancora un file Web.config nella cartella della radice dell'applicazione, creare un file di testo denominato Web.config e aggiungervi i seguenti elementi:

    <?xml version="1.0"?>
    <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
        <system.web>
    
        </system.web>
    </configuration>
    
  3. All'interno dell'elemento system.web creare un elemento authentication e impostarne l'attributo mode su Forms, come illustrato nell'esempio seguente:

    <system.web>
      <authentication mode="Forms">  </authentication>
    </system.web>
    
  4. All'interno dell'elemento authentication creare un elemento forms e impostare gli attributi seguenti:

    • loginUrl   Impostato su "Logon.aspx", ovvero l'URL da utilizzare per il reindirizzamento se ASP.NET non individua un cookie di autenticazione relativo alla richiesta.

    • name   Impostato su ".ASPXFORMSAUTH". Questo valore consente di impostare il suffisso del nome del cookie contenente il ticket di autenticazione.

    <system.web>
      <authentication mode="Forms">
        <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH">    </forms>
      </authentication>
    </system.web>
    
  5. All'interno dell'elemento system.web creare un elemento authorization.

    <system.web>
      <authentication mode="Forms">
        <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH">
        </forms>
      </authentication>
      <authorization>  </authorization>
    </system.web>
    
  6. All'interno dell'elemento authorization creare un elemento deny e impostarne l'attributo users su "?". In questo modo si specifica che agli utenti non autenticati, rappresentati dal simbolo "?", viene negato l'accesso alle risorse di questa applicazione.

    <system.web>
      <authentication mode="Forms">
        <forms loginUrl="logon.aspx" name=".ASPXFORMSAUTH">
        </forms>
      </authentication>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
    
  7. Salvare e chiudere il file Web.config.

Se una pagina del sito Web viene richiesta da utenti che non sono stati precedentemente autenticati, questi ultimi vengono reindirizzati a una pagina denominata Logon.aspx e specificata precedentemente nel file Web.config.

La pagina Logon.aspx contiene le credenziali degli utenti, ovvero l'indirizzo di posta elettronica e la password, e consente di autenticarli. Se l'utente viene autenticato, la pagina di accesso lo reindirizza alla pagina originariamente richiesta. Nell'esempio le credenziali valide sono hardcoded nel codice della pagina.

xdt4thhy.alert_security(it-it,VS.100).gifNota sulla sicurezza:

L'esempio include una casella di testo che accetta l'input dell'utente e rappresenta quindi una potenziale minaccia alla sicurezza. Per impostazione predefinita, le pagine Web ASP.NET verificano che l'input dell'utente non includa script o elementi HTML. Per ulteriori informazioni, vedere Cenni preliminari sugli attacchi tramite script.

Per creare la pagina di accesso

  1. Creare una pagina ASP.NET denominata Logon.aspx nella cartella della radice dell'applicazione.

  2. Copiare il codice seguente e inserirvi elementi di codice:

    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Web.Security" %>
    
    <script runat="server">
      Sub Logon_Click(ByVal sender As Object, ByVal e As EventArgs)
        If ((UserEmail.Text = "jchen@contoso.com") And _
                (UserPass.Text = "37Yj*99Ps")) Then
          FormsAuthentication.RedirectFromLoginPage _
               (UserEmail.Text, Persist.Checked)
        Else
          Msg.Text = "Invalid credentials. Please try again."
        End If
      End Sub
    </script>
    
    <html>
    <head id="Head1" runat="server">
      <title>Forms Authentication - Login</title>
    </head>
    <body>
      <form id="form1" runat="server">
        <h3>
          Logon Page</h3>
        <table>
          <tr>
            <td>
              E-mail address:</td>
            <td>
              <asp:TextBox ID="UserEmail" runat="server" /></td>
            <td>
              <asp:RequiredFieldValidator ID="RequiredFieldValidator1" 
                ControlToValidate="UserEmail"
                Display="Dynamic" 
                ErrorMessage="Cannot be empty." 
                runat="server" />
            </td>
          </tr>
          <tr>
            <td>
              Password:</td>
            <td>
              <asp:TextBox ID="UserPass" TextMode="Password" 
                runat="server" />
            </td>
            <td>
              <asp:RequiredFieldValidator ID="RequiredFieldValidator2" 
                ControlToValidate="UserPass"
                ErrorMessage="Cannot be empty." 
                runat="server" />
            </td>
          </tr>
          <tr>
            <td>
              Remember me?</td>
            <td>
              <asp:CheckBox ID="Persist" runat="server" /></td>
          </tr>
        </table>
        <asp:Button ID="Submit1" OnClick="Logon_Click" Text="Log On"  
           runat="server" />
        <p>
          <asp:Label ID="Msg" ForeColor="red" runat="server" />
        </p>
      </form>
    </body>
    </html>
    

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Web.Security" %>
    
    <script runat="server">
      void Logon_Click(object sender, EventArgs e)
      {
        if ((UserEmail.Text == "jchen@contoso.com") && 
                (UserPass.Text == "37Yj*99Ps"))
          {
              FormsAuthentication.RedirectFromLoginPage 
                 (UserEmail.Text, Persist.Checked);
          }
          else
          {
              Msg.Text = "Invalid credentials. Please try again.";
          }
      }
    </script>
    <html>
    <head id="Head1" runat="server">
      <title>Forms Authentication - Login</title>
    </head>
    <body>
      <form id="form1" runat="server">
        <h3>
          Logon Page</h3>
        <table>
          <tr>
            <td>
              E-mail address:</td>
            <td>
              <asp:TextBox ID="UserEmail" runat="server" /></td>
            <td>
              <asp:RequiredFieldValidator ID="RequiredFieldValidator1" 
                ControlToValidate="UserEmail"
                Display="Dynamic" 
                ErrorMessage="Cannot be empty." 
                runat="server" />
            </td>
          </tr>
          <tr>
            <td>
              Password:</td>
            <td>
              <asp:TextBox ID="UserPass" TextMode="Password" 
                 runat="server" />
            </td>
            <td>
              <asp:RequiredFieldValidator ID="RequiredFieldValidator2" 
                ControlToValidate="UserPass"
                ErrorMessage="Cannot be empty." 
                runat="server" />
            </td>
          </tr>
          <tr>
            <td>
              Remember me?</td>
            <td>
              <asp:CheckBox ID="Persist" runat="server" /></td>
          </tr>
        </table>
        <asp:Button ID="Submit1" OnClick="Logon_Click" Text="Log On" 
           runat="server" />
        <p>
          <asp:Label ID="Msg" ForeColor="red" runat="server" />
        </p>
      </form>
    </body>
    </html>
    

    La pagina contiene i controlli server ASP.NET che consentono di raccogliere informazioni sugli utenti e una casella di controllo che gli utenti possono selezionare per rendere persistenti le proprie credenziali di accesso. Il gestore dell'evento Click del pulsante Log On contiene codice che consente di confrontare l'indirizzo di posta elettronica e la password dell'utente con i valori hardcoded. La password è una password complessa contenente vari caratteri non alfabetici e con una lunghezza pari almeno a otto caratteri. Se le credenziali dell'utente sono corrette, il codice chiamerà il metodo RedirectFromLoginPage della classe FormsAuthentication, passando il nome dell'utente e un valore booleano (derivato dalla casella di controllo) per indicare se si desidera rendere persistente un ticket di autenticazione come cookie. Il metodo reindirizza l'utente alla pagina richiesta originariamente. Se le credenziali dell'utente non corrispondono, verrà visualizzato un messaggio di errore. Tenere presente che la pagina importa lo spazio dei nomi System.Web.Security, che contiene la classe FormsAuthentication.

Per l'esempio, verrà creata una pagina ASP.NET nella cartella della radice dell'applicazione. Poiché nel file di configurazione è stato specificato che a tutti gli utenti non autenticati deve essere negato l'accesso alle risorse ASP.NET dell'applicazione, inclusi i file aspx, ma non i file statici come i file HTML o i file multimediali come i file di immagini, i file musicali e così via, quando un utente richiede la pagina, l'autenticazione basata su form verificherà le credenziali dell'utente e lo reindirizzerà alla pagina di accesso, se necessario. La pagina creata consentirà inoltre agli utenti di disconnettersi, cancellando in questo modo il ticket di autenticazione persistente (cookie).

Per creare una pagina predefinita

  1. Creare una pagina ASP.NET denominata Default.aspx nella cartella della radice dell'applicazione.

  2. Copiare il codice seguente e inserirvi elementi di codice:

    <%@ Page Language="VB" %>
    <html>
    <head>
      <title>Forms Authentication - Default Page</title>
    </head>
    
    <script runat="server">
      Sub Page_Load(ByVal Src As Object, ByVal e As EventArgs)
        Welcome.Text = "Hello, " & Context.User.Identity.Name
      End Sub
    
      Sub Signout_Click(ByVal sender As Object, ByVal e As EventArgs)
        FormsAuthentication.SignOut()
        Response.Redirect("Logon.aspx")
      End Sub
    </script>
    
    <body>
      <h3>
        Using Forms Authentication</h3>
      <asp:Label ID="Welcome" runat="server" />
      <form id="Form1" runat="server">
        <asp:Button ID="Submit1" OnClick="Signout_Click" 
           Text="Sign Out" runat="server" /><p>
      </form>
    </body>
    </html>
    

    <%@ Page Language="C#" %>
    <html>
    <head>
      <title>Forms Authentication - Default Page</title>
    </head>
    
    <script runat="server">
      void Page_Load(object sender, EventArgs e)
      {
        Welcome.Text = "Hello, " + Context.User.Identity.Name;
      }
    
      void Signout_Click(object sender, EventArgs e)
      {
        FormsAuthentication.SignOut();
        Response.Redirect("Logon.aspx");
      }
    </script>
    
    <body>
      <h3>
        Using Forms Authentication</h3>
      <asp:Label ID="Welcome" runat="server" />
      <form id="Form1" runat="server">
        <asp:Button ID="Submit1" OnClick="Signout_Click" 
           Text="Sign Out" runat="server" /><p>
      </form>
    </body>
    </html>
    

    Nella pagina viene visualizzata l'identità autenticata dell'utente, impostata mediante la classe FormsAuthentication e disponibile in una pagina ASP.NET come proprietà Context.User.Identity.Name. Il gestore dell'evento Click del pulsante Sign Out contiene codice che consente di chiamare il metodo SignOut per cancellare l'identità dell'utente e rimuovere il ticket di autenticazione (cookie). L'utente viene quindi reindirizzato alla pagina di accesso.

Aggiunte alla community

AGGIUNGI
Mostra: