Cómo: Crear objetos GenericPrincipal con autenticación mediante Formularios

Publicado: 26 de junio de 2006

Consulte la Página de entrada como punto de partida y para obtener una descripción completa del documento Crear aplicaciones ASP.NET seguras.

Resumen: En este artículo se muestra cómo crear y tratar objetos GenericPrincipal y FormsIdentity cuando se utiliza la autenticación mediante Formularios.

En las aplicaciones que utilizan la autenticación mediante Formularios a menudo se deseará utilizar la clase GenericPrincipal (en combinación con la clase FormsIdentity) para crear un esquema de autorización que no sea específico de Windows y que sea independiente 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 contraseña).

  • validar las credenciales suministradas en un almacén de datos; por ejemplo, una base de datos o el servicio de directorio Microsoft® Active Directory®.

  • crear objetos GenericPrincipal y FormsIdentity basados en valores recuperados en el almacén de datos. Entre ellos se pueden incluir los detalles de pertenencia a funciones de un usuario.

  • utilizar esos objetos para tomar decisiones de autorización.

En este artículo se describe cómo crear una aplicación Web basada en formularios que autentica a usuarios y crea un vale de autenticación mediante Formularios personalizado que contiene información de usuario y de funciones. También se muestra cómo asignar esa información a objetos GenericPrincipal y FormsIdentity, y cómo asociar los nuevos objetos al contexto de solicitud Web HTTP, con lo que se permite su uso para la lógica de autorización en la aplicación.
Este artículo se centra en la construcción de los objetos GenericPrincipal y FormsIdentity junto con el procesamiento del vale de autenticación mediante Formularios. Para obtener detalles acerca de cómo autenticar a usuarios con Active Directory y SQL Server 2000, consulte los siguientes artículos relacionados en la sección Referencia de esta guía:

Requisitos
A continuación se describen las recomendaciones de hardware, software, infraestructura de red, conocimientos y Service Pack que se necesitan.
Microsoft SQL Server™ 2000
Sistema de desarrollo Microsoft Visual Studio® .NET
Para llevar a cabo los procedimientos de este artículo, también es necesario que tenga conocimientos acerca del desarrollo Web en ASP.NET con la herramienta Microsoft Visual C#™.

En esta página

Crear una aplicación Web con una página de inicio de sesión Crear una aplicación Web con una página de inicio de sesión
Configurar la aplicación Web para la autenticación mediante Formularios Configurar la aplicación Web para la autenticación mediante Formularios
Generar un vale de autenticación para los usuarios autenticados Generar un vale de autenticación para los usuarios autenticados
Construir objetos GenericPrincipal y FormsIdentity Construir objetos GenericPrincipal y FormsIdentity
Probar la aplicación Probar la aplicación
Recursos adicionales Recursos adicionales

Crear una aplicación Web con una página de inicio de sesión

En este procedimiento se crea una nueva aplicación Web ASP.NET. La aplicación contendrá dos páginas: una página predeterminada a la que sólo pueden tener acceso los usuarios autenticados y una página de inicio de sesión que se utiliza para recopilar las credenciales de usuario.

Para crear una aplicación Web con una página de inicio de sesión

  • Inicie Visual Studio .NET y cree una nueva aplicación Web ASP.NET en C# con el nombre GenericPrincipalApp.

  • Cambie el nombre de WebForm1.aspx por Logon.aspx.

  • Agregue los siguientes controles a Logon.aspx para crear un formulario de inicio de sesión.

    Tabla 1: Controles de Logon.aspx

    Tipo de control

    Texto

    Id.

    Etiqueta

    User Name:

    -

    Etiqueta

    Password:

    -

    Cuadro de texto

    -

    txtUserName

    Cuadro de texto

    -

    txtPassword

    Botón

    Logon

    btnLogon

  • Configure la propiedad TextMode del control de cuadro de texto de la contraseña en Password.

  • En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en GenericPrincipalApp, elija Agregar y, después, haga clic en Agregar formulario Web.

  • Como nombre del nuevo formulario, escriba default.aspx y, después, haga clic en Abrir.

Configurar la aplicación Web para la autenticación mediante Formularios

Para modificar el archivo Web.config de la aplicación de forma que ésta admita la autenticación mediante Formularios

  1. Utilice el Explorador de soluciones para abrir Web.config.

  2. Busque el elemento <authentication> y cambie el atributo mode a Forms.

  3. Agregue el elemento <forms> siguiente como elemento secundario del elemento <authentication> y establezca los atributos loginUrl, name, timeout y path como se muestra a continuación:

    <authentication mode="Forms">
       <forms loginUrl="logon.aspx" name="AuthCookie" timeout="60"    path="/">
       </forms>
       </authentication>
    
  4. Agregue el siguiente elemento <authorization> debajo del elemento <authentication>. Esto permitirá que sólo los usuarios autenticados tengan acceso a la aplicación. El atributo loginUrl establecido anteriormente del elemento <authentication> redirigirá las solicitudes no autenticadas a la página Logon.aspx.

    <authorization> 
       <deny users="?" />
       <allow users="*" />
       </authorization>
    

Generar un vale de autenticación para los usuarios autenticados

En este procedimiento se escribe código para generar un vale de autenticación para los usuarios autenticados. El vale de autenticación es un tipo de cookie utilizado por FormsAuthenticationModule de ASP.NET.

El código de autenticación generalmente incluye la consulta del nombre de usuario y la contraseña suministrados en una base de datos personalizada o en Active Directory.

Para obtener información acerca de cómo realizar estas consultas, consulte los siguientes artículos en la sección Referencia de esta guía:

Para generar un vale de autenticación para los usuarios autenticados

  1. Abra el archivo Logon.aspx.cs y agregue la siguiente instrucción using al principio del archivo debajo de las instrucciones using existentes:

    using System.Web.Security;
    
  2. Agregue a la clase WebForm1 el siguiente método auxiliar privado llamado IsAuthenticated, que se utiliza para validar nombres de usuario y contraseñas en la autenticación de usuarios. En este código se supone que todas las combinaciones de nombre de usuario y contraseña son válidas.

    private bool IsAuthenticated( string username, string password )
       {
       // Lookup code omitted for clarity
       // This code would typically validate the user name and password
       // combination against a SQL database or Active Directory
       // Simulate an authenticated user
       return true;
       }
    
  3. Agregue el siguiente método auxiliar privado llamado GetRoles, que se utiliza para obtener el conjunto 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 containing roles
       // rather than returning an array, because the string format is convenient 
       // for storing in the authentication ticket / cookie, as user data
       return "Senior Manager|Manager|Employee";
       }
    
  4. Muestre el formulario Logon.aspx en el modo de diseño y haga doble clic en el botón Logon para crear un controlador de eventos de clic.

  5. Agregue una llamada al método IsAuthenticated, suministrando el nombre de usuario y la contraseñ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 se ha autenticado o no.

    bool isAuthenticated = IsAuthenticated( txtUserName.Text, 
       txtPassword.Text );
    
  6. Si el usuario se autentica, agregue una llamada al método GetRoles para obtener la 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 contenga el nombre de usuario, una fecha de caducidad y la lista de funciones a las que pertenece el usuario. Observe que la propiedad de datos de usuario del vale de autenticación se utiliza para almacenar la lista de funciones del usuario. Observe también que con el siguiente código se crea un vale no persistente, aunque el hecho de que el vale o la cookie sean persistentes o no depende del caso de la aplicación.

    // Create the authentication ticket
       FormsAuthenticationTicket authTicket = new 
       FormsAuthenticationTicket(1, // version
       txtUserName.Text, // user name
       DateTime.Now, // creation
       DateTime.Now.AddMinutes(60),// Expiration
       false, // Persistent
       roles ); // User data
    
  8. Agregue código para crear una representación de cadena cifrada del vale y almacenarla 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 del usuario.

    // 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 page
       Response.Redirect( FormsAuthentication.GetRedirectUrl(
       txtUserName.Text, 
       false ));
       }
    

Construir objetos GenericPrincipal y FormsIdentity

En este procedimiento se implementa un controlador de eventos de autenticación de aplicación y se construyen objetos GenericPrincipal y FormsIdentity basados en la información contenida en el vale de autenticación.

Para construir objetos GenericPrincipal y FormsIdentity

  1. En el Explorador de soluciones, abra global.asax.

  2. Cambie a la vista de código y agregue las siguientes instrucciones using al principio del archivo:

    using System.Web.Security;
       using System.Security.Principal;
    
  3. Busque el controlador de eventos Application_AuthenticateRequest y agregue el siguiente código para obtener la cookie de autenticación mediante Formularios de la colección de cookies que se pasó con la solicitud.

    // Extract the forms authentication cookie
       string 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 la cookie 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 funciones separados por símbolos de canalización que se adjuntó al vale cuando se autenticó 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 con el nombre de usuario obtenido en el nombre del vale y un objeto GenericPrincipal que contiene esa identidad junto con la lista de funciones del usuario.

    // Create an Identity object
       FormsIdentity id = new FormsIdentity( authTicket );
    
    // This principal will flow throughout the request.
       GenericPrincipal principal = new GenericPrincipal(id, roles);
       // Attach the new principal object to the current HttpContext object
       Context.User = principal;
    

Probar la aplicación

En este procedimiento se agrega código a la página default.aspx para mostrar información del objeto GenericPrincipal adjunto al objeto HttpContext actual, para confirmar que se ha construido el objeto correctamente y que se ha asignado a la solicitud Web actual. Después, se compilará y probará la aplicación.

Para probar la aplicación

  1. En el Explorador de soluciones, haga doble clic en default.aspx.

  2. Haga doble clic en el formulario Web default.aspx para mostrar el controlador de eventos de carga de la página

  3. Desplácese hasta el principio del archivo y agregue la siguiente instrucción using debajo de las instrucciones using existentes.

    using System.Security.Principal;
    
  4. Vuelva al controlador de eventos de carga de la página y agregue el siguiente código para mostrar el nombre de identidad adjunto al objeto GenericPrincipal asociado con la solicitud Web actual.

    IPrincipal p = HttpContext.Current.User;
       Response.Write( "Authenticated Identity is: " + 
       p.Identity.Name );
       Response.Write( "<p>" );
    
  5. Agregue el siguiente código para probar la pertenencia a funciones de la identidad autenticada actual.

    if ( p.IsInRole("Senior Manager") )
       Response.Write( "User is in Senior Manager role<p>" );
       else
       Response.Write( "User is not in Senior Manager role<p>" );
    
    if ( p.IsInRole("Manager") )
       Response.Write( "User is in Manager role<p>" );
       else
       Response.Write( "User is not in Manager role<p>" );
    
    if ( p.IsInRole("Employee") )
       Response.Write( "User is in Employee role<p>" );
       else
       Response.Write( "User is not in Employee role<p>" );
    
    if ( p.IsInRole("Sales") )
       Response.Write( "User is in Sales role<p>" );
       else
       Response.Write( "User is not in Sales role<p>" );
    
  6. En el Explorador de soluciones, haga clic con el botón secundario en default.aspx y, a continuación, haga clic en Establecer como página de inicio.

  7. En el menú Generar, haga clic en Generar solución. Elimine los errores de compilación.

  8. Presione Ctrl+F5 para ejecutar la aplicación. Puesto que default.aspx está configurada como la página de inicio, ésta es la página que se solicita inicialmente.

  9. Cuando se haya realizado la redirección a la página de inicio de sesión (porque inicialmente no tiene un vale de autenticación), escriba un nombre de usuario en User Name y una contraseña (cualquiera) en Password y, después, haga clic en Logon (Iniciar sesión).

  10. Confirme que se lleva a cabo la redirección a la página default.aspx y que se muestran la identidad de usuario y los detalles de función correctos. El usuario debe ser miembro de las funciones Senior Manager, Manager y Employee, pero no de la función Sales.

Recursos adicionales

Para obtener más información, consulte los siguientes artículos relacionados en la sección Referencia de esta guía:

Mostrar: