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

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

En esta página

Resumen

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

Requisitos

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

Crear una aplicación ASP.NET utilizando Visual Basic .NET

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

Configurar la seguridad en el archivo Web.config

En esta sección se muestra cómo agregar y modificar las secciones de configuración <authentication> y <authorization> para configurar la aplicación ASP.NET de manera que utilice autenticación basada en formularios.
  1. En el Explorador de soluciones, abra el archivo Web.config.
  2. Cambie el modo de autenticación a Forms.
  3. Inserte la etiqueta <Forms> y rellene los atributos adecuados. (Para obtener más información acerca de estos atributos, consulte la documentación de MSDN o la documentación del Tutorial rápido que se muestra en la sección REFERENCIAS.) Copie el código siguiente y 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 al usuario anónimo en la sección <authorization> de la manera siguiente:
    <authorization>
    	<deny users ="?" />
    	<allow users = "*" />
    </authorization>
    					

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

En esta sección se muestra cómo crear una base de datos de ejemplo para almacenar el nombre de usuario, la contraseña y la función para los usuarios. Necesitará la columna de función si desea almacenar las funciones de usuario en la base de datos e implementar la seguridad basada en funciones.
  1. En el menú Inicio de Windows, haga clic en Ejecutar y escriba notepad para abrir el Bloc de notas.
  2. Resalte el código de secuencia de comandos SQL siguiente, haga clic con el botón secundario del mouse (ratón) en el mismo 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 con Microsoft SQL Server, abra Users.sql en el Analizador de consultas. En la lista de bases de datos, haga clic en pubs y ejecute la secuencia de comandos. Esto creará una tabla de usuarios de ejemplo y llenará 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 formulario Web Forms al proyecto denominado 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 del 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 formulario Web Forms se utiliza para presentar un formulario de inicio de sesión a los usuarios, de manera que puedan proporcionar su nombre de usuario y su 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 que se coloca en la página de código subyacente (Logon.aspx.vb).
  1. Abra el archivo Logon.aspx.vb.
  2. Importe los espacios de nombres necesarios al archivo de código subyacente:
    Imports System.Data.SqlClient
    Imports System.Web.Security
    					
  3. Cree una función ValidateUser para validar las credenciales de usuario examinando la base de datos. (Asegúrese de que cambia la cadena de conexión para señalar a su base de datos.)
    Private Function ValidateUser(ByVal userName As String, ByVal passWord As String) As Boolean
            Dim conn As SqlConnection
            Dim cmd As SqlCommand
            Dim lookupPassword As String
    
            lookupPassword = Nothing
    
            ' Check for an invalid userName.
            ' userName  must not be set to nothing and must be between one and 15 characters.
            If ((userName Is Nothing)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")
                Return False
            End If
            If ((userName.Length = 0) Or (userName.Length > 15)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")
                Return False
            End If
    
            ' Check for invalid passWord.
            ' passWord must not be set to nothing and must be between one and 25 characters.
            If (passWord Is Nothing) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")
                Return False
            End If
            If ((passWord.Length = 0) Or (passWord.Length > 25)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")
                Return False
            End If
    
            Try
                ' Consult with your SQL Server administrator for an appropriate connection
                ' string to use to connect to your local SQL Server.
                conn = New SqlConnection("server=localhost;Integrated Security=SSPI;database=pubs")
                conn.Open()
    
                ' Create SqlCommand to select pwd field from the users table given a supplied userName.
                cmd = New SqlCommand("Select pwd from users where uname=@userName", conn)
                cmd.Parameters.Add("@userName", SqlDbType.VarChar, 25)
                cmd.Parameters("@userName").Value = userName
    
    
                ' Execute command and fetch pwd field into lookupPassword string.
                lookupPassword = cmd.ExecuteScalar()
    
                ' Cleanup command and connection objects.
                cmd.Dispose()
                conn.Dispose()
            Catch ex As Exception
                ' Add error handling here for debugging.
                ' This error message should not be sent back to the caller.
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Exception " & ex.Message)
            End Try
    
            ' If no password found, return false.
            If (lookupPassword Is Nothing) Then
                ' You could write failed login attempts here to the event log for additional security.
                Return False
            End If
    
            ' Compare lookupPassword and input passWord by using a case-sensitive comparison.
            Return (String.Compare(lookupPassword, passWord, False) = 0)
    
    End Function
    					
  4. Puede utilizar uno de dos métodos posibles para generar la cookie de autenticación de formularios y redirigir al usuario a una página apropiada en el evento cmdLogin_ServerClick. Se proporciona el código de ejemplo para ambos escenarios. Utilice cualquiera de ellos según sea necesario.
    • 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 en el evento cmdLogin_ServerClick:
      Private Sub cmdLogin_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) _
         Handles cmdLogin.ServerClick
         If ValidateUser(txtUserName.Value,txtUserPass.value) Then
            FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, _
            chkPersistCookie.Checked)
         Else
            Response.Redirect("logon.aspx", True)
         End If
      End Sub
      						
    • Genere el vale de autenticación, cífrelo, cree una cookie, agréguela a la respuesta y redirija al usuario. Esto le ofrece más control sobre cómo crear la cookie. También puede incluir datos personalizados junto con FormsAuthenticationTicket en este caso.
      Private Sub cmdLogin_ServerClick(ByVal sender As Object, _
         ByVal e As System.EventArgs) Handles cmdLogin.ServerClick
         If Validateuser(txtUserName.Value,txtUserPass.Value) Then
            Dim tkt As FormsAuthenticationTicket
            Dim cookiestr As String
            Dim ck As HttpCookie
      
            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) then ck.Expires=tkt.Expiration 
            ck.Path = FormsAuthentication.FormsCookiePath() 
            Response.Cookies.Add(ck)
      
            Dim strRedirect As String
            strRedirect = Request("ReturnURL")
            If strRedirect <> "" Then
               Response.Redirect(strRedirect, True)
            Else
               strRedirect = "default.aspx"
               Response.Redirect(strRedirect, True)
            End If
         Else
            Response.Redirect("logon.aspx", True)
         End If
      End Sub
      						

Crear una página Default.aspx

En esta sección se crea una página de prueba a la que se redirige a los usuarios después de autenticarse. Si los usuarios van 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 como Default.aspx y ábrala en el editor.
  2. Cambie a la vista HTML y copie el código siguiente 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 al archivo de código subyacente:
    Imports System.Web.Security
    					
  5. Abra la página de código subyacente (Default.aspx.vb) y copie el código siguiente al controlador de eventos cmdSignOut_ServerClick:
    Private Sub cmdSignOut_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles cmdSignOut.ServerClick
       FormsAuthentication.SignOut()
       Response.Redirect("logon.aspx", True)
    End Sub
    					
  6. Guarde y compile el proyecto. Ahora puede utilizar la aplicación.

Solución de problemas

  • Quizás desee almacenar las contraseñas de manera segura en una base de datos. Puede emplear la función de utilidad de la 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ás desee almacenar la información de conexión de SQL en el archivo de configuración (Web.config) de forma que pueda modificarla fácilmente si es necesario.
  • Quizás desee considerar la posibilidad de agregar código para impedir el inicio de sesión de los piratas informáticos que intentan utilizar diferentes combinaciones de contraseñas. Por ejemplo, puede incluir lógica que sólo acepte dos o tres intentos de inicio de sesión. Si el usuario no puede iniciar sesión en un cierto número de intentos, quizás desee establecer un indicador en la base de datos para no permitir que ese usuario inicie sesión hasta que no vuelva a habilitar su cuenta visitando una página diferente o llamando a su línea de soporte técnico. Además, debe agregar un control de errores apropiado donde sea necesario.
  • Puesto que el usuario se identifica según la cookie de autenticación, quizás desee utilizar Capa de sockets seguros (SSL) en esta aplicación para que nadie pueda recuperar la cookie de autenticación ni cualquier otra información valiosa que se transmita.
  • La autenticación basada en formularios requiere que su 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 vuelve a generar la cookie de autenticación. Puede elegir un valor que proporcione mejor rendimiento y seguridad.
  • Algunos servidores proxy y memorias caché intermedios de Internet pueden almacenar en caché respuestas del servidor Web que contienen encabezados Set-Cookie, que se devuelven a un usuario diferente. Puesto que la autenticación basada en formularios utiliza una cookie para autenticar a los usuarios, esto puede hacer que los usuarios suplanten accidentalmente (o intencionadamente) a otro usuario recibiendo una cookie de un servidor proxy o una memoria caché intermedios que no estaba dirigida originalmente a ellos.

Referencias

Para obtener información acerca de cómo implementar la autenticación simple basada en formularios utilizando la sección <credentials> para almacenar usuarios y contraseñas, vea el artículo siguiente en los ejemplos del Tutorial rápido de ASP.NET:
Forms-Based Authentication (Autenticación basada en formularios)
http://samples.gotdotnet.com/quickstart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx
Para obtener información acerca de cómo implementar la autenticación basada en formularios utilizando un archivo del Lenguaje de marcado extensible (XML) para almacenar usuarios y contraseñas, vea el tema siguiente en la documentación del Kit de desarrollo de software (SDK) de .NET Framework:
Forms Authentication Using An XML Users File (Autenticación de formularios utilizando un archivo XML Users)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp
Para obtener más información acerca de la seguridad de las aplicaciones Web ASP.NET, vea el artículo siguiente en la documentación del SDK de .NET Framework:
ASP.NET Web Application Security (Seguridad de aplicaciones Web ASP.NET)
http://msdn2.microsoft.com/en-us/library/330a99hc(vs.71).aspx
Para obtener más información acerca del espacio de nombres System.Web.Security, vea el artículo siguiente en la documentación del SDK de .NET Framework:
http://msdn.microsoft.com/library/dotnet/cpref/frlrfsystemwebsecurity.htm
Para obtener más información acerca de la configuración de ASP.NET, vea los siguientes artículos del SDK de .NET Framework:
ASP.NET Configuration (Configuración de ASP.NET)
http://msdn2.microsoft.com/en-us/library/aa719558(VS.71).aspx

ASP.NET Configuration Sections (Secciones de configuración de ASP.NET)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpgrfaspnetconfigurationsections.asp
Para obtener información acerca de las directrices de seguridad de ASP.NET, consulte la siguiente nota de producto de MSDN:
Authentication in ASP.NET: .NET Security Guidance (Autenticación en ASP.NET: consejos sobre seguridad de .NET)
http://msdn2.microsoft.com/en-us/library/ms978378.aspx
Para obtener más información general acerca de ASP.NET, visite el siguiente grupo de noticias de MSDN:
microsoft.public.dotnet.framework.adonet
Para obtener más información, consulte los libros siguientes:
Esposito, Dino. Building Web Solutions with ASP.NET and ADO.NET. Microsoft Press, 2001.

Howard, Michael y David LeBlanc. Writing Secure Code. Microsoft Press, 2001.

Propiedades

Id. de artículo: 308157 - Última revisión: lunes, 29 de octubre de 2007 - Versión: 8.8
La información de este artículo se refiere a:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palabras clave: 
kbproductlink kbconfig kbhowtomaster kbsecurity kbweb KB308157

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