Cómo implementar la autenticación basada en formularios en su aplicación ASP.NET mediante C#.NET

Seleccione idioma Seleccione idioma
Id. de artículo: 301240 - Ver los productos a los que se aplica este artículo
Este artículo se publicó anteriormente con el número E301240
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo se muestra cómo implementar la autenticación basada en formularios mediante una base de datos para almacenar los usuarios.

Requisitos

En la lista siguiente se describe el hardware, el software, la infraestructura de red y los Service Packs recomendados que necesitará:
  • Microsoft Visual Studio .NET
  • Servicios de Microsoft Internet Information Server (IIS) 5.0 o posterior
  • Microsoft SQL Server

Crear una aplicación ASP.NET utilizando C# .NET

  1. Abra Visual Studio .NET.
  2. Cree una nueva aplicación web ASP.NET y especifique el nombre y ubicación.

Configurar la seguridad del archivo Web.config

En esta sección se describe cómo agregar y modificar las secciones de configuración de <autenticación> y <autorización> para configurar la aplicación ASP.NET para que utilice la autenticación basada en formularios.
  1. En el Explorador de soluciones, abra el archivo Web.config.
  2. Cambie el modo de autenticación a Formularios.
  3. Inserte la etiqueta <Forms> y rellene los atributos apropiados. (Para obtener más información sobre estos atributos, consulte la documentación de MSDN o la documentación de QuickStart que se muestra en la sección REFERENCIAS.) Copie el código siguiente y, a continuación, haga clic en Pegar como HTML en el menú Edición para pegar el código en la sección <authentication> del archivo:
    <authentication mode="Forms">
       <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" 
       protection="All" path="/" timeout="30" />
    </authentication> 
    					
  4. Deniegue el acceso a los usuarios anónimos en la sección <authorization> de la forma siguiente:
    <authorization>
       <deny users ="?" />
       <allow users = "*" />
    </authorization>
    					

Crear una tabla de base de datos de ejemplo para almacenar los detalles de los usuarios

En esta sección se explica cómo crear una base de datos de ejemplo para almacenar el nombre de usuario, la contraseña y el rol de los usuarios. Necesita la columna de rol si desea almacenar roles de usuario en la base de datos e implementar la seguridad basada en roles.
  1. En el menú Inicio, haga clic en Ejecutar y, a continuación, escriba notepad para abrir el Bloc de notas.
  2. Resalte el siguiente código de script de SQL, haga clic en él con el botón secundario del mouse y, a continuación, haga clic en Copiar. En el Bloc de notas, haga clic en Pegar en el menú Edición para pegar el código siguiente:
    if exists (select * from sysobjects where id = 
    object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Users]
    GO
    CREATE TABLE [dbo].[Users] (
       [uname] [varchar] (15) NOT NULL ,
       [Pwd] [varchar] (25) NOT NULL ,
       [userRole] [varchar] (25) NOT NULL ,
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[Users] WITH NOCHECK ADD 
       CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED 
       (
          [uname]
       )  ON [PRIMARY] 
    GO
    
    INSERT INTO Users values('user1','user1','Manager')
    INSERT INTO Users values('user2','user2','Admin')
    INSERT INTO Users values('user3','user3','User')
    GO
    					
  3. Guarde el archivo como Users.sql.
  4. En el equipo de Microsoft SQL Server, abra Users.sql en el Analizador de consultas. En la lista de bases de datos, haga clic en pubs y ejecute el script. Se crea una tabla de usuarios de ejemplo y rellena la tabla de la base de datos Pubs que se utilizará con esta aplicación de ejemplo.

Crear una página Logon.aspx

  1. Agregue un nuevo Web Form al proyecto llamado Logon.aspx.
  2. Abra la página Logon.aspx en el editor y cambie a la vista HTML.
  3. Copie el código siguiente y utilice la opción Pegar como HTML en el menú Edición para insertar el código entre las etiquetas <form>:
    <h3>
       <font face="Verdana">Logon Page</font>
    </h3>
    <table>
       <tr>
          <td>Email:</td>
          <td><input id="txtUserName" type="text" runat="server"></td>
          <td><ASP:RequiredFieldValidator ControlToValidate="txtUserName"
               Display="Static" ErrorMessage="*" runat="server" 
               ID="vUserName" /></td>
       </tr>
       <tr>
          <td>Password:</td>
          <td><input id="txtUserPass" type="password" runat="server"></td>
          <td><ASP:RequiredFieldValidator ControlToValidate="txtUserPass"
              Display="Static" ErrorMessage="*" runat="server" 
              ID="vUserPass" />
          </td>
       </tr>
       <tr>
          <td>Persistent Cookie:</td>
          <td><ASP:CheckBox id="chkPersistCookie" runat="server" autopostback="false" /></td>
          <td></td>
       </tr>
    </table>
    <input type="submit" Value="Logon" runat="server" ID="cmdLogin"><p></p>
    <asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server" />
    						
    Este Web Form se utiliza para presentar un formulario de inicio de sesión a los usuarios para que puedan dar su nombre y contraseña para iniciar sesión en la aplicación.
  4. Cambie a la vista Diseño y guarde la página.

Codificar el controlador de eventos para que valide las credenciales de usuario

En esta sección se presenta el código ubicado en la página de código subyacente (Logon.aspx.cs).
  1. Haga doble clic en Inicio de sesión para abrir el archivo Logon.aspx.cs.
  2. Importe los espacios de nombres necesarios en el archivo de código subyacente:
    using System.Data.SqlClient;
    using System.Web.Security;
    					
  3. Cree una función ValidateUser para validar las credenciales de usuario con la Ayuda de la base de datos. (Asegúrese de que cambia la cadena Connection para que apunte a la base de datos).
    private bool ValidateUser( string userName, string passWord )
    {
    	SqlConnection conn;
    	SqlCommand cmd;
    	string lookupPassword = null;
    
    	// Buscar nombre de usuario no válido.
    	// el nombre de usuario no debe ser un valor nulo y debe tener entre 1 y 15 caracteres.
    	if ( (  null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ) )
    	{
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );
    		return false;
    	}
    
    	// Buscar contraseña no válida.
    	// La contraseña no debe ser un valor nulo y debe tener entre 1 y 25 caracteres.
    	if ( (  null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ) )
    	{
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );
    		return false;
    	}
    
    	try
    	{
    		// Consultar con el administrador de SQL Server para obtener una conexión apropiada
    		// cadena que se utiliza para conectarse a su SQL Server local.
    		conn = new SqlConnection( "server=localhost;Integrated Security=SSPI;database=pubs" );
    		conn.Open();
    
    		// Crear SqlCommand para seleccionar un campo de contraseña desde la tabla de usuarios dado el nombre de usuario proporcionado.
    		cmd = new SqlCommand( "Select pwd from users where uname=@userName", conn );
    		cmd.Parameters.Add( "@userName", SqlDbType.VarChar, 25 );
    		cmd.Parameters["@userName"].Value = userName;
    
    		// Ejecutar el comando y capturar el campo de contraseña en la cadena lookupPassword.
    		lookupPassword = (string) cmd.ExecuteScalar();
    
    		// Comando de limpieza y objetos de conexión.
    		cmd.Dispose();
    		conn.Dispose();
    	}
    	catch ( Exception ex )
    	{
    		// Agregar aquí un control de errores para la depuración.
    		// Este mensaje de error no debería reenviarse al que realiza la llamada.
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message );
    	}
    
    	// Si no se encuentra la contraseña, devuelve false.
    	if ( null == lookupPassword ) 
    	{
    		// Para más seguridad, puede escribir aquí los intentos de inicio de sesión con error para el registro de eventos.
    		return false;
    	}
    
    	// Comparar lookupPassword e introduzca passWord, usando una comparación que distinga mayúsculas y minúsculas.
    	return ( 0 == string.Compare( lookupPassword, passWord, false ) );
    
    }
    					
  4. Puede usar cualquiera de los dos métodos para generar la cookie de autenticación de formularios y redirigir al usuario a la página apropiada del evento cmdLogin_ServerClick. Se proporciona código de ejemplo para ambas situaciones. Utilice cualquiera de ellos de acuerdo a sus requisitos.
    • Llame al método RedirectFromLoginPage para generar automáticamente la cookie de autenticación de formularios y redirigir al usuario a una página apropiada del evento cmdLogin_ServerClick:
      private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
      if (ValidateUser(txtUserName.Value,txtUserPass.Value) )
      	FormsAuthentication.RedirectFromLoginPage(txtUserName.Value,
      		chkPersistCookie.Checked);
      	else
      		Response.Redirect("logon.aspx", true);
      }
      						
    • Genere el vale de autenticación, cífrelo, cree una cookie, agréguela a la respuesta y redirija al usuario. Esto le proporcionará un mayor control sobre cómo ha creado la cookie. También puede incluir datos personalizados junto con FormsAuthenticationTicket en este caso.
      private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
         if (ValidateUser(txtUserName.Value,txtUserPass.Value) )
         {
            FormsAuthenticationTicket tkt;
            string cookiestr;
            HttpCookie ck;
            tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now, 
      DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data");
            cookiestr = FormsAuthentication.Encrypt(tkt);
            ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr);
            if (chkPersistCookie.Checked)
            ck.Expires=tkt.Expiration;	
      		    ck.Path = FormsAuthentication.FormsCookiePath; 
            Response.Cookies.Add(ck);
      
            string strRedirect;
            strRedirect = Request["ReturnUrl"];
            if (strRedirect==null)
                  strRedirect = "default.aspx";
               Response.Redirect(strRedirect, true);
         }
         else
            Response.Redirect("logon.aspx", true);
      }
      						
  5. Asegúrese de que el código siguiente se agrega al método InitializeComponent del código que genera el Diseñador de Web Forms:
    this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
    					

Crear una página Default.aspx

En esta sección se crea una página de prueba a la que se redirigen los usuarios una vez se hayan autenticado. Si los usuarios se desplazan a esta página sin iniciar sesión primero en la aplicación, se les redirige a la página de inicio de sesión.
  1. Cambie el nombre de la página WebForm1.aspx existente a Default.aspx y ábrala en el editor.
  2. Cambie a la vista HTML y copie el código siguiente que se encuentra entre las etiquetas <form>:
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    						
    Este botón se utiliza para cerrar la sesión de autenticación de formularios.
  3. Cambie a la vista Diseño y guarde la página.
  4. Importe los espacios de nombres necesarios en el archivo de código subyacente:
    using System.Web.Security;
    					
  5. Haga doble clic en SignOut para abrir la página de código subyacente (Default.aspx.cs) y copie el código siguiente en el controlador de eventos cmdSignOut_ServerClick:
    private void cmdSignOut_ServerClick(object sender, System.EventArgs e)
    {
       FormsAuthentication.SignOut();
       Response.Redirect("logon.aspx", true);
    }
    					
  6. Asegúrese de que el código siguiente se agrega al método InitializeComponent del código que genera el Diseñador de Web Forms:
    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
    					
  7. Guarde y compile el proyecto. Ahora ya puede utilizar la aplicación.

Notas adicionales

  • Es posible que desee almacenar las contraseñas de forma segura en una base de datos. Puede utilizar la función de utilidad de clase FormsAuthentication denominada HashPasswordForStoringInConfigFile para cifrar las contraseñas antes de almacenarlas en la base de datos o en el archivo de configuración.
  • Quizá desee almacenar la información de conexión SQL en el archivo de configuración (Web.config) para que pueda modificarlo fácilmente si lo necesita.
  • Puede pensar en agregar código para impedir que los hackers que intentan usar distintas combinaciones de contraseñas inicien sesión. Por ejemplo, puede incluir lógica que acepte solo dos o tres intentos de inicio de sesión. Si el usuario no puede iniciar sesión en un determinado número de intentos, puede establecer un indicador en la base de datos para impedir que ese usuario inicie sesión hasta que se vuelva a habilitar su cuenta visitando otra página o llamando a la línea de soporte. Además, debe agregar un control de errores adecuado siempre que sea necesario.
  • Como el usuario se identifica en función de la cookie de autenticación, quizá desee usar el Nivel de sockets seguro (SSL) en esta aplicación para que nadie pueda engañar a la cookie de autenticación y cualquier otra información valiosa que se transmita.
  • La autenticación basada en formularios requiere que el cliente acepte o habilite las cookies en su explorador.
  • El parámetro timeout de la sección de configuración <authentication> controla el intervalo en el que se regenera la cookie de autenticación. Puede elegir un valor que proporcione un mejor rendimiento y seguridad.
  • Ciertos proxies y cachés intermediarios en Internet pueden almacenar en caché respuestas del servidor web que contengan encabezados Set-Cookie, que se devuelven a un usuario diferente. Como la autenticación basada en formularios utiliza una cookie para autenticar usuarios, esto puede causar que los usuarios suplanten de manera accidental (o intencionada) a otro usuario al recibir una cookie desde de una caché o proxy intermediario que no estaba destinada a ellos.

Referencias

Para obtener más información sobre cómo implementar la autenticación basada en formularios sencillas que utiliza la sección <credentials> para almacenar usuarios y contraseñas, consulte el ejemplo siguiente GotDotNet ASP.NET QuickStart:
Forms-Based Authentication
http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx
Para obtener más información sobre cómo implementar autenticación basada en formularios que utilice un archivo XML para almacenar usuarios y contraseñas, consulte el tema siguiente en la documentación del Kit de desarrollo de software (SDK) de .NET Framework:
Forms Authentication Using An XML Users File
http://msdn.microsoft.com/es-es/library/1b1y85bh(vs.71).aspx
Para obtener más información acerca de la seguridad de la aplicación web ASP.NET, consulte la siguiente documentación de la Guía del desarrollador de Microsoft .NET Framework:
ASP.NET Web Application Security
http://msdn.microsoft.com/es-es/library/330a99hc(vs.71).aspx
Para obtener más información acerca del espacio de nombres System.Web.Security, consulte la siguiente documentación de referencia de Microsoft .NET Framework:
System.Web.Security Namespace
http://msdn.microsoft.com/es-es/library/system.web.security(vs.71).aspx
Para obtener más información sobre la configuración de ASP.NET, consulte los siguientes artículos de la Guía del desarrollador de Microsoft .NET Framework:
ASP.NET Configuration
http://msdn.microsoft.com/es-es/library/aa719558(VS.71).aspx

ASP.NET Configuration Sections
http://msdn.microsoft.com/es-es/library/w7w4sb0w(vs.71).aspx
Para obtener más información sobre las directrices de seguridad de ASP.NET, consulte el siguiente documento técnico de MSDN:
Authentication in ASP.NET: .NET Security Guidance
http://msdn.microsoft.com/en-us/library/Ee817643(pandp.10).aspx
para obtener información general acerca de ASP.NET, consulte el siguiente grupo de noticias de MSDN:
microsoft.public.dotnet.framework.aspnet
Nota: es un artículo de "PUBLICACIÓN RÁPIDA" creado directamente por la organización de soporte técnico de Microsoft. La información aquí contenida se proporciona como está, como respuesta a problemas que han surgido. Como consecuencia de la rapidez con la que lo hemos puesto disponible, los materiales podrían incluir errores tipográficos y pueden ser revisados en cualquier momento sin previo aviso. Vea las Condiciones de uso para otras consideraciones

Propiedades

Id. de artículo: 301240 - Última revisión: viernes, 29 de junio de 2012 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 64-bit Edition
Palabras clave: 
kbconfig kbhowtomaster kbsecurity kbweb KB301240

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com