Estás trabajando sin conexión, espera a que vuelva la conexión a Internet

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

Este artículo se publicó anteriormente con el número E308157
Para obtener una versión de Microsoft Visual C# .NET de este artículo, consulte 301240.

Este artículo se refiere a los siguientes espacios de nombres de la Biblioteca de clases de Microsoft .NET Framework:
  • System.Data.SqlClient
  • System.Web.Security

EN ESTA TAREA

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.

back to the top

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
back to the top

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.
back to the top

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>					
back to the top

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]GOCREATE TABLE [dbo].[Users] (	[uname] [varchar] (15) NOT NULL ,	[Pwd] [varchar] (25) NOT NULL ,	[userRole] [varchar] (25) NOT NULL ,) ON [PRIMARY]GOALTER TABLE [dbo].[Users] WITH NOCHECK ADD 	CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED 	(		[uname]	)  ON [PRIMARY] GOINSERT 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.
back to the top

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.
back to the top

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.SqlClientImports 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 IfEnd 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 IfEnd Sub						
back to the top

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.
back to the top

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.
back to the top
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: 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: 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: 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.
back to the top
autenticación de formularios
Propiedades

Id. de artículo: 308157 - Última revisión: 10/29/2007 14:53:46 - Revisión: 8.8

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

  • kbproductlink kbconfig kbhowtomaster kbsecurity kbweb KB308157
Comentarios
0].appendChild(m);