UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN CICLO: 01/2015 Nombre de la Práctica: Lugar de Ejecución: Tiempo Estimado: MATERIA: DOCENTES: GUIA DE LABORATORIO #10 Seguridad en aplicaciones de ASP.NET Centro de cómputo 2 horas con 30 minutos Lenguaje de Programación II Karens Medrano / Hugo Dimas II. INTRODUCCIÓN TEÓRICA Seguridad en ASP.NET La seguridad es un aspecto muy importante de las aplicaciones web ASP.NET. Los temas de esta sección proporcionan información adicional sobre los problemas de seguridad que se producen en las aplicaciones web. Se incluye información sobre cómo mitigar las amenazas de seguridad habituales, cómo proteger los recursos en una aplicación web, y cómo autenticar y autorizar a los usuarios individuales. ASP.NET, conjuntamente con Microsoft Internet Information Services (IIS), puede autenticar las credenciales del usuario como nombres y contraseñas mediante los métodos de autenticación siguientes: Windows: básica, implícita, y Autenticación de Windows integrada (NTLM o Kerberos). Autenticación mediante formularios, con la que crea una página de inicio de sesión y se administra la autenticación en la aplicación. Autenticación mediante certificados de cliente ASP.NET controla el acceso a la información de los sitios comparando las credenciales autenticadas, o representaciones de las mismas, con los permisos del sistema de archivos de Microsoft Windows NT o con un archivo XML que contiene la lista de usuarios autorizados, funciones autorizadas (grupos) o verbos HTTP autorizados. ASP.NET funciona junto con Microsoft .NET Framework y Servicios de Microsoft Internet Information Server (IIS) para ayudar a proporcionar aplicaciones Web seguras. Para ayudar a proteger la seguridad de una aplicación ASP.NET, se deben llevar a cabo las dos funciones principales que se describen en la siguiente tabla. Función de seguridad Descripción Autenticación Ayuda a comprobar que el usuario es precisamente quien dice ser. La aplicación obtiene las credenciales (diversas formas de identificación, como nombre y contraseña) de un usuario, y las valida consultando a una autoridad determinada. Si las credenciales son válidas, se considera a la entidad que ha enviado las credenciales como una entidad autenticada. Autorización Limita los derechos de acceso mediante la concesión o negación de permisos específicos a una identidad autenticada. Además, Internet Information Services (IIS) puede conceder o negar el acceso en función de la dirección IP o del nombre de host del usuario. Cualquier autorización de acceso posterior se realiza mediante la autorización de la dirección URL del permiso de acceso al sistema de archivos NTFS. Lenguaje de Programación II 1/8 Guía #9: Master Pages Es importante entender cómo interactúan todos los diversos subsistemas de seguridad. Puesto que ASP.NET se basa en Microsoft .NET Framework, el desarrollador de aplicaciones ASP.NET también tiene acceso a todas las características de seguridad integradas de .NET Framework, como la seguridad de acceso a código y la seguridad de acceso basada en funciones. III. MATERIALES Y EQUIPO Para la realización de la guía de práctica se requerirá lo siguiente: No. 1 2 3 Requerimiento Guía de práctica #10: Seguridad en Aplicaciones en ASP.NET Computadora con Visual Studio 2012 instalado y una instancia de SQL Server con Management Studio Express Memoria USB o disco flexible Cantidad 1 1 1 IV. PROCEDIMIENTO Ejercicio #1 – Creación de fuentes de datos Cree una nueva base de datos en SQL Server con el nombre “BDSeguridad” y proceda a crear la siguiente estructura de tablas. Ejercicio #2 – Aplicación segura de ASP.NET 1. Abra y edite el archivo web.config que se encuentra en la raíz de la aplicación. En este archivo procederemos a establecer la forma de autenticación de los usuarios y posteriormente autorizamos los recursos a los usuarios registrados. Para ello, definimos las dos estructuras “authentication” y “authorization”. Edite el archivo de tal manera que quede de la siguiente manera. Lenguaje de Programación II 2 Guía #9: Master Pages 2. Ahora, proceda a agregar las carpetas contenidas en los recursos de esta guia las cuales corresponden a imágenes, archivos css y archivos javascript. 3. Agregue un Master Page con el nombre “MasterPage.master” y agregue el siguiente marcado a la página. <%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %> <!DOCTYPE HTML> <html> <head> <title>Guia 10 - Seguridad de Usuarios ASP.NET</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <!--[if lte IE 8]><script src="css/ie/html5shiv.js"></script><![endif]--> <script src="js/jquery.min.js"></script> <script src="js/jquery.scrolly.min.js"></script> <script src="js/jquery.dropotron.min.js"></script> <script src="js/jquery.scrollex.min.js"></script> <script src="js/skel.min.js"></script> <script src="js/skel-layers.min.js"></script> <script src="js/init.js"></script> <noscript> <link rel="stylesheet" href="css/skel.css" /> <link rel="stylesheet" href="css/style.css" /> <link rel="stylesheet" href="css/style-xlarge.css" /> </noscript> <!--[if lte IE 9]><link rel="stylesheet" href="css/ie/v9.css" /><![endif]--> <!--[if lte IE 8]><link rel="stylesheet" href="css/ie/v8.css" /><![endif]--> </head> <body> Lenguaje de Programación II 3 Guía #9: Master Pages <form id="form1" runat="server"> <!-- Header --> <header id="header" > <h1 id="logo"><a href="/">Página Principal</a></h1> <nav id="nav"> <ul> <li> <asp:Label ID="lblActiveUser" runat="server" Text=""></asp:Label> &nbsp; <asp:Button class="button special small" ID="btnCerrarSesion" runat="server" Text="Cerrar Sesión" /> </li> </ul> </nav> </header> <style> .pager table{ width: auto !important; } </style> <!-- Main --> <div id="main" class="wrapper style1"> <div class="container"> <!-- Formulario de Ingreso de Información --> <section> <div class="row uniform 50%"> <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> </div> </section> </div> </div> <!-- Footer --> <footer id="footer"> <ul class="icons"> <li><a href="#" class="icon class="label">Twitter</span></a></li> <li><a href="#" class="icon class="label">Facebook</span></a></li> <li><a href="#" class="icon class="label">Email</span></a></li> </ul> <ul class="copyright"> <li>&copy; 2015. All rights </ul> </footer> </form> </body> </html> Lenguaje de Programación II 4 alt fa-twitter"><span alt fa-facebook"><span alt fa-envelope"><span reserved.</li> Guía #9: Master Pages 4. Ahora, todas las páginas heredaran de la master page creada, por lo que es en este lugar que debemos de realizar la comprobación del usuario. Esto es así ya que siempre será esta la primera en ejecutarse. Para ello, proceda a programar el evento Load de la página maestra con el siguiente código. 5. Dentro de la master page, se ha definido igualmente un botón de cerrar sesión. Para ello, proceda a dar doble clic desde la vista diseño y agregue el siguiente código. 6. Ahora, procederemos a crear nuestra página de inicio de sesión que hemos definido en nuestro archivo Web.Config. Para eso, agregue una nueva página “Login1.aspx” y que tenga como página maestra la página creada en el punto anterior. Ahora, agregue el siguiente marcado, en el cual hacemos uso de un control login, el cual configuramos detalladamente. <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <style> table{ width: 40% !important; margin: 0 auto; } .row>* { float: none !important; } </style> <asp:Login ID="LoginUser" runat="server" DestinationPageUrl="~/Default.aspx" DisplayRememberMe="true" > <LayoutTemplate> <div class="row uniform 20%"> <div class="10u 12u$(xsmall)"> <h3>Inicio de Sesión </h3> <div class="12u$(xsmall)"> <asp:Label runat="server" Text="Nombre de Usuario"></asp:Label> <asp:TextBox ID="UserName" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ForeColor="Red" Display="Dynamic" ControlToValidate="UserName" ID="RequiredFieldValidator1" runat="server" ErrorMessage="Campo obligatorio"></asp:RequiredFieldValidator> Lenguaje de Programación II 5 Guía #9: Master Pages </div> <div class="12u$(xsmall)"> <asp:Label runat="server" Text="Contraseña"></asp:Label> <asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox> <asp:RequiredFieldValidator ForeColor="Red" Display="Dynamic" ControlToValidate="Password" ID="RequiredFieldValidator2" runat="server" ErrorMessage="Campo obligatorio"></asp:RequiredFieldValidator> </div> <div class="12u$(xsmall)"> <br /> <asp:Checkbox id="RememberMe" runat="server" Text="Recordarme"></asp:Checkbox> <br /> <asp:LinkButton ID="submitLoginBtn" CssClass="button special" CommandName="Login" runat="server">Iniciar Sesión</asp:LinkButton> &nbsp; <a href="NuevoUsuario.aspx" class="button special">Registrarme</a> </div> <div class="12$(xsmall)"> <asp:Literal ID="FailureText" runat="server" EnableViewState="False"></asp:Literal> </div> </div> </div> </LayoutTemplate> </asp:Login> </asp:Content> 7. Ahora, proceda a codificar el evento “Page_Load” de la página Login1.aspx en su archivo de código subyacente con el siguiente código. 8. Ahora, procederemos a agregar un método el cual nos será útil para verificar si el usuario existe o no. Al final, nos interesa que el método nos retorne un valor booleano para realizar la comparación. Proceda a digitar el siguiente código. Recuerde modificar el código de tal manera que coincida con la cadena de conexión propia de su computadora y de su base de datos. private bool ValidateUser(string userName, string passWord) { SqlConnection conn; SqlCommand cmd; string lookupPassword = null; // Buscar nombre de usuario no válido. Lenguaje de Programación II 6 Guía #9: Master Pages // 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("[Proceso:ValidarUsuario] Validacion de nombre de usuario fallida."); 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("[Proceso:ValidarUsuario] Validacion de contrasenia fallida"); 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("Data Source=REEG;Initial Catalog=BDSeguridad;Integrated Security=True"); 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 Clave from Usuarios where Usuario=@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 Lenguaje de Programación II 7 Guía #9: Master Pages distinga mayúsculas y minúsculas. return (0 == string.Compare(lookupPassword, passWord, false)); } 9. Ahora, en la vista diseño, de doble clic al control Login agregado, y proceda a programar el evento asociado a la validación. Agregue el siguiente código. 10. Vamos a agregar una nueva página Default.aspx la cual tendrá como página maestra asociada, la MasterPage.master creada anteriormente. Dentro de la etiqueta de esa página digite el siguiente texto: 11. Agregaremos ahora una nueva página con el nombre “NuevoUsuario.aspx” la cual hemos definido igualmente en nuestro Web.Config. La diferencia radica en que esta página se encontrará disponible para todos los usuarios de la aplicación. El marcado de esa página se muestra a continuación. 12. Proceda a ejecutar la página Default.aspx y luego seleccione un registro para editar, modifique algún dato y posteriormente guarde los cambios. Pruebe además agregando un nuevo producto. V. ANÁLISIS DE RESULTADOS 1. Modifique el archivo NuevoUsuario.aspx de tal manera que permita agregar mas usuarios, con la dificultad que debe hacer uso del control CreateUserWizard de la suit de .NET 1. VI. BIBLIOGRAFÍA Thierry GROUSSARD. (2013). C# 5: Los fundamentos del lenguaje – Desarrollar con Visual Studio 2012 . Barcelona: ENI. Lenguaje de Programación II 8