Está en la página 1de 8

Crear aplicaciones ASP.

NET
seguras
Autenticacin, autorizacin y comunicacin
segura
Consulte la Pgina de entrada como punto de partida y para obtener una descripcin
completa del documento Crear aplicaciones ASP.NET seguras.
Resumen
En este artculo se muestra cmo crear y tratar objetos GenericPrincipal y FormsIdentity
cuando se utiliza la autenticacin mediante Formularios.
Cmo: Crear objetos GenericPrincipal con
autenticacin mediante Formularios
En las aplicaciones que utilizan la autenticacin mediante Formularios a menudo se
desear utilizar la clase GenericPrincipal en combinacin con la clase FormsIdentity!
para crear un esquema de autorizacin que no sea espec"ico de #indo$s y que sea
independiente de un dominio de #indo$s.
Por ejemplo% en una aplicacin se puede&
utilizar la autenticacin mediante Formularios para obtener credenciales de usuario
nombre de usuario y contrase'a!.
(alidar las credenciales suministradas en un almac)n de datos* por ejemplo% una base
de datos o el ser(icio de directorio +icroso"t, -cti(e .irectory,.
crear objetos GenericPrincipal y FormsIdentity basados en (alores recuperados en
el almac)n de datos. Entre ellos se pueden incluir los detalles de pertenencia a
"unciones de un usuario.
utilizar esos objetos para tomar decisiones de autorizacin.

En este artculo se describe cmo crear una aplicacin #eb basada en "ormularios que
autentica a usuarios y crea un (ale de autenticacin mediante Formularios personalizado
que contiene in"ormacin de usuario y de "unciones. /ambi)n se muestra cmo asignar
esa in"ormacin a objetos GenericPrincipal y FormsIdentity% y cmo asociar los
nue(os objetos al conte0to de solicitud #eb 1//P% con lo que se permite su uso para la
lgica de autorizacin en la aplicacin.
Este artculo se centra en la construccin de los objetos GenericPrincipal y
FormsIdentity junto con el procesamiento del (ale de autenticacin mediante
Formularios. Para obtener detalles acerca de cmo autenticar a usuarios con -cti(e
.irectory y 234 2er(er 5666% consulte los siguientes artculos relacionados en la seccin
7e"erencia de esta gua&
8Cmo utilizar la autenticacin mediante Formularios con -cti(e .irectory8
9
8Cmo utilizar la autenticacin mediante Formularios con 234 2er(er 56668

Requisitos
- continuacin se describen las recomendaciones de :ard$are% so"t$are% in"raestructura
de red% conocimientos y 2er(ice Pac; que se necesitan.
+icroso"t 234 2er(er< 5666
2istema de desarrollo +icroso"t =isual 2tudio, .>E/

Para lle(ar a cabo los procedimientos de este artculo% tambi)n es necesario que tenga
conocimientos acerca del desarrollo #eb en -2P.>E/ con la :erramienta +icroso"t
=isual C?<.
Resumen
En este artculo se incluyen los siguientes procedimientos&
9. Crear una aplicacin #eb con una pgina de inicio de sesin
5. Con"igurar la aplicacin #eb para la autenticacin mediante Formularios
@. Generar un (ale de autenticacin para los usuarios autenticados
A. Construir objetos GenericPrincipal y FormsIdentity
B. Probar la aplicacin

1. Crear una aplicacin Web con una pina de inicio de
sesin
En este procedimiento se crea una nue(a aplicacin #eb -2P.>E/. 4a aplicacin
contendr dos pginas& una pgina predeterminada a la que slo pueden tener acceso
los usuarios autenticados y una pgina de inicio de sesin que se utiliza para recopilar
las credenciales de usuario.
Para crear una aplicacin Web con una pina de inicio de sesin
9. Inicie =isual 2tudio .>E/ y cree una nue(a aplicacin #eb -2P.>E/ en C? con el
nombre GenericPrincipal!pp.
5. Cambie el nombre de #ebForm9.asp0 por 4ogon.asp0.
@. -gregue los siguientes controles a 4ogon.asp0 para crear un "ormulario de inicio
de sesin.

/abla 9& Controles de 4ogon.asp0
/ipo de control /e0to Id.
Etiqueta Cser >ame& D
Etiqueta Pass$ord D
Cuadro de te0to D t0tCser>ame
Cuadro de te0to D t0tPass$ord
Eotn 4ogon btn4ogon

B. Con"igure la propiedad "e#t$ode del control de cuadro de te0to de la contrase'a
en Pass%ord.
F. En el E0plorador de soluciones% :aga clic con el botn secundario del mouse
ratn! en GenericPrincipal!pp% elija !rear y% despu)s% :aga clic en !rear
&ormulario Web.
5
G. Como nombre del nue(o "ormulario% escriba de&ault.asp# y% despu)s% :aga clic en
!brir.

'. Con&iurar la aplicacin Web para la autenticacin
mediante Formularios
Para modi&icar el arc(i)o Web.con&i de la aplicacin de &orma que *sta
admita la autenticacin mediante Formularios
9. Ctilice el E0plorador de soluciones para abrir #eb.con"ig.
5. Eusque el elemento Haut(enticationI y cambie el atributo mode a Forms.
@. -gregue el elemento H&ormsI siguiente como elemento secundario del elemento
Haut(enticationI y establezca los atributos loin+rl% name% timeout y pat( como
se muestra a continuacin&
<authentication mode="Forms">
<forms loginUrl="logon.aspx" name="AuthCookie" timeout="60" path="/">
</forms>
</authentication>
A. -gregue el siguiente elemento Haut(ori,ationI debajo del elemento
Haut(enticationI. Esto permitir que slo los usuarios autenticados tengan
acceso a la aplicacin. El atributo loin+rl establecido anteriormente del elemento
Haut(enticationI redirigir las solicitudes no autenticadas a la pgina
4ogon.asp0.
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
-. Generar un )ale de autenticacin para los usuarios
autenticados
En este procedimiento se escribe cdigo para generar un (ale de autenticacin para los
usuarios autenticados. El (ale de autenticacin es un tipo de coo;ie utilizado por
Forms!ut(entication$odule de -2P.>E/.
El cdigo de autenticacin generalmente incluye la consulta del nombre de usuario y la
contrase'a suministrados en una base de datos personalizada o en -cti(e .irectory.
Para obtener in"ormacin acerca de cmo realizar estas consultas% consulte los
siguientes artculos en la seccin 7e"erencia de esta gua&
J 8Cmo& Ctilizar la autenticacin mediante Formularios con -cti(e .irectory8
J 8Cmo& Ctilizar la autenticacin mediante Formularios con 234 2er(er 56668

Para enerar un )ale de autenticacin para los usuarios autenticados
9. -bra el arc:i(o 4ogon.asp0.cs y agregue la siguiente instruccin usin al principio
del arc:i(o debajo de las instrucciones usin e0istentes&
using System.Web.Security;
@
5. -gregue a la clase #ebForm9 el siguiente m)todo au0iliar pri(ado llamado
Is!ut(enticated% que se utiliza para (alidar nombres de usuario y contrase'as en
la autenticacin de usuarios. En este cdigo se supone que todas las
combinaciones de nombre de usuario y contrase'a son (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;
}
@. -gregue el siguiente m)todo au0iliar pri(ado llamado GetRoles% que se utiliza
para obtener el conjunto de "unciones 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";
}
A. +uestre el "ormulario 4ogon.asp0 en el modo de dise'o y :aga doble clic en el
botn .oon para crear un controlador de e(entos de clic.
B. -gregue una llamada al m)todo Is!ut(enticated% suministrando el nombre de
usuario y la contrase'a capturados a tra()s del "ormulario de inicio de sesin.
-signe el (alor de(uelto a una (ariable de tipo bool% que indique si el usuario se
:a autenticado o no.
bool isAuthenticated = IsAuthenticated( txtUserName.Text,
txtPassword.Text );
F. 2i el usuario se autentica% agregue una llamada al m)todo GetRoles para obtener
la lista de "unciones del usuario.
if (isAuthenticated == true )
{
string roles = GetRoles( txtUserName.Text, txtPassword.Text );
G. Cree un nue(o (ale de autenticacin mediante Formularios que contenga el
nombre de usuario% una "ec:a de caducidad y la lista de "unciones a las que
A
pertenece el usuario. Kbser(e que la propiedad de datos de usuario del (ale de
autenticacin se utiliza para almacenar la lista de "unciones del usuario. Kbser(e
tambi)n que con el siguiente cdigo se crea un (ale no persistente% aunque el
:ec:o de que el (ale o la coo;ie sean persistentes o no depende del caso de la
aplicacin.
// 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
L. -gregue cdigo para crear una representacin de cadena ci"rada del (ale y
almacenarla como datos en un objeto /ttpCoo0ie.
// 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);
M. -gregue la coo;ie a la coleccin de coo;ies que se de(uel(en al e0plorador del
usuario.
// Add the cookie to the outgoing cookies collection.
Response.Cookies.Add(authCookie);
96. 7edirija al usuario a la pgina solicitada originalmente
// Redirect the user to the originally requested page
Response.Redirect( FormsAuthentication.GetRedirectUrl(
txtUserName.Text,
false ));
}

1. Construir objetos GenericPrincipal y FormsIdentity
En este procedimiento se implementa un controlador de e(entos de autenticacin de
aplicacin y se construyen objetos GenericPrincipal y FormsIdentity basados en la
in"ormacin contenida en el (ale de autenticacin.
Para construir objetos GenericPrincipal y FormsIdentity
9. En el E0plorador de soluciones% abra global.asa0.
5. Cambie a la (ista de cdigo y agregue las siguientes instrucciones usin al
principio del arc:i(o&
B
using System.Web.Security;
using System.Security.Principal;
@. Eusque el controlador de e(entos !pplication2!ut(enticateRequest y agregue
el siguiente cdigo para obtener la coo;ie de autenticacin mediante Formularios
de la coleccin de coo;ies 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;
}
A. -gregue el siguiente cdigo para e0traer y desci"rar el (ale de autenticacin de la
coo;ie de autenticacin 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;
}
B. -gregue el siguiente cdigo para analizar la lista de nombres de "unciones
separados por smbolos de canalizacin que se adjunt al (ale 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[]{'|'});
F. -gregue el siguiente cdigo para crear un objeto FormsIdentity con el nombre de
usuario obtenido en el nombre del (ale y un objeto GenericPrincipal que contiene
esa identidad junto con la lista de "unciones del usuario.
F
// 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;

3. Probar la aplicacin
En este procedimiento se agrega cdigo a la pgina de"ault.asp0 para mostrar
in"ormacin del objeto GenericPrincipal adjunto al objeto /ttpConte#t actual% para
con"irmar que se :a construido el objeto correctamente y que se :a asignado a la
solicitud #eb actual. .espu)s% se compilar y probar la aplicacin.
Para probar la aplicacin
9. En el E0plorador de soluciones% :aga doble clic en de"ault.asp0.
5. 1aga doble clic en el "ormulario #eb de"ault.asp0 para mostrar el controlador de
e(entos de carga de la pgina.
@. .esplcese :asta el principio del arc:i(o y agregue la siguiente instruccin usin
debajo de las instrucciones usin e0istentes.
using System.Security.Principal;
A. =uel(a al controlador de e(entos de carga de la pgina y agregue el siguiente
cdigo para mostrar el nombre de identidad adjunto al objeto GenericPrincipal
asociado con la solicitud #eb actual.
IPrincipal p = HttpContext.Current.User;
Response.Write( "Authenticated Identity is: " +
p.Identity.Name );
Response.Write( "<p>" );
A. -gregue el siguiente cdigo para probar la pertenencia a "unciones 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>" );
G
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>" );
B. En el E0plorador de soluciones% :aga clic con el botn secundario en de"ault.asp0
y% a continuacin% :aga clic en 4stablecer como pina de inicio.
F. En el menN Generar% :aga clic en Generar solucin. Elimine los errores de
compilacin.
G. Presione Ctrl5F3 para ejecutar la aplicacin. Puesto que de"ault.asp0 est
con"igurada como la pgina de inicio% )sta es la pgina que se solicita inicialmente.
L. Cuando se :aya realizado la redireccin a la pgina de inicio de sesin porque
inicialmente no tiene un (ale de autenticacin!% escriba un nombre de usuario en
Cser >ame y una contrase'a cualquiera! en Pass$ord y% despu)s% :aga clic en
.oon Iniciar sesin!.
M. Con"irme que se lle(a a cabo la redireccin a la pgina de"ault.asp0 y que se
muestran la identidad de usuario y los detalles de "uncin correctos. El usuario
debe ser miembro de las "unciones 2enior +anager% +anager y Employee% pero
no de la "uncin 2ales.

Recursos adicionales
Para obtener ms in"ormacin% consulte los siguientes artculos relacionados en la
seccin 7e"erencia de esta gua&
J 8Cmo& Ctilizar la autenticacin mediante Formularios con -cti(e .irectory8
J 8Cmo& Ctilizar la autenticacin mediante Formularios con 234 2er(er 56668

L