File AddUser.aspx

Quando nella pagina di accesso non è possibile identificare il nome di posta elettronica nel file Users.xml, la richiesta viene reindirizzata alla pagina Add User. Quando l'utente fa clic sul pulsante Add User, il nome utente e la password sono aggiunti al file.

Per implementare la pagina Add User

  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 un tag di sezione di script.

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

    private void Page_Load(Object Src, EventArgs e) 
    {
    
    1. Ottenere le stringhe UserEmail e UserPassword dalla richiesta.

          String email = Request.QueryString["UserEmail"];
      
    2. Se il valore del nome di posta elettronica dell'utente non è null, inserire il nome di posta elettronica dell'utente nella casella di testo UserEmail. UserEmail è stata già convalidata dal controllo RegularExpressionValidator sulla pagina Logon.aspx.

          if( null != email )
          UserEmail.Value = email;
          }
      
  4. Implementare la funzione AddUser_Click. Se due client chiamano quasi contemporaneamente AddUser.aspx si verifica una condizione di competizione intrinseca. Se le due operazioni sono quasi contemporanee, è possibile che un client scriva una copia di Users.xml con i nuovi dati e sostituisca il file del primo client. Nel caso di una condizione di competizione è necessario creare nell'applicazione un meccanismo di sincronizzazione per fare in modo che i client non eseguano contemporaneamente AddUser.aspx. Questo meccanismo può essere una variabile di applicazione che funga da mutex richiesto da ciascun client in modo esclusivo prima di eseguire il codice nell'evento AddUser_Click.

    private void AddUser_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;    
          }
      
    2. Creare un'istanza dell'oggetto DataSet di nome ds.

          DataSet ds = new DataSet();
      
    3. Inizializzare una stringa denominata userFile con il percorso del file Users.xml.

          String userFile = "../users.xml";
      
    4. Leggere il file XML nel DataSet ds creato nel passaggio b.

          FileStream fs = new FileStream(Server.MapPath(userFile), 
              FileMode.Open,FileAccess.Read);
          StreamReader reader = new StreamReader(fs);
          ds.ReadXml(reader);
          fs.Close();
      
    5. Eseguire l'hash della password e aggiungere il nuovo nome e la password sottoposta ad hash nel DataSet ds.

      string hashedpwd =    
          FormsAuthentication.HashPasswordForStoringInConfigFile
              (UserPass.Value, "SHA1");
          DataRow newUser = ds.Tables[0].NewRow();
          newUser["UserEmail"] = UserEmail.Value;
          newUser["UserPassword"] = hashedpwd;
          ds.Tables[0].Rows.Add(newUser);
          ds.AcceptChanges();
      
    6. Scrivere il nuovo DataSet contenente il nuovo nome e la nuova password nel file XML.

          fs = new FileStream(Server.MapPath(userFile), FileMode.Create, 
              FileAccess.Write|FileAccess.Read);
          StreamWriter writer = new StreamWriter(fs);
          ds.WriteXml(writer);
          writer.Close();
          fs.Close();
      
    7. Reindirizzare la richiesta alla risorsa richiesta in origine (Default.aspx) e avviare nuovamente il processo di accesso. Ad eccezione del nome del pulsante, il form riportato di seguito è identico a quello descritto per il file Logon.aspx.

          Response.Redirect("../Default.aspx");
      }
      </script>
      <body>
      <form runat=server>
          <div style="background:#ccccff">
              <h3><font face="Verdana">Add New User</font></h3>
          </div>
      
      <table>
        <tr>
            <td>Name:</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>    
            <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>
            <td>Persistent Forms:</td>
            <td><ASP:CheckBox id=Persist runat="server"
                              autopostback="true"/>
            </td>
        </tr>
    </table>

   < input type="submit" OnServerClick="AddUser_Click" Value="Add User" 
           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