Sunteți pe pagina 1din 10

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 un objeto principal personalizado que
proporciona funcionalidad extendida basada en funciones que se puede utilizar para la
autorizacin de .NE.
Cmo: Implementar IPrincipal
En .NE !rame"or# se proporcionan las clases WindowsPrincipal y GenericPrincipal$
que ofrecen funcionalidad bsica de comprobacin de funciones para mecanismos de
autenticacin de %indo"s y distintos de %indo"s$ respecti&amente. En ambas clases se
implementa la interfaz IPrincipal. Para que se puedan utilizar en la autorizacin$
'(P.NE requiere que estos objetos se almacenen en HttpContext.User. Para las
aplicaciones basadas en %indo"s$ deben almacenarse en Thread.CurrentPrincipal.
)a funcionalidad que ofrecen estas clases es suficiente para la mayora de casos de las
aplicaciones. )as aplicaciones pueden llamar explcitamente al m*todo
IPrincipal.IsInRole para realizar comprobaciones de funciones mediante programacin.
El m*todo Demand de la clase PrincipalPermission$ si se utiliza para exigir que un
llamador pertenezca a una funcin determinada +ya sea de forma declarati&a o
imperati&a,$ tambi*n da como resultado una llamada a IPrincipal.IsInRole.
En algunas circunstancias$ puede que necesite desarrollar sus propias
implementaciones principales mediante la creacin de una clase que implemente la
interfaz IPrincipal. )as clases que implementan IPrincipal se pueden utilizar para la
autorizacin de .NE.
'lgunas de las razones para implementar su propia clase IPrincipal son las siguientes-
.esea extender la funcionalidad de comprobacin de funciones. Puede que necesite
m*todos que le permitan comprobar si un usuario determinado es miembro de
&arias funciones. Por ejemplo-
CustomPrincipal.IsInAllRoles( "Role1", "Role2", "Role3" )
CustomPrincipal.IsInAnyRole( "Role1", "Role2", "Role3" )
.esea implementar un m*todo o propiedad adicional que de&uel&a una lista de
funciones en una matriz. Por ejemplo-
/
string[] roles = CustomPrincipal.Roles;
.esea que la aplicacin exija la lgica de jerarqua de funciones. Por ejemplo$ un
miembro de la funcin (enior 0anager +.irector, se puede considerar que est en
un ni&el superior en la jerarqua que un 0anager +(ubdirector,. Esto se puede
probar con m*todos como los siguientes.
CustomPrincipal.IsInHigherRole("Manager");
CustomPrincipal.IsInLowerRole("Manager");
.esea implementar la inicializacin lenta de las listas de funciones. Por ejemplo$
puede cargar de forma dinmica la lista de funciones slo cuando se solicite la
comprobacin de funciones.

En este artculo se describe cmo implementar una clase IPrincipal personalizada y
utilizarla para la autorizacin basada en funciones en una aplicacin de '(P.NE que
utiliza autenticacin mediante !ormularios.
Reuisitos
' continuacin se describen las recomendaciones de 1ard"are$ soft"are$ infraestructura
de red$ conocimientos y (er&ice Pac# que se necesitan-
(istema de desarrollo 0icrosoft2 3isual (tudio2 .NE

Para lle&ar a cabo los procedimientos de este artculo$ tambi*n es necesario que tenga
conocimientos acerca del desarrollo %eb en '(P.NE con la 1erramienta 0icrosoft
3isual C45.
Resumen
En este artculo se incluyen los siguientes procedimientos-
/. Crear una sencilla aplicacin %eb
6. Configurar la aplicacin %eb para la autenticacin mediante !ormularios
7. 8enerar un &ale de autenticacin para los usuarios autenticados
9. Crear una clase que implemente y ample IPrincipal
:. Crear el objeto CustomPrincipal
;. Probar la aplicacin

!. Crear una sencilla aplicacin We"
En este procedimiento se crea una nue&a aplicacin %eb '(P.NE. )a 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 sencilla aplicacin We"
/. <nicie 3isual (tudio .NE y cree una nue&a aplicacin %eb '(P.NE en C4 con el
nombre CustomPrincipal#pp.
6. Cambie el nombre de %eb!orm/.aspx por )ogon.aspx.
7. 'gregue a )ogon.aspx los controles que se enumeran en la tabla / para crear un
formulario de inicio de sesin.
6
abla /- Controles de Logon.aspx
ipo de control exto <d.
Etiqueta =ser Name- >
Etiqueta Pass"ord >
Cuadro de texto > txt=serName
Cuadro de texto > txtPass"ord
?otn )ogon btn)ogon

:. Configure la propiedad Text$ode del control de cuadro de texto de la contrase@a
en Password.
;. En el %xplorador de soluciones$ 1aga clic con el botn secundario del mouse
+ratn, en CustomPrincipal#pp$ elija #&re&ar y$ a continuacin$ 1aga clic en
#&re&ar 'ormulario We".
A. Como nombre del nue&o formulario$ escriba de'ault.aspx y$ despu*s$ 1aga clic en
#"rir.

(. Con'i&urar la aplicacin We" para la autenticacin
mediante )ormularios
Para modi'icar el archi*o We".con'i& de la aplicacin de 'orma ue +sta
admita la autenticacin mediante )ormularios
/. =tilice el %xplorador de soluciones para abrir We".con'i&.
6. ?usque el elemento BauthenticationC y cambie el atributo mode a )orms.
7. 'gregue el elemento B'ormsC siguiente como elemento secundario del elemento
BauthenticationC y establezca los atributos lo&inUrl$ name$ timeout y path como
se muestra a continuacin-
<authentication mode="Forms">
<forms loginUrl="logon.aspx" name="AuthCookie" timeout="60" path="/">
</forms>
</authentication>
9. 'gregue el siguiente elemento Bauthori,ationC debajo del elemento
BauthenticationC. Esto permitir que slo los usuarios autenticados tengan
acceso a la aplicacin. El atributo lo&inUrl establecido anteriormente del elemento
BauthenticationC redirigir las solicitudes no autenticadas a la pgina
)ogon.aspx.
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
7
-. 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
)orms#uthentication$odule de '(P.NE.
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 el ser&icio de
directorio 0icrosoft 'cti&e .irectory2.
Para obtener informacin acerca de cmo realizar estas consultas$ consulte los
siguientes artculos en la seccin Deferencia de esta gua-
E FCmo- =tilizar la autenticacin mediante !ormularios con 'cti&e .irectoryF
E FCmo- =tilizar la autenticacin mediante !ormularios con (G) (er&er 6HHHF

Para &enerar un *ale de autenticacin para los usuarios autenticados
/. 'bra el arc1i&o )ogon.aspx.cs y agregue la siguiente instruccin usin& al principio
del arc1i&o debajo de las instrucciones usin& existentes.
using System.Web.Security;
6. 'gregue a la clase %eb!orm/ el siguiente m*todo auxiliar pri&ado llamado
Is#uthenticated$ 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;
}
7. 'gregue el siguiente m*todo auxiliar pri&ado 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";
9
}
9. 0uestre el formulario )ogon.aspx en el modo del dise@ador y 1aga doble clic en el
botn .o&on para asociarle un controlador de e&entos de clic.
:. 'gregue una llamada al m*todo Is#uthenticated en la que se suministre el
nombre de usuario y la contrase@a capturados a tra&*s del formulario de inicio de
sesin. 'signe el &alor de&uelto a una &ariable de tipo "ool$ que indique si el
usuario se 1a autenticado o no.
bool isAuthenticated = IsAuthenticated( txtUserName.Text,
txtPassword.Text );
;. (i 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 );
A. Cree un nue&o &ale de autenticacin mediante !ormularios que contenga el
nombre de usuario$ una fec1a de caducidad y la lista de funciones a las que
pertenece el usuario. Ibser&e que la propiedad de datos de usuario del &ale de
autenticacin se utiliza para almacenar la lista de funciones del usuario. Ibser&e
tambi*n que con el siguiente cdigo se crea un &ale no persistente$ aunque el
1ec1o 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
J. 'gregue cdigo para crear una representacin de cadena cifrada del &ale y
almacenarla como datos en un objeto HttpCoo/ie.
// 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);
K. 'gregue la coo#ie a la coleccin de coo#ies que se de&uel&en al explorador del
usuario.
:
// Add the cookie to the outgoing cookies collection.
Response.Cookies.Add(authCookie);
/H. Dedirija al usuario a la pgina solicitada originalmente
// Redirect the user to the originally requested page
Response.Redirect( FormsAuthentication.GetRedirectUrl(
txtUserName.Text,
false ));
}

0. Crear una clase ue implemente 1 ampl2e IPrincipal
En este procedimiento se crea una clase que implementa la interfaz IPrincipal. ambi*n
se agregan m*todos y propiedades adicionales a la clase para ampliar la funcionalidad
de autorizacin basada en funciones.
Para crear una clase ue implemente 1 ampl2e IPrincipal
/. 'gregue una nue&a clase llamada CustomPrincipal al proyecto actual.
6. 'gregue la siguiente instruccin usin& al principio del arc1i&o CustomPrincipal.cs.
using System.Security.Principal;
7. .eri&e la clase CustomPrincipal de la interfaz IPrincipal.
public class CustomPrincipal : IPrincipal
9. 'gregue a la clase las siguientes &ariables miembro pri&adas para mantener el
objeto IIdentit1 asociado al principal actual y la lista de funciones del principal.
private IIdentity _identity;
private string [] _roles;
:. 0odifique el constructor predeterminado de la clase para aceptar un objeto
IIdentit1 y una matriz de funciones. =tilice los &alores suministrados para
inicializar las &ariables miembro pri&adas como se indica a continuacin.
public CustomPrincipal(IIdentity identity, string [] roles)
{
_identity = identity;
_roles = new string[roles.Length];
roles.CopyTo(_roles, 0);
Array.Sort(_roles);
}
A. <mplemente el m*todo IsInRole y la propiedad Identit1 definidos por la interfaz
IPrincipal como se muestra a continuacin.
// IPrincipal Implementation
;
public bool IsInRole(string role)
{
return Array.BinarySearch( _roles, role ) > 0 ? true : false;
}
public IIdentity Identity
{
get
{
return _identity;
}
}
J. 'gregue los dos m*todos pLblicos siguientes que amplan la funcionalidad de
comprobacin basada en funciones.
// Checks whether a principal is in all of the specified set of roles
public bool IsInAllRoles( params string [] roles )
{
foreach (string searchrole in roles )
{
if (Array.BinarySearch(_roles, searchrole) < 0 )
return false;
}
return true;
}
// Checks whether a principal is in any of the specified set of roles
public bool IsInAnyRoles( params string [] roles )
{
foreach (string searchrole in roles )
{
if (Array.BinarySearch(_roles, searchrole ) > 0 )
return true;
}
return false;
}

3. Crear el o"4eto CustomPrincipal
En este procedimiento se implementa un controlador de e&entos de autenticacin de
aplicacin y se construye un objeto CustomPrincipal para representar al usuario
autenticado en funcin de la informacin contenida en el &ale de autenticacin.
Para crear el o"4eto CustomPrincipal
/. En el %xplorador de soluciones$ abra &lo"al.asax.
6. Cambie a la &ista de cdigo y agregue las siguientes instrucciones usin& al
principio del arc1i&o.
using System.Web.Security;
using System.Security.Principal;
A
7. ?usque el controlador de e&entos #pplication5#uthenticateReuest y agregue
el siguiente cdigo para obtener la coo#ie de autenticacin mediante !ormularios
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;
}
9. 'gregue el siguiente cdigo para extraer el &ale de autenticacin de la coo#ie de
autenticacin mediante !ormularios y descifrarlo.
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;
}
:. 'gregue el siguiente cdigo para analizar la lista de nombres de funciones
separados por el smbolo M 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('|');
;. 'gregue el siguiente cdigo para crear un objeto )ormsIdentit1 con el nombre de
usuario obtenido en el nombre del &ale y un objeto CustomPrincipal que contiene
esa identidad junto con la lista de funciones del usuario.
// Create an Identity object
FormsIdentity id = new FormsIdentity( authTicket );
J
// This principal will flow throughout the request.
CustomPrincipal principal = new CustomPrincipal(id, roles);
// Attach the new principal object to the current HttpContext object
Context.User = principal;

3. Pro"ar la aplicacin
En este procedimiento se agrega cdigo a la pgina default.aspx para mostrar
informacin del objeto CustomPrincipal adjunto al objeto HttpContext actual$ para
confirmar que se 1a construido el objeto correctamente y que se 1a asignado a la
solicitud %eb actual. ambi*n se prueba la funcionalidad basada en funciones que
admite la nue&a clase.
Para pro"ar la aplicacin
/. En el %xplorador de soluciones$ 1aga doble clic en de'ault.aspx.
6. Naga doble clic en el formulario %eb default.aspx para mostrar el controlador de
e&entos de carga de la pgina.
7. .esplcese 1asta el principio del arc1i&o y agregue la siguiente instruccin usin&
debajo de las instrucciones usin& existentes.
using System.Security.Principal;
9. 3uel&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 CustomPrincipal
asociado con la solicitud %eb actual.
CustomPrincipal cp = HttpContext.Current.User as CustomPrincipal;
Response.Write( "Authenticated Identity is: " +
cp.Identity.Name );
Response.Write( "<p>" );
9. 'gregue el siguiente cdigo para probar la pertenencia a funciones de la identidad
autenticada actual$ con el m*todo IsInRole estndar y los m*todos IsIn#n1Roles
y IsIn#llRoles adicionales admitidos por la clase CustomPrincipal.
if ( cp.IsInRole("Senior Manager") )
{
Response.Write( cp.Identity.Name + " is in the " + "Senior Manager Role" );
Response.Write( "<p>" );
}
if ( cp.IsInAnyRoles("Senior Manager", "Manager", "Employee", "Sales") )
{
Response.Write( cp.Identity.Name + " is in one of the specified roles");
Response.Write( "<p>" );
}
if ( cp.IsInAllRoles("Senior Manager", "Manager", "Employee", "Sales") )
{
Response.Write( cp.Identity.Name + " is in ALL of the specified roles" );
K
Response.Write( "<p>" );
}
else
{
Response.Write( cp.Identity.Name +
" is not in ALL of the specified roles" );
Response.Write( "<p>" );
}
if ( cp.IsInRole("Sales") )
Response.Write( "User is in Sales role<p>" );
else
Response.Write( "User is not in Sales role<p>" );
:. En el %xplorador de soluciones$ 1aga clic con el botn secundario en
de'ault.aspx y$ a continuacin$ 1aga clic en %sta"lecer como p6&ina de inicio.
;. En el menL Generar$ 1aga clic en Generar solucin.
A. Presione CTR.O)3 para ejecutar la aplicacin. Puesto que default.aspx est
configurado como la pgina de inicio$ *sta es la pgina que se solicita inicialmente.
J. Cuando se 1aya realizado la redireccin a la pgina de inicio de sesin +porque
inicialmente no tiene un &ale de autenticacin,$ escriba un nombre de usuario en
=ser Name y una contrase@a +cualquiera, en Pass"ord y$ despu*s$ 1aga clic en
.o&on +<niciar sesin,.
K. Confirme que se lle&a a cabo la redireccin a la pgina default.aspx y que se
muestran la identidad de usuario y los detalles de funcin correctos. El usuario es
miembro de las funciones (enior 0anager$ 0anager y Employee$ pero no de la
funcin (ales.

Recursos adicionales
Para obtener ms informacin acerca de la autenticacin basada en formularios$
consulte los siguientes artculos en la seccin Deferencia de esta gua-
E FCmo- =tilizar la autenticacin mediante !ormularios con objetos
8enericPrincipalF
E FCmo- =tilizar la autenticacin mediante !ormularios con 'cti&e .irectoryF
E FCmo- =tilizar la autenticacin mediante !ormularios con (G) (er&er 6HHHF

/H

S-ar putea să vă placă și