Share via


Archivo Login.aspx

Logon.aspx es el archivo al que se redirige la solicitud si ASP.NET no encuentra la cookie con la solicitud. Esta dirección URL ya se ha configurado en el archivo de configuración. En el siguiente ejemplo, se presenta al usuario cliente un formulario que contiene dos cuadros de texto (E-mail Name y Password) y un botón Submit. El usuario escribe el nombre de correo electrónico y la contraseña, y hace clic en el botón Submit. A continuación, el código busca esta combinación de nombre y contraseña en un archivo XML ubicado en este directorio. Si el archivo incluye esta combinación, el usuario se conecta a Default.aspx. En caso contrario, se llama al archivo AddUser.aspx.

Para crear un archivo que permita conectar a un usuario

  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 sección de secuencia de comandos para el código.

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

    private void Logon_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;
          }
      

      Configure una cadena denominada cmd que se inicialice en UserEmail="MiNombre", donde MiNombre es el nombre de usuario del correo electrónico. El control validador de expresión regular asociado al control de entrada ya ha determinado que el nombre de correo electrónico tiene un formato correcto y no contiene caracteres no válidos.

          String cmd = "UserEmail='" + UserEmail.Value + "'";
      
    2. Cree una instancia nueva de la clase DataSet.

          DataSet ds = new DataSet();
      
    3. Lea en el archivo XML que contiene las combinaciones de nombre de usuario y contraseña autenticadas. Los datos recuperados se encuentran en ds, la clase DataSet creada en el paso anterior.

      PRECAUCIÓN   Para simplificar el ejemplo, el código que aparece a continuación no se ajusta a los procedimientos de diseño recomendados para la seguridad. No llama a ningún indicador de uso compartido o bloqueo de archivos. Además, en un sitio Web comercial, se recomienda utilizar una base de datos relacional u otro mecanismo seguro y escalable para almacenar la lista de usuarios autenticados.

          FileStream fs = new FileStream(Server.MapPath("Users.xml"), 
                                        FileMode.Open,FileAccess.Read);
          StreamReader reader = new StreamReader(fs);
          ds.ReadXml(reader);
          fs.Close();
      
    4. Cree una instancia nueva de un objeto DataTable denominado users que se inicialice en ds.

          DataTable users = ds.Tables[0];
      
    5. Busque las coincidencias existentes entre el nombre de inicio de sesión y la lista de nombres en Users.aspx. Para cada coincidencia encontrada, registre el nombre en un objeto DataRow denominado matches.

      Nota   Para simplificar el ejemplo, se espera que cada nombre sea único; por tanto, sólo se utiliza la primera coincidencia encontrada.

          DataRow[] matches = users.Select(cmd);
      
    6. Compruebe todas las coincidencias encontradas en el paso anterior para ver si hay alguna contraseña que coincida con un nombre.

          if( matches != null && matches.Length > 0 ) 
          {
      
    7. Si se encuentra una coincidencia con un nombre de usuario, genere un valor hash para la contraseña del usuario y compárelo con el valor hash almacenado en el archivo 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. Muestre un formulario para recopilar la información de inicio de sesión.

    <form runat=server>
        <span style="background:#80FF80">
        <h3><font face="Verdana">Logon Page</font></h3></span>
        <table>
            <tr>
    
    1. Genere un cuadro de texto User E-mail Name. Agregue un control RequiredFieldValidator y un control RegularExpressionValidator que comprueben si hay entradas de nombres de correo electrónico válidos. RegularExpressionValidator comprueba que la dirección de correo electrónico tiene un formato válido (por ejemplo, nombre@contoso.com) y no contiene caracteres no válidos que podrían poner en entredicho la seguridad.

                  <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. Genere un cuadro de texto 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. Cree una casilla de verificación Persistent Cookie. Si se activa la casilla Persistent Cookie, la cookie será válida entre las sesiones del explorador. En caso contrario, la cookie se destruirá cuando se cierre el explorador. Para algunos sitios puede ser conveniente emitir cookies permanentes pero es un procedimiento menos seguro que emitir cookies de poca duración.

                  <td>Persistent Cookies:</td>
                  <td><ASP:CheckBox id=Persist runat="server"
                       autopostback="true"/>
                  </td>
                  <td></td>
              </tr>
          </table>
      
      
    4. Cree un botón Submit que provoque el evento Logon_Click cuando se produce la devolución.

          <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>
      

Vea también

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