Condividi tramite


File Login.aspx

Logon.aspx è il file cui è reindirizzata la richiesta se ASP.NET non consente di individuare un cookie con la richiesta. Questo URL è stato impostato nel file di configurazione. Nell'esempio riportato di seguito, l'utente client visualizza un form con due caselle di testo con le etichette E-mail Name e Password e un pulsante Submit. L'utente immette il nome di posta elettronica e la password, quindi sceglie il pulsante Submit. Il codice consente di ricercare la combinazione di nome e password in un file XML all'interno della directory. Se questa combinazione è presente nel file, l'utente viene connesso a Default.aspx. In caso contrario, viene chiamato il file AddUser.aspx.

Per creare un file per l'accesso dell'utente

  1. Importare gli spazi dei nomi necessari.

    <%@ Page LANGUAGE="C#" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.SqlClient" %>
    <%@ Import Namespace="System.Web.Security " %>
    <%@ Import Namespace="System.IO" %>
    
    <html>
    <head>
    <title>Forms Authentication</title>
    
  2. Creare una sezione di script per il codice.

    <script runat=server>
    
  3. Implementare una funzione Logon_Click.

    private void Logon_Click(Object sender, EventArgs e) 
    {
    
    1. Se la pagina non è valida, visualizzare un apposito messaggio all'utente.

          if( !Page.IsValid ) 
          {
              Msg.Text = "Some required fields are invalid.";
              return;
          }
      

      Impostare una stringa di nome cmd inizializzata su UserEmail="MyName", dove MyName indica il nome di posta elettronica dell'utente. Il controllo di convalida dell'espressione regolare associato al controllo di input ha già determinato che il nome di posta elettronica è formattato in modo corretto e non contiene caratteri non validi.

          String cmd = "UserEmail='" + UserEmail.Value + "'";
      
    2. Creare una nuova istanza della classe DataSet.

          DataSet ds = new DataSet();
      
    3. Leggere il file XML contenente le combinazioni autenticate di nomi utente e password. I dati recuperati risiedono in ds, ovvero l'oggetto DataSet creato nel passaggio precedente.

      Attenzione   Per semplificare e rendere più chiaro l'esempio, il codice riportato di seguito non segue le pratiche di progettazione migliori per la protezione. Non viene richiamato alcun flag di blocco o di condivisione dei file. In un sito Web commerciale è inoltre necessario utilizzare un database relazionale o un altro meccanismo protetto e scalabile per archiviare l'elenco degli utenti autenticati.

          FileStream fs = new FileStream(Server.MapPath("Users.xml"), 
                                        FileMode.Open,FileAccess.Read);
          StreamReader reader = new StreamReader(fs);
          ds.ReadXml(reader);
          fs.Close();
      
    4. Creare una nuova istanza di un oggetto DataTable di nome users inizializzato su ds.

          DataTable users = ds.Tables[0];
      
    5. Verificare la presenza di corrispondenze tra il nome di accesso e l'elenco dei nomi in Users.aspx. Per ciascuna corrispondenza, registrare il nome in un oggetto DataRow di nome matches.

      Nota   Per esigenze di semplicità, si presuppone che ogni nome utilizzato nell'esempio sia univoco. Viene quindi utilizzata solo la prima delle corrispondenze trovate.

          DataRow[] matches = users.Select(cmd);
      
    6. Verificare che per ogni corrispondenza di nome trovata nel precedente passaggio sia presente una corrispondente password.

          if( matches != null && matches.Length > 0 ) 
          {
      
    7. Se viene trovata una corrispondenza di nome utente, eseguire l'hash della password utente e confrontarla con l'hash memorizzato nel file Users.xml.

              DataRow row = matches[0];
              string hashedpwd = 
                  FormsAuthentication.HashPasswordForStoringInConfigFile
                      (UserPass.Value, "SHA1");
              String pass = (String)row["UserPassword"];
              if( 0 != String.Compare(pass, hashedpwd, false) ) 
                  // Tell the user if no password match is found. It is good  
                  // security practice give no hints about what parts of the
                  // logon credentials are invalid.
                  Msg.Text = "Invalid Credentials: Please try again.";
              else 
                  // If a password match is found, redirect the request
                  // to the originally requested resource (Default.aspx).
                  FormsAuthentication.RedirectFromLoginPage
                      (UserEmail.Value, Persist.Checked);
          }
          else 
          {
      // If no name matches were found, redirect the request to the
      // AddUser page using a Response.Redirect command.
              Response.Redirect("AddUser/AddUser.aspx");
          }
      }
      </script>
      <body>
      
  4. Visualizzare un form per la raccolta delle informazioni di accesso.

    <form runat=server>
        <span style="background:#80FF80">
        <h3><font face="Verdana">Logon Page</font></h3></span>
        <table>
            <tr>
    
    1. Creare una casella di testo User E-mail Name. Aggiungere un controllo RequiredFieldValidator e un controllo RegularExpressionValidator per verificare la presenza di un nome di posta elettronica valido. RegularExpressionValidator verifica che il formato dell'indirizzo di posta elettronica sia valido (ad esempio, name@contoso.com) e non contenga caratteri non validi che possano compromettere la protezione.

                  <td>e-mail:</td>
                  <td><input id="UserEmail" type="text" runat=server/></td>
                  <td><ASP:RequiredFieldValidator 
                       ControlToValidate="UserEmail" 
                       Display="Static"
                       ErrorMessage="*"
                       runat="server"/>
                  </td>         
                  <td><asp:RegularExpressionValidator id="RegexValidator" 
                       ControlToValidate="UserEmail"
                       ValidationExpression="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"
                       EnableClientScript="false"
                       Display="Static"
                       ErrorMessage="Invalid format for e-mail address."
                       runat="server"/>
                  </td>
              </tr>
              <tr>    
      
    2. Creare una casella di testo Password.

                  <td>Password:</td>
                  <td><input id="UserPass" type=password runat=server/></td>
                  <td><ASP:RequiredFieldValidator 
                       ControlToValidate="UserPass" 
                       Display="Static"
                       ErrorMessage="*"
                       runat="server"/>
                  </td>
              </tr>
              <tr>
      
    3. Creare una casella di controllo Persistent Cookie. Se la casella Persistent Cookie è selezionata, il cookie è valido tra una sessione del browser e un'altra. In caso contrario, il cookie è distrutto quando il browser viene chiuso. L'emissione di cookie persistenti può essere preferibile per alcuni siti per motivi di comodità, ma risulta meno sicura dell'emissione di cookie di breve durata.

                  <td>Persistent Cookies:</td>
                  <td><ASP:CheckBox id=Persist runat="server"
                       autopostback="true"/>
                  </td>
                  <td></td>
              </tr>
          </table>
      
      
    4. Creare un pulsante Submit per generare l'evento Logon_Click al momento del postback.

          <input type="submit" OnServerClick="Logon_Click" Value="Logon" 
                  runat="server"/><p>
          <asp:Label id="Msg" ForeColor="red" Font-Name="Verdana" 
                     Font-Size="10" runat="server"/>
      </form>
      </body>
      </html>
      

Vedere anche

Protezione delle applicazioni Web ASP.NET | Autenticazione basata su form mediante un file XML Users