Share via


Archivo Adduser.aspx

Cuando la página de inicio de sesión no encuentra el nombre de correo electrónico en el archivo Users.xml, redirige la solicitud a la página Add User. Cuando el usuario hace clic en el botón Add User, el nombre de usuario y la contraseña se agregan al archivo.

Para implementar la página Add User

  1. Importe los espacios de nombres necesarios.

    <%@ 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. Genere una etiqueta de sección de secuencia de comandos.

    <script runat=server>
    
  3. Implemente una función Page_Load.

    private void Page_Load(Object Src, EventArgs e) 
    {
    
    1. Obtenga las cadenas UserEmail y UserPassword de la solicitud.

          String email = Request.QueryString["UserEmail"];
      
    2. Si el valor no es nulo, especifique el nombre de correo electrónico del usuario en el cuadro de texto UserEmail. El control RegularExpressionValidator ya ha validado UserEmail en la página Logon.aspx.

          if( null != email )
          UserEmail.Value = email;
          }
      
  4. Implemente la función AddUser_Click. Observe que se produce una condición de anticipación inherente si dos clientes llaman casi simultáneamente a AddUser.aspx. Si lo hacen de manera sincronizada, es posible que un cliente escriba una copia de Users.xml con sus nuevos datos y sobrescriba el archivo que acaba de escribir el primer cliente. Si la condición de anticipación constituye un problema, deberá establecer algún tipo de mecanismo de sincronización en la aplicación para garantizar que los clientes no ejecuten simultáneamente AddUser.aspx. Dicho mecanismo puede ser tan sencillo como una variable de aplicación que actúa como una exclusión mutua que cada cliente exige de manera exclusiva justo antes de ejecutar código en el evento AddUser_Click.

    private void AddUser_Click(Object sender, EventArgs e) 
    {
    
    1. Si la página no es válida, indíqueselo al usuario.

          if( !Page.IsValid ) 
          {
              Msg.Text = "Some required fields are invalid.";
              return;    
          }
      
    2. Cree una instancia de DataSet que se denomina ds.

          DataSet ds = new DataSet();
      
    3. Inicialice una cadena denominada userFile con la ruta de acceso al archivo Users.xml.

          String userFile = "../users.xml";
      
    4. Lea en el archivo XML la instancia ds de DataSet creada en el paso b.

          FileStream fs = new FileStream(Server.MapPath(userFile), 
              FileMode.Open,FileAccess.Read);
          StreamReader reader = new StreamReader(fs);
          ds.ReadXml(reader);
          fs.Close();
      
    5. Genere un valor hash para la contraseña y agregue el nuevo nombre así como la contraseña con valor hash a la instancia ds de DataSet.

      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. Escriba el nuevo objeto DataSet con el nombre y la contraseña nuevos en el archivo 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. Redirija la solicitud de vuelta al recurso solicitado originalmente (Default.aspx) e inicie de nuevo el proceso de inicio de sesión. Salvo el nombre del botón, el siguiente formulario es idéntico al formulario descrito en el archivo 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>

Vea también

Seguridad ASP.NET de aplicaciones Web | Autenticación de formularios mediante un archivo de usuarios XML