13.07.2015 Views

Creando objetos GenericPrincipal con autenticación ... - Willy .Net

Creando objetos GenericPrincipal con autenticación ... - Willy .Net

Creando objetos GenericPrincipal con autenticación ... - Willy .Net

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Creando</strong> <strong>objetos</strong> <strong>GenericPrincipal</strong> <strong>con</strong>autenticación mediante Formularios en ASP .NETusando <strong>GenericPrincipal</strong>ResumenEn este artículo se muestra cómo crear y tratar <strong>objetos</strong> <strong>GenericPrincipal</strong> y FormsIdentitycuando se utiliza la autenticación mediante Formularios.En las aplicaciones que utilizan la autenticación mediante Formularios a menudo sedeseará utilizar la clase <strong>GenericPrincipal</strong> (en combinación <strong>con</strong> la clase FormsIdentity)para crear un esquema de autorización que no sea específico de Windows y que seaindependiente de un dominio de Windows.Por ejemplo, en una aplicación se puede:utilizar la autenticación mediante Formularios para obtener credenciales de usuario(nombre de usuario y <strong>con</strong>traseña).validar las credenciales suministradas en un almacén de datos; por ejemplo, una basede datos o el servicio de directorio Microsoft® Active Directory®.crear <strong>objetos</strong> <strong>GenericPrincipal</strong> y FormsIdentity basados en valores recuperados enel almacén de datos. Entre ellos se pueden incluir los detalles de pertenencia afunciones de un usuario.utilizar esos <strong>objetos</strong> para tomar decisiones de autorización.En este artículo se describe cómo crear una aplicación Web basada en formularios queautentica a usuarios y crea un vale de autenticación mediante Formularios personalizadoque <strong>con</strong>tiene información de usuario y de funciones. También se muestra cómo asignaresa información a <strong>objetos</strong> <strong>GenericPrincipal</strong> y FormsIdentity, y cómo asociar losnuevos <strong>objetos</strong> al <strong>con</strong>texto de solicitud Web HTTP, <strong>con</strong> lo que se permite su uso para lalógica de autorización en la aplicación.Este artículo se centra en la <strong>con</strong>strucción de los <strong>objetos</strong> <strong>GenericPrincipal</strong> yFormsIdentity junto <strong>con</strong> el procesamiento del vale de autenticación medianteFormularios. Para obtener detalles acerca de cómo autenticar a usuarios <strong>con</strong> ActiveDirectory y SQL Server 2000, <strong>con</strong>sulte los siguientes artículos relacionados en la secciónReferencia de esta guía:"Cómo utilizar la autenticación mediante Formularios <strong>con</strong> Active Directory""Cómo utilizar la autenticación mediante Formularios <strong>con</strong> SQL Server 2000"1


RequisitosA <strong>con</strong>tinuación se describen las recomendaciones de hardware, software, infraestructurade red, <strong>con</strong>ocimientos y Service Pack que se necesitan.Microsoft SQL Server 2000Sistema de desarrollo Microsoft Visual Studio® .NETPara llevar a cabo los procedimientos de este artículo, también es necesario que tenga<strong>con</strong>ocimientos acerca del desarrollo Web en ASP.NET <strong>con</strong> la herramienta MicrosoftVisual C#.ResumenEn este artículo se incluyen los siguientes procedimientos:1. Crear una aplicación Web <strong>con</strong> una página de inicio de sesión2. Configurar la aplicación Web para la autenticación mediante Formularios3. Generar un vale de autenticación para los usuarios autenticados4. Construir <strong>objetos</strong> <strong>GenericPrincipal</strong> y FormsIdentity5. Probar la aplicación1. Crear una aplicación Web <strong>con</strong> una página de inicio desesiónEn este procedimiento se crea una nueva aplicación Web ASP.NET. La aplicación<strong>con</strong>tendrá dos páginas: una página predeterminada a la que sólo pueden tener accesolos usuarios autenticados y una página de inicio de sesión que se utiliza para recopilarlas credenciales de usuario. Para crear una aplicación Web <strong>con</strong> una página de inicio de sesión1. Inicie Visual Studio .NET y cree una nueva aplicación Web ASP.NET en C# <strong>con</strong> elnombre <strong>GenericPrincipal</strong>App.2. Cambie el nombre de WebForm1.aspx por Logon.aspx.3. Agregue los siguientes <strong>con</strong>troles a Logon.aspx para crear un formulario de iniciode sesión.Tabla 1: Controles de Logon.aspxTipo de <strong>con</strong>trol Texto Id.Etiqueta User Name: -Etiqueta Password -Cuadro de texto - txtUserNameCuadro de texto - txtPasswordBotón Logon btnLogon5. Configure la propiedad TextMode del <strong>con</strong>trol de cuadro de texto de la <strong>con</strong>traseñaen Password.6. En el Explorador de soluciones, haga clic <strong>con</strong> el botón secundario del mouse(ratón) en <strong>GenericPrincipal</strong>App, elija Agregar y, después, haga clic en Agregarformulario Web.7. Como nombre del nuevo formulario, escriba default.aspx y, después, haga clic enAbrir.2


}// This code would typically validate the user name and password// combination against a SQL database or Active Directory// Simulate an authenticated userreturn true;3. Agregue el siguiente método auxiliar privado llamado GetRoles, que se utilizapara obtener el <strong>con</strong>junto de funciones a las que pertenece el usuario.private string GetRoles( string username, string password ){// Lookup code omitted for clarity// This code would typically look up the role list from a database table.// If the user was being authenticated against Active Directory, the// Security groups and/or distribution lists that the user belongs to may be// used instead}// This GetRoles method returns a pipe delimited string <strong>con</strong>taining roles// rather than returning an array, because the string format is <strong>con</strong>venient// for storing in the authentication ticket / cookie, as user datareturn "Senior Manager|Manager|Employee";4. Muestre el formulario Logon.aspx en el modo de diseño y haga doble clic en elbotón Logon para crear un <strong>con</strong>trolador de eventos de clic.5. Agregue una llamada al método IsAuthenticated, suministrando el nombre deusuario y la <strong>con</strong>traseña capturados a través del formulario de inicio de sesión.Asigne el valor devuelto a una variable de tipo bool, que indique si el usuario seha autenticado o no.bool isAuthenticated = IsAuthenticated( txtUserName.Text,txtPassword.Text );6. Si el usuario se autentica, agregue una llamada al método GetRoles para obtenerla lista de funciones del usuario.if (isAuthenticated == true ){string roles = GetRoles( txtUserName.Text, txtPassword.Text );7. Cree un nuevo vale de autenticación mediante Formularios que <strong>con</strong>tenga elnombre de usuario, una fecha de caducidad y la lista de funciones a las quepertenece el usuario. Observe que la propiedad de datos de usuario del vale deautenticación se utiliza para almacenar la lista de funciones del usuario. Observetambién que <strong>con</strong> el siguiente código se crea un vale no persistente, aunque elhecho de que el vale o la cookie sean persistentes o no depende del caso de laaplicación.// Create the authentication ticketFormsAuthenticationTicket authTicket = new4


FormsAuthenticationTicket(1,// versiontxtUserName.Text, // user nameDateTime.Now, // creationDateTime.Now.AddMinutes(60),// Expirationfalse,// Persistentroles ); // User data8. Agregue código para crear una representación de cadena cifrada del vale yalmacenarla como datos en un objeto HttpCookie.// Now encrypt the ticket.string encryptedTicket = FormsAuthentication.Encrypt(authTicket);// Create a cookie and add the encrypted ticket to the// cookie as data.HttpCookie authCookie =new HttpCookie(FormsAuthentication.FormsCookieName,encryptedTicket);9. Agregue la cookie a la colección de cookies que se devuelven al explorador delusuario.// Add the cookie to the outgoing cookies collection.Response.Cookies.Add(authCookie);10. Redirija al usuario a la página solicitada originalmente}// Redirect the user to the originally requested pageResponse.Redirect( FormsAuthentication.GetRedirectUrl(txtUserName.Text,false ));4. Construir <strong>objetos</strong> <strong>GenericPrincipal</strong> y FormsIdentityEn este procedimiento se implementa un <strong>con</strong>trolador de eventos de autenticación deaplicación y se <strong>con</strong>struyen <strong>objetos</strong> <strong>GenericPrincipal</strong> y FormsIdentity basados en lainformación <strong>con</strong>tenida en el vale de autenticación. Para <strong>con</strong>struir <strong>objetos</strong> <strong>GenericPrincipal</strong> y FormsIdentity1. En el Explorador de soluciones, abra global.asax.2. Cambie a la vista de código y agregue las siguientes instrucciones using alprincipio del archivo:using System.Web.Security;using System.Security.Principal;3. Busque el <strong>con</strong>trolador de eventos Application_AuthenticateRequest y agregueel siguiente código para obtener la cookie de autenticación mediante Formulariosde la colección de cookies que se pasó <strong>con</strong> la solicitud.5


Extract the forms authentication cookiestring cookieName = FormsAuthentication.FormsCookieName;HttpCookie authCookie = Context.Request.Cookies[cookieName];if(null == authCookie){// There is no authentication cookie.return;}4. Agregue el siguiente código para extraer y descifrar el vale de autenticación de lacookie de autenticación mediante Formularios.FormsAuthenticationTicket authTicket = null;try{authTicket = FormsAuthentication.Decrypt(authCookie.Value);}catch(Exception ex){// Log exception details (omitted for simplicity)return;}if (null == authTicket){// Cookie failed to decrypt.return;}5. Agregue el siguiente código para analizar la lista de nombres de funcionesseparados por símbolos de canalización que se adjuntó al vale cuando seautenticó al usuario originalmente.// When the ticket was created, the UserData property was assigned a// pipe delimited string of role names.string[] roles = authTicket.UserData.Split(new char[]{'|'});6. Agregue el siguiente código para crear un objeto FormsIdentity <strong>con</strong> el nombre deusuario obtenido en el nombre del vale y un objeto <strong>GenericPrincipal</strong> que <strong>con</strong>tieneesa identidad junto <strong>con</strong> la lista de funciones del usuario.// Create an Identity objectFormsIdentity id = new FormsIdentity( authTicket );// This principal will flow throughout the request.<strong>GenericPrincipal</strong> principal = new <strong>GenericPrincipal</strong>(id, roles);// Attach the new principal object to the current HttpContext object6


Context.User = principal;5. Probar la aplicaciónEn este procedimiento se agrega código a la página default.aspx para mostrarinformación del objeto <strong>GenericPrincipal</strong> adjunto al objeto HttpContext actual, para<strong>con</strong>firmar que se ha <strong>con</strong>struido el objeto correctamente y que se ha asignado a lasolicitud Web actual. Después, se compilará y probará la aplicación. Para probar la aplicación1. En el Explorador de soluciones, haga doble clic en default.aspx.2. Haga doble clic en el formulario Web default.aspx para mostrar el <strong>con</strong>trolador deeventos de carga de la página.3. Desplácese hasta el principio del archivo y agregue la siguiente instrucción usingdebajo de las instrucciones using existentes.using System.Security.Principal;4. Vuelva al <strong>con</strong>trolador de eventos de carga de la página y agregue el siguientecódigo para mostrar el nombre de identidad adjunto al objeto <strong>GenericPrincipal</strong>asociado <strong>con</strong> la solicitud Web actual.IPrincipal p = HttpContext.Current.User;Response.Write( "Authenticated Identity is: " +p.Identity.Name );Response.Write( "" );4. Agregue el siguiente código para probar la pertenencia a funciones de la identidadautenticada actual.if ( p.IsInRole("Senior Manager") )Response.Write( "User is in Senior Manager role" );elseResponse.Write( "User is not in Senior Manager role" );if ( p.IsInRole("Manager") )Response.Write( "User is in Manager role" );elseResponse.Write( "User is not in Manager role" );if ( p.IsInRole("Employee") )Response.Write( "User is in Employee role" );elseResponse.Write( "User is not in Employee role" );if ( p.IsInRole("Sales") )Response.Write( "User is in Sales role" );elseResponse.Write( "User is not in Sales role" );7


5. En el Explorador de soluciones, haga clic <strong>con</strong> el botón secundario en default.aspxy, a <strong>con</strong>tinuación, haga clic en Establecer como página de inicio.6. En el menú Generar, haga clic en Generar solución. Elimine los errores decompilación.7. Presione Ctrl+F5 para ejecutar la aplicación. Puesto que default.aspx está<strong>con</strong>figurada como la página de inicio, ésta es la página que se solicita inicialmente.8. Cuando se haya realizado la redirección a la página de inicio de sesión (porqueinicialmente no tiene un vale de autenticación), escriba un nombre de usuario enUser Name y una <strong>con</strong>traseña (cualquiera) en Password y, después, haga clic enLogon (Iniciar sesión).9. Confirme que se lleva a cabo la redirección a la página default.aspx y que semuestran la identidad de usuario y los detalles de función correctos. El usuariodebe ser miembro de las funciones Senior Manager, Manager y Employee, perono de la función Sales.8

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!