Gestión de una aplicación completa con .NET Servicio de Informática TEMA 8: IDENTIFICACIÓN Y CONTROL DE USUARIOS 1. AUTENTICACIÓN Y AUTORIZACIÓN DEFINICIONES Autenticación: Acepta credenciales proporcionadas por el usuario. Valida esas credenciales. Autorización: Dada una credencial autenticada, determinar los derechos de acceso a los recursos. Los accesos pueden ser dados o denegados a un usuario en particular o basado en un rol AUTENTICACIÓN • Basado en Windows: o La solicitud de la página pasa por IIS. Si IIS valida exitosamente la credencial, entonces se devuelve la página solicitada. • Basado en Formularios (el que se desarrolla en este tema) o Las solicitudes no autenticadas son redireccionadas a un formulario de login. Después de validar la credencial se envía al cliente una cookie de autenticación • Basado en Microsoft Passport o Servicio de autenticación centralizado. Passport es un Web Service. Para activar un servicio de autenticación de ASP .NET, debes configurar el elemento <authentication> en el archivo de configuración de la aplicación. Este elemento puede tomar cualquiera de los valores listados en la siguiente tabla: Valor Descripción None Ningún servicio de autenticación ASP .NET esta activo. Observad que el servicio de autenticación de IIS puede estar todavía presente. Windows Los servicios de autenticación de ASP .NET adjuntan un WindowsPrincipal (System.Security.Principal.WindowsPrincipal) a la petición actual para permitir la autorización contra grupos o usuarios de NT Forms Los servicios de autenticación de ASP.NET gestionan las cookies y redireccionan a los usuarios no autenticados a una página de registro. Esto a menudo se usa conjuntamente con la opción del IIS de permitir acceso anónimo a la aplicación. Passport Los servicios de autenticación de ASP.NET proporcionan un formato Tema 4 / Página 1 Gestión de una aplicación completa con .NET Servicio de Informática conveniente alrededor del servicio ofrecido por el Passport SDK, el cual debe estar instalado en la máquina. Por ejemplo, el siguiente archivo de configuración permite autenticación basada en formularios (cookies) para una aplicación: <configuration> <system.web> <authentication mode="Forms"/> </system.web> </configuration> Método Basado en Windows Basado en Formularios Microsoft Passport Ventajas Usa la infraestructura de Windows Control de acceso a información crítica Desventajas No apropiado para la mayoría de las aplicac. Web Bueno para aplicac. Web Soporta a todos los tipos de clientes Está basada en cookies Un solo login para muchos sitios Web No se necesita guardar info del usuario en BD Está basado en cookies Tiene un costo económico Tema 4 / Página 2 Gestión de una aplicación completa con .NET Servicio de Informática 2. AUTENTICACIÓN BASADA EN FORMULARIOS (teoria) La autenticación basada en formularios es un servicio de autenticación de ASP .NET que permite a las aplicaciones proporcionar su propia Interfaz de Usuario para el inicio de sesión y hacer su propia verificación de credenciales. ASP .NET autentica usuarios, usuarios, redirecciona usarios no autenticados a la página de inicio de sesión y ejecuta toda la administración de cookies necesaria. Este tipo de autenticación es una técnica muy popular usada en muchos sitios web. Para que una aplicación utilice autenticación basada en formularios, tendremos que fijar el valor de <authentication> a Forms, Forms y denegar el acceso a usuarios anónimos. El siguiente ejemplo muestra cómo puede realizarse esto en el fichero Web.config para la aplicación deseada: <configuration> <system.web> <authentication mode="Forms"/> mode="Forms" <authorization> <deny deny users="?" /> </authorization> </system.web> </configuration> Los administradores usaremos la autenticación basada en formularios para configurar el nombre de la cookie a utilizar, el tipo de protección, la URL de la página de login, tiempo de vida de la cookie y la ruta a utilizar para la cookie emitida. La siguiente nte tabla muestra los atributos válidos para los elementos <Forms>, el cual es un subelemento de <authentication>, mostrado en el siguiente ejemplo: ejemplo Tema 4 / Página 3 Gestión de una aplicación completa con .NET Servicio de Informática <authentication mode="Forms"> <forms name=".ASPXCOOKIEDEMO" loginUrl="login.aspx" defaultUrl="default.aspx" protection="All" timeout="30" path="/" requireSSL="false" slidingExpiration="true" enableCrossAppRedirects="false" cookieless="UseDeviceProfile" domain=""> </forms> </authentication> (La tabla completa está en http://msdn.microsoft.com/es-es/library/1d3t3c61.aspx) Atributo Descripción Cookieless Los formularios de autenticación de ASP.NET 2.0 pueden almacenar los tickets de autenticación de los formularios con o sin la representación en la URL de una cookie. El valor por defecto de UseDeviceProfile indica que ASP .NET determina dónde almacenar el ticket basado en el perfil del navegador pre-calculado. cookieless= "[UseUri | UseCookies | La opción de AutoDetect hace que ASP.NET determine dinámicamente AutoDetect | si el navegador soporta cookies o no. UseDevicePr ofile]" UseUri y UseCookies fuerza el uso de tickets sin y con cookies, respectivamente. UseUri modifica la url a algo como: http://localhost:60194/tema8/%28F%283CIW7kVWVrwCYQBuAG8Abg BpAG0AbwAAANsh2gLch8sBAdtVvDPgh8sBAAAvAAAA0%29%29/De fault.aspx defaultUrl URL por defecto a la que la petición es redireccionada después de un ingreso válido. Este valor se usa si no existe una URL de redirección en la Autenticación por Formularios. domain Domain en la HttpCookie que contiene los tickets del formulario de autenticación. Configurar este atributo explícitamente permite a las aplicaciones compartir la misma cookie siempre que las aplicaciones compartan una porción común de un espacio de nombres de DNS (ej: appA.ua.es y appB.ua.es podrían compartir una cookie si el domain attribute tiene el valor "ua.es"). enableCross AppRedirect s Los formularios de autenticación de ASP.NET 2.0 permiten enviar los tickets de autenticación del formulario entre aplicaciones tanto en una variable cadena-petición como en una variable POST de formulario. Tema 4 / Página 4 Gestión de una aplicación completa con .NET Servicio de Informática Poner este atributo a true permite al FormsAuthenticationModule extraer el ticket tanto de una cadena-petición como de una variable POST de formulario. loginUrl Especifica la URL a la cual la petición es redireccionada para usuarios no autenticados. name Nombre de la cookie HTTP a usar para propósitos de autenticación. path Ruta que usa la cookie emitida. El valor por defecto es “/” Protection Método usado para proteger los datos de las cookies. Por defecto es All que usa validación + encriptación. protection= "[All|None| Encryption|V alidation]" Si el valor está a true, la Autenticación por Formularios configura el bit de seguridad en la cookie del formulario de autenticación. Los navegadores “conformistas” sólo devolverán la cookie a ASP .NET a través de una conexion SSL. Si el valor está a true, los Formularios de Autenticación actualizarán slidingExpirat periódicamente el tiempo de vida para los tickets del formuario de ion autenticación. Esto ocurre independientemente de si el ticket está o no contenido en una cookie, o en los formatos sin cookie en la URL. Cantidad de tiempo en minutos enteros, después del cual la cookie timeout expira. El valor por defecto es 30. requireSSL Tema 4 / Página 5 Gestión de una aplicación completa con .NET Servicio de Informática 3. AUTENTICACIÓN BASADA EN FORMULARIOS (práctica) Escribimos esto en nuestro web.config: <configuration> <system.web> ... <authentication mode="Forms" > <forms name = "ejemplo" loginUrl ="login.aspx" defaultUrl ="default.aspx"></forms> </authentication> <authorization> <deny users="?" /> </authorization> ... </configuration> </system.web> Ahora debemos montar dos páginas aspx: Login y default.aspx. Login.aspx debería tener un formulario. Pero por sencillez vamos a poner un botón que al hacer click haga: protected void Boton_Click(object sender, EventArgs e) { FormsAuthentication.RedirectFromLoginPage("anonimo", true); } Donde “anónimo” es un string nombre del usuario. True es la contestación a si queremos crear una cookie persistente, es decir, si queremos que el sistema nos recuerde. El nombre de la cookie será “ejemplo” (definido en web.config). Ahora creamos “default.aspx” con un botón de salir y cerrar la sesión. protected void Boton_Click(object sender, EventArgs e) { FormsAuthentication.SignOut(); Response.Redirect("Login.aspx"); } Ahora si queremos ir a default.aspx, antes tendremos que pasar por login.aspx. Al logarnos (simplemente haciendo click) generamos esta cookie: Tema 4 / Página 6 Gestión de una aplicación completa con .NET Servicio de Informática (Hoy es 18 de nov y son las 21:07) Para poder estudiar todos los métodos y propiedades de FormsAuthentication debemos ir a http://msdn.microsoft.com/eses/library/system.web.security.formsauthentication_members%28v=VS.80%29.aspx Otro sistema que se puede usar es en nuestro web.config: <configuration> <system.web> ... <authentication mode="Forms" > <forms name = "ejemplo" loginUrl ="login.aspx" defaultUrl ="default.aspx"></forms> </authentication> <authorization> <deny users="?" /> </authorization> ... </configuration> </system.web> Ahora cualquiera se puede pasear por nuestro sitio web. Para evitarlo contamos un login.aspx con un botón (a reemplazar por un formulario) protected void Boton_Click(object sender, EventArgs e) { FormsAuthentication.SetAuthCookie("anonimo", true); Response.Redirect("Default.aspx"); } Y en las páginas donde sólo tengan acceso los autentificados (en este caso defautl.aspx), debemos poner: protected void Pre_Init(object sender, EventArgs e) Tema 4 / Página 7 Gestión de una aplicación completa con .NET Servicio de Informática { if (!User.Identity.IsAuthenticated) Response.Redirect("Login.aspx"); } 4. UTILIZANDO LOS CONTROLES DE INICIO DE SESIÓN Y LA CLASE LDAP. Login: El control Login es el control de inicio de sesión más simple y soporta las situaciones más comunes; identificarse utilizando un nombre de usuario y una contraseña. El control incluye los cuadros de texto usuario y contraseña y una casilla de verificación para los usuarios que deseen comprometer la seguridad de la contraseña almacenándola en la máquina. El control expone propiedades a través de las cuales puede cambiar el texto y la apariencia del control. También puede agregar vínculos para administrar el registro o la recuperación de contraseña. El control Login interactúa de forma predeterminada con el componente miembro ASP.NET para la autenticación. Usando el login con la clase LDap: 1.- Creamos el control login. 2.- Añadimos la clase claseLDap como referencia. 3.- En eventos controlamos el authenticate Tema 4 / Página 8 Gestión de una aplicación completa con .NET Servicio de Informática Y el código de authenticate sería algo como: protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) { ClaseLDAP ldap = new ClaseLDAP(); if (ldap.Validar(Login1.UserName, Login1.Password)) FormsAuthentication.RedirectFromLoginPage(Login1.UserName, Login1.RememberMeSet); } LoginView: Es útil para administrar el contenido que muestra para los usuarios autenticados y para los no autenticados. LoginView muestra el estado del inicio de sesión a través de mostrar las plantillas AnonymousTemplate y LoggedlnTemplate. El control muestra una plantilla diferente dependiendo del estado del usuario. 1.- Arrastro en modo diseño el LoginView. 2.- Arrastro en la caja señalada con un círculo un control Login. 3.- En la parte marcada señalo la vista LoggedInTemplate. Colocamos un botón con el texto “Log Out”. Tema 4 / Página 9 Gestión de una aplicación completa con .NET Servicio de Informática Ahora el código podría ser algo como: protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) { Login miLogin = (Login)sender; ClaseLDAP ldap = new ClaseLDAP(); if (ldap.Validar(miLogin.UserName, miLogin.Password)) FormsAuthentication.RedirectFromLoginPage(miLogin.UserName, miLogin.RememberMeSet); } LoginStatus: Muestra si el usuario ha iniciado sesión o no. A los usuarios que no han iniciado sesión se les pide que lo hagan, y a los usuarios que han iniciado sesión se les pide que cierren la sesión. Recuerdo que por código usamos User.Identity.IsAuthenticated para saber si el usuario está identificado. Y para cerrar la sesión usamos FormsAuthentication.SignOut() LoginName: El control LoginName muestra el nombre de inicio de sesión del usuario. Por código podemos usar User.Identity.Name Otros controles que no vamos a usar por culpa del LDAP: PasswordRecovery: Soporta la función de los sitios Web que consiste en enviar contraseñas a los clientes cuando las olvidan. Recopila el nombre de la cuenta del usuario y después continúa con una pregunta de seguridad (siempre y cuando esta función este configurada correctamente). El control envía la contraseña por correo electrónico o crea una nueva. ChangePassword: Proporciona a los usuarios la opción de cambiar sus contraseñas. Un usuario autenticado puede cambiar su contraseña proporcionando la contraseña original y la nueva (junto con confirmación de la contraseña nueva). CreateUserWizard: Recopila información de los usuarios para que pueda configurar una cuenta miembro de ASP.NET para cada usuario. El control recopila un nombre de usuario, una Tema 4 / Página 10 Gestión de una aplicación completa con .NET Servicio de Informática contraseña, dirección de correo electrónico, una pregunta de seguridad y una respuesta pregunta de seguridad. 5. EN INTERNET. Manual sobre autenticación y autorización http://www.es-asp.net/tutoriales-asp-net/tutorial-61-118/autenticacion-yautorizacion.aspx http://www.es-asp.net/tutoriales-asp-net/tutorial-61-119/utilizando-los-controles-deinicio-de-sesion.aspx Diferencia entre Request.IsAuthenticated y User.Identity.IsAuthenticated. http://es.efreedom.com/Question/1-1379566/Cual-es-la-diferencia-entre-HttpContextCurrent-Request-IsAuthenticated-y-HttpContext-Current-User-Identity-IsAuthenticated Sobre Microsoft Passport https://accountservices.passport.net/ppnetworkhome.srf?vv=900&mkt=ES-ES&lc=3082 Para poder estudiar todos los métodos y propiedades de FormsAuthentication: http://msdn.microsoft.com/eses/library/system.web.security.formsauthentication_members%28v=VS.80%29.aspx Atributos válidos para los elementos <Forms> http://msdn.microsoft.com/es-es/library/1d3t3c61.aspx Tema 4 / Página 11 Gestión de una aplicación completa con .NET Servicio de Informática 6. EJERCICIO. LOGIN.ASPX Se pide un control de LoginView que: 1.- cuando sea anónimo nos dé un control Login. Este ocupará el 100% del espacio de la plantilla. Tiene un cellspacing de 10 de cellpading de 10. El color del fondo de la cabecera es #30424A La identificación la hará con la clase LDAP. En el cuadro de avisos aparecerá lo que nos hemos rellenado de forma incorrecta. Si al identificarte no lo consigues aparecerá el siguiente mensaje: “Su usuario / contraseña no son correctos. Por favor contacte con "Servicio de Informática" En cuanto se identifique irá a la página del ejercicio anterior. El tema será de color rojo. En la parte señalada vendrá el nombre del usuario que se ha identificado. Al pulsar en salir, primero se abandona la sesión y luego nos enviará a la página de login.aspx. Tema 4 / Página 12 Gestión de una aplicación completa con .NET Servicio de Informática 2.- Cuando se esté identificado el LoginView nos mostrará: Finalizar sesión además de finalizarla recargará la página de login.aspx. DEFAULT.ASPX ¿Y si intentamos ir a la página principal del curso sin identificarte? Observa cómo ha desaparecido la columna de editar y el botón de nuevo. Salir sigue llevándonos a www.ua.es. Aparece el texto “Usuario desconocido”. Consideraremos el idioma. Tema 4 / Página 13