You are on page 1of 5

AUTENTICACIN EN ASP.

NET Y C#
En este artculo se muestra cmo implementar la autenticacin 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 aplicacin ASP.NET utilizando C# .NET


1. 2. Abra Visual Studio .NET. Cree una nueva aplicacin web ASP.NET y especifique el nombre y ubicacin.

Configurar la seguridad del archivo Web.config


En esta seccin se describe cmo agregar y modificar las secciones de configuracin de <autenticacin> y <autorizacin>para configurar la aplicacin ASP.NET para que utilice la autenticacin basada en formularios. 1. En el Explorador de soluciones, abra el archivo Web.config. 2. Cambie el modo de autenticacin a Formularios. 3. Inserte la etiqueta <Forms> y rellene los atributos apropiados. (Para obtener ms informacin sobre estos atributos, consulte la documentacin de MSDN o la documentacin de QuickStart que se muestra en la seccin REFERENCIAS.) Copie el cdigo siguiente y, a continuacin, haga clic en Pegar como HTML en el men Edicin para pegar el cdigo en la seccin <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 annimos en la seccin <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 seccin se explica cmo crear una base de datos de ejemplo para almacenar el nombre de usuario, la contrasea 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 continuacin, escriba notepad para abrir el Bloc de notas. 2. Resalte el siguiente cdigo de script de SQL, haga clic en l con el botn secundario del mouse y, a continuacin, haga clic en Copiar. En el Bloc de notas, haga clic en Pegar en el men Edicin para pegar el cdigo 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. 4. Guarde el archivo como Users.sql. 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 aplicacin de ejemplo.

Crear una pgina Logon.aspx


1. 2. 3. Agregue un nuevo Web Form al proyecto llamado Logon.aspx. Abra la pgina Logon.aspx en el editor y cambie a la vista HTML. Copie el cdigo siguiente y utilice la opcin Pegar como HTML en el men Edicin para insertar el cdigo 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 sesin a los usuarios para que puedan dar su nombre y contrasea para iniciar sesin en la aplicacin. Cambie a la vista Diseo y guarde la pgina.

4.

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

En esta seccin se presenta el cdigo ubicado en la pgina de cdigo subyacente (Logon.aspx.cs). 1. Haga doble clic en Inicio de sesin para abrir el archivo Logon.aspx.cs. 2. Importe los espacios de nombres necesarios en el archivo de cdigo subyacente: 3. using System.Data.SqlClient; 4. using System.Web.Security; 5. Cree una funcin ValidateUser para validar las credenciales de usuario con la Ayuda de la base de datos. (Asegrese 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 vlido. // 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 contrasea no vlida. // La contrasea 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 conexin 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 contrasea 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 contrasea en la cadena lookupPassword. lookupPassword = (string) cmd.ExecuteScalar(); // Comando de limpieza y objetos de conexin. cmd.Dispose(); conn.Dispose(); } catch ( Exception ex ) { // Agregar aqu un control de errores para la depuracin. // Este mensaje de error no debera reenviarse al que realiza la llamada. System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message ); } // Si no se encuentra la contrasea, devuelve false. if ( null == lookupPassword ) {

// Para ms seguridad, puede escribir aqu los intentos de inicio de sesin con error para el registro de eventos. return false; } // Comparar lookupPassword e introduzca passWord, usando una comparacin que distinga maysculas y minsculas. return ( 0 == string.Compare( lookupPassword, passWord, false ) ); } 6. Puede usar cualquiera de los dos mtodos para generar la cookie de autenticacin de formularios y redirigir al usuario a la pgina apropiada del evento cmdLogin_ServerClick. Se proporciona cdigo de ejemplo para ambas situaciones. Utilice cualquiera de ellos de acuerdo a sus requisitos. o Llame al mtodo RedirectFromLoginPage para generar automticamente la cookie de autenticacin de formularios y redirigir al usuario a una pgina 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 autenticacin, cfrelo, cree una cookie, agrguela a la respuesta y redirija al usuario. Esto le proporcionar un mayor control sobre cmo ha creado la cookie. Tambin 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); } 7. Asegrese de que el cdigo siguiente se agrega al mtodo InitializeComponent del cdigo que genera el Diseador de Web Forms: 8. this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);

Crear una pgina Default.aspx

En esta seccin se crea una pgina de prueba a la que se redirigen los usuarios una vez se hayan autenticado. Si los usuarios se desplazan a esta pgina sin iniciar sesin primero en la aplicacin, se les redirige a la pgina de inicio de sesin. 1. Cambie el nombre de la pgina WebForm1.aspx existente a Default.aspx y brala en el editor. 2. Cambie a la vista HTML y copie el cdigo siguiente que se encuentra entre las etiquetas <form>: <input type="submit" Value="SignOut" runat="server" id="cmdSignOut"> Este botn se utiliza para cerrar la sesin de autenticacin de formularios. 3. Cambie a la vista Diseo y guarde la pgina. 4. Importe los espacios de nombres necesarios en el archivo de cdigo subyacente: using System.Web.Security; 5. Haga doble clic en SignOut para abrir la pgina de cdigo subyacente (Default.aspx.cs) y copie el cdigo 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. Asegrese de que el cdigo siguiente se agrega al mtodo InitializeComponent del cdigo que genera el Diseador de Web Forms: this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick); 7. Guarde y compile el proyecto. Ahora ya puede utilizar la aplicacin.

Notas adicionales

Es posible que desee almacenar las contraseas de forma segura en una base de datos. Puede utilizar la funcin de utilidad de clase FormsAuthentication denominada HashPasswordForStoringInConfigFile para cifrar las contraseas antes de almacenarlas en la base de datos o en el archivo de configuracin. Quiz desee almacenar la informacin de conexin SQL en el archivo de configuracin (Web.config) para que pueda modificarlo fcilmente si lo necesita. Puede pensar en agregar cdigo para impedir que los hackers que intentan usar distintas combinaciones de contraseas inicien sesin. Por ejemplo, puede incluir lgica que acepte solo dos o tres intentos de inicio de sesin. Si el usuario no puede iniciar sesin en un determinado nmero de intentos, puede establecer un indicador en la base de datos para impedir que ese usuario inicie sesin hasta que se vuelva a habilitar su cuenta visitando otra pgina o llamando a la lnea de soporte. Adems, debe agregar un control de errores adecuado siempre que sea necesario. Como el usuario se identifica en funcin de la cookie de autenticacin, quiz desee usar el Nivel de sockets seguro (SSL) en esta aplicacin para que nadie pueda engaar a la cookie de autenticacin y cualquier otra informacin valiosa que se transmita. La autenticacin basada en formularios requiere que el cliente acepte o habilite las cookies en su explorador. El parmetro timeout de la seccin de configuracin <authentication> controla el intervalo en el que se regenera la cookie de autenticacin. Puede elegir un valor que proporcione un mejor rendimiento y seguridad. Ciertos proxies y cachs 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 autenticacin 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.

You might also like