Está en la página 1de 8

Entendiendo el Procesamiento de ASP.

NET e IIS

Nota: La informacin de esta seccin se aplica a Servicios de Internet Information
Server (IIS) 5, en ejecucin en Windows 2000.

Las aplicaciones Web ASP.NET y los servicios Web se procesan mediante cdigo que
se ejecuta en una nica instancia del proceso de trabajo de ASP.NET (aspnet_wp.exe),
aunque en equipos de varios procesadores se pueden configurar varias instancias, una
por procesador.
IIS autentica a los llamadores y crea un testigo de acceso de Windows para el llamador.
Si se habilita el acceso annimo en IIS, IIS crea un testigo de acceso de Windows para
la cuenta de usuario de Internet annimo (normalmente, IUSR_MACHINE).
Las solicitudes de tipos de archivos ASP.NET se controlan mediante una extensin
ISAPI de ASP.NET (aspnet_isapi.dll), que se ejecuta en el espacio de direcciones del
proceso de IIS (inetinfo.exe). Utiliza una canalizacin con nombre para comunicarse con
el proceso de trabajo de ASP.NET, tal y como se muestra en la ilustracin 1. IIS pasa al
proceso de trabajo de ASP.NET el testigo de acceso de Windows que representa al
llamador. El mdulo de autenticacin de Windows de ASP.NET la utiliza para crear un
objeto WindowsPrincipal y el mdulo de autorizacin de archivos de ASP.NET la utiliza
para ejecutar comprobaciones de acceso a Windows para garantizar que el llamador
est autorizado para tener acceso al archivo solicitado.

{Insert figure: REF - IIS and ASP.NET communication.gif}
Ilustracin 1
Comunicacin entre IIS y ASP.NET

Nota: Los testigos de acceso dependen del proceso. Como resultado, la DLL de la
ISAPI de ASP.NET que se ejecuta en inetinfo.exe llama a DuplicateHandle para
duplicar el identificador del testigo en el espacio de direcciones del proceso
aspnet_wp.exe y pasa a continuacin el valor del identificador a travs de la
canalizacin con nombre.

Aislamiento de aplicaciones
Para proporcionar aislamiento se utilizan dominios de aplicacin independientes en el
proceso de trabajo (uno por cada directorio virtual IIS o, en otras palabras, uno por cada
aplicacin Web ASP.NET o servicio Web).
Se contrapone a la tecnologa ASP clsica, donde el nivel de proteccin de la aplicacin
configurado en la metabase IIS determinaba si la aplicacin ASP deba ejecutarse en el
proceso con IIS (inetinfo.exe), fuera del proceso en una instancia dedicada de
Dllhost.exe o en una instancia compartida (agrupada) de Dllhost.exe.

Importante: La configuracin de nivel de aislamiento del proceso en IIS no afecta al
procesamiento de las aplicaciones Web ASP.NET.

La extensin ISAPI de ASP.NET
La extensin ISAPI de ASP.NET (aspnet_isapi.dll) se ejecuta en el espacio de
direcciones del proceso IIS (inetinfo.exe) y reenva las solicitudes de tipos de archivo
ASP.NET al proceso de trabajo de ASP.NET a travs de una canalizacin con nombre.
Los tipos de archivo de ASP.NET se asignan a la extensin ISAPI de ASP.NET mediante
asignaciones definidas en la metabase IIS. Las asignaciones de tipos de archivo de
ASP.NET estndar (.aspx, .asmx, .rem, .soap) se establecen al instalar .NET
Framework.
Para ver asignaciones de aplicacin
1. En el grupo de programas Herramientas administrativas, inicie Servicios de
Internet Information Server.
2. Haga clic con el botn secundario del mouse (ratn) en el sitio Web
predeterminado del equipo servidor Web y, a continuacin, haga clic en
Propiedades.
3. Haga clic en la ficha Directorio principal y, a continuacin, haga clic en
Configuracin.
Se mostrar una lista de asignaciones. Puede ver cules son los tipos de archivo
que estn asignados a Aspnet_isapi.dll.

IIS 6.0 y Windows Server 2003
IIS 6.0 en Windows Server 2003 introducir algunos cambios importantes a la
organizacin del proceso actual.
Podr configurar varios grupos de aplicaciones, a cada uno de los cuales le sirve
una o varias instancias del proceso (w3wp.exe). De esta forma se proporcionar
una mayor tolerancia a errores y se facilitar la administracin, lo que permitir
aislar aplicaciones independientes en procesos independientes.
ASP.NET se integra con el agente de escucha HTTP en modo Kernel de IIS 6.0, lo
que permitir pasar solicitudes directamente del sistema operativo al proceso de
trabajo de ASP.NET.

Ms informacin
Para obtener ms informacin acerca de IIS6 consulte el artculo "IIS 6 Overview" en
TechNet
(http://www.microsoft.com/technet/treeview/default.asp?url=/TechNet/prodtechnol/iis/eval
uate/iis6ovw.asp) (en ingls).
Procesamiento mediante canalizacin de ASP.NET
Los mecanismos de autenticacin y autorizacin de ASP.NET se implementan mediante
objetos de mdulo HTTP, que se invocan como parte del procesamiento mediante
canalizacin de ASP.NET estndar. Cada una de las solicitudes y respuestas Web
pasan a travs de una canalizacin de objetos, tal y como se muestra en la ilustracin 2.

{Insert figure: REF ASPNET Pipeline Processing.gif}
Ilustracin 2
Procesamiento mediante canalizacin de ASP.NET
El modelo de canalizacin de ASP.NET est formado por un objeto HttpApplication,
diversos objetos de mdulo HTTP y un objeto de controlador HTTP, junto con sus
objetos asociados del generador de objetos, que se han omitido en la ilustracin 2 por
cuestiones de claridad. Un objeto HttpRuntime se utiliza al inicio de la secuencia de
procesamiento y un objeto HttpContext se utiliza en todo el ciclo de vida de una solicitud
para proporcionar detalles acerca de la solicitud y la respuesta.
En la siguiente lista se explican las responsabilidades y operaciones que ejecutan los
objetos asociados a la canalizacin de procesamiento HTTP:
Un objeto HttpRuntime examina la solicitud recibida de IIS y la distribuye a una
instancia adecuada del objeto HttpApplication para procesar la solicitud. Hay un
grupo de objetos HttpApplication en cada dominio de aplicacin de
Aspnet_wp.exe. La asignacin es de uno a uno entre dominios de aplicacin,
objetos HttpApplication y directorios virtuales IIS. En otras palabras, ASP.NET
trata cada uno de los directorios virtuales IIS como aplicaciones independientes.

Nota: Hay una instancia de HttpRuntime en cada dominio de aplicacin Web.

Los objetos HttpApplication controlan el procesamiento mediante canalizacin.
Se crea un objeto HttpApplication individual para controlar cada solicitud HTTP
simultnea. Los objetos HttpApplication se agrupan para mejorar el rendimiento.
Los objetos de mdulo HTTP son filtros que procesan mensajes de solicitud y
respuesta HTTP mientras se transmiten a travs de la canalizacin. Puede ver o
modificar el contenido de los mensajes de solicitud y respuesta. Los mdulos
HTTP son clases que implementan IHttpModule.
Los objetos de controlador HTTP son los extremos de las solicitudes HTTP y
proporcionan el procesamiento de solicitudes de determinados tipos de archivo.
Por ejemplo, un controlador procesa solicitudes de archivos *.aspx mientras otro
procesa solicitudes de archivos *.asmx. Se genera el mensaje de respuesta HTTP
y se devuelve desde el controlador HTTP. Los controladores HTTP son clases que
implementan IHttpHandler.
En toda la canalizacin se utiliza un objeto HttpContext para representar la
solicitud y respuesta Web actual. Est disponible para todos los mdulos de la
canalizacin y para el objeto de controlador al final de la canalizacin. El objeto
HttpContext expone diversas propiedades; por ejemplo, la propiedad User que
contiene un objeto IPrincipal que representa al llamador.

Anatoma de una solicitud Web
La biblioteca ISAPI de ASP.NET (Aspnet_isapi.dll) se ejecuta en el espacio de
direcciones del proceso IIS (Inetinfo.exe). Distribuye las solicitudes al objeto
HttpRuntime en el proceso de trabajo de ASP.NET (Aspnet_wp.exe). El siguiente
conjunto de acciones se produce como respuesta a cada solicitud Web que recibe
ASP.NET:
El objeto HttpRuntime examina la solicitud y la reenva a una instancia de un
objeto HttpApplication.
Hay al menos una instancia del objeto HttpApplication por cada dominio de
aplicacin (los objetos se agrupan) y un dominio de aplicacin por cada directorio
virtual IIS. La solicitud inicial de un archivo en un determinado directorio virtual
conlleva la creacin de un dominio de aplicacin y un nuevo objeto
HttpApplication.
Se lee una lista de mdulos HTTP del archivo Machine.config (contenidos en el
elemento <httpModules>). Se pueden agregar al archivo Web.config mdulos
HTTP adicionales para una aplicacin concreta. El elemento <httpModules>
predeterminado en Machine.config se muestra en el siguiente miniprograma de
cdigo.

<httpModules>
<add name="OutputCache"
type="System.Web.Caching.OutputCacheModule"/>
<add name="Session"
type="System.Web.SessionState.SessionStateModule"/>
<add name="WindowsAuthentication"
type="System.Web.Security.WindowsAuthenticationModule"/>
<add name="FormsAuthentication"
type="System.Web.Security.FormsAuthenticationModule"/>
<add name="PassportAuthentication"
type="System.Web.Security.PassportAuthenticationModule"/>
<add name="UrlAuthorization"
type="System.Web.Security.UrlAuthorizationModule"/>
<add name="FileAuthorization"
type="System.Web.Security.FileAuthorizationModule"/>
</httpModules>

Los mdulos de autenticacin enlazan el evento AuthenticateRequest, mientras
que los mdulos de autorizacin enlazan el evento AuthorizeRequest.
La solicitud pasa por cada mdulo de la canalizacin, aunque slo se carga un
nico mdulo de autenticacin. Depende de la configuracin del elemento
<authentication> en el archivo Web.config. Por ejemplo, el elemento
<authentication> siguiente provoca la carga de WindowsAuthenticationModule.

<authentication mode="Windows" />

El mdulo de autenticacin activado es responsable de la creacin de un objeto
IPrincipal y de su almacenamiento en la propiedad HttpContext.User. Es
fundamental, ya que los mdulos de autorizacin indirectos utilizan este objeto
IPrincipal para tomar decisiones de autorizacin.
Si no hay autenticacin (por ejemplo, cuando se habilita el acceso annimo en IIS
y se configura ASP.NET con <authentication mode="None" />), hay un mdulo no
configurado especial que incluye un principal annimo predeterminado en la
propiedad HttpContext.User. Como resultado, HttpContext.User tiene siempre
un valor distinto de NULL tras la autenticacin.
Si implementa un mdulo de autenticacin personalizado, el cdigo del mdulo
personalizado debe crear un objeto IPrincipal y almacenarlo en
HttpContext.User.

Nota: ASP.NET tambin conecta Thread.CurrentPrincipal segn el valor de
HttpContext.User tras el evento AuthenticateRequest.

HttpApplication activa el evento AuthenticateRequest, que puede enlazarse en
global.asax. De esta forma se puede insertar cdigo de procesamiento
personalizado, por ejemplo, para cargar el conjunto de funciones asociadas al
usuario actual. Sin embargo, tenga en cuenta que
WindowsAuthenticationModule lo realiza automticamente. La lista de funciones
se obtiene del conjunto de grupos de Windows a los que pertenece el usuario de
Windows autenticado.
Una vez que el mdulo de autenticacin adecuado finaliza el procesamiento, se
llama a los mdulos de autorizacin si no se ha anulado la solicitud.
Cuando se llama a UrlAuthorizationModule, comprueba la existencia de la
etiqueta <authorization> en Machine.config y Web.config. Si existe, recupera el
objeto IPrincipal de HttpContext.User y comprueba si el usuario est autorizado
para tener acceso al recurso solicitado mediante el verbo especificado (GET,
POST, etc.).
Si el usuario no est autorizado, UrlAuthorizationModule llama a
HttpApplication.CompleteRequest, que anula el procesamiento normal del
mensaje. UrlAuthorizationModule devuelve un cdigo de estado HTTP 401.
A continuacin, se llama a FileAuthorizationModule. Comprueba si el objeto
IIdentity de HttpContext.User.Identity es una instancia de la clase
WindowsIdentity.
Si el objeto IIdentity no es de la clase WindowsIdentity,
FileAuthorizationModule no sigue procesando.
Si existe la clase WindowsIdentity, FileAuthorizationModule llama a la API
AccessCheck (mediante P/Invoke) para ver si el llamador autenticado (cuyo
testigo de acceso ha sido pasado a ASP.NET por IIS y expuesto por el objeto
WindowsIdentity) est autorizado para tener acceso al archivo solicitado. Si el
descriptor de seguridad del archivo contiene al menos una entrada ACE de lectura
en su DACL, la solicitud puede proseguir. De lo contrario,
FileAuthorizationModule llama a HttpApplication.CompleteRequest y devuelve
un cdigo de estado 401.

Procesamiento con autenticacin mediante Formularios
FormsAuthenticationModule se activa cuando se encuentra el siguiente elemento en
Web.config.

<authentication mode="Forms" />

Recuerde que en la autenticacin mediante Formularios se implementa el evento
Application_Authenticate en Global.asax. En la autenticacin mediante Formularios se
produce la siguiente secuencia:
En este cdigo puede crear un objeto IPrincipal y almacenarlo en
HttpContext.User, que suele contener la lista de funciones recuperadas del
almacn de datos personalizado (normalmente una base de datos de SQL Server
o Active Directory). El objeto IPrincipal suele ser una instancia de la clase
GenericPrincipal pero tambin podra ser una clase IPrincipal personalizada.
FormsAuthenticationModule comprueba si se ha creado un objeto IPrincipal. Si
es as, lo utilizan los mdulos de autorizacin indirectos. Si no se ha creado,
FormsAuthenticationModule crea un GenericPrincipal (sin funciones) y lo
almacena en el contexto.
Si no hay informacin de funciones, habr errores en las comprobaciones de
autorizacin (como las peticiones PrincipalPermssion) que soliciten la
pertenencia a una funcin.
UrlAuthorizationModule controla el evento AuthorizeRequest. Sus decisiones
de autorizacin se basan en el objeto IPrincipal contenido en HttpContext.User.

Procesamiento con autenticacin de Windows
WindowsAuthenticationModule se activa cuando se encuentra el siguiente elemento
en Web.config.

<authentication mode="Windows" />

En la autenticacin de Windows se produce la siguiente secuencia:
1. WindowsAuthenticationModule crea un objeto WindowsPrincipal mediante el
testigo de acceso de Windows que IIS pasa a ASP.NET.
2. Utiliza P/Invoke para llamar a las funciones Win32 para obtener la lista de grupos
de Windows a los que pertenece el usuario. Se utilizan para llenar la lista de
funciones WindowsPrincipal.
3. Almacena el objeto WindowsPrincipal en HttpContext.User, para que puedan
utilizarlo los mdulos de autorizacin indirectos.

Control de eventos
El objeto HttpApplication activa el conjunto de eventos que aparecen en la tabla 1.
Cada uno de los mdulos HTTP puede enlazar dichos eventos (proporcionando sus
propios controles de eventos).
Tabla 1: Eventos activados por los objetos HttpApplication

Evento Notas
BeginRequest Se activa antes de iniciar el procesamiento
de la solicitud
AuthenticateRequest Para autenticar al llamador
AuthorizeRequest Para realizar comprobaciones de acceso
ResolveRequestCache Para obtener una respuesta de la cach
AcquireRequestState Para cargar el estado de la sesin
PreRequestHandlerExecute Se activa inmediatamente antes de enviar
la solicitud al objeto de controlador
PostRequestHandlerExecute Se activa inmediatamente despus de
enviar la solicitud al objeto de controlador
ReleaseRequestState Para almacenar el estado de la sesin
UpdateRequestCache Para actualizar la cach de respuesta
EndRequest Se activa tras finalizar el procesamiento
PreSendRequestHeaders Se activa antes de enviar los encabezados
de respuesta almacenados en bfer
PreSendRequestContent Se activa antes de enviar el cuerpo de
respuesta almacenado en bfer


Nota: El controlador HTTP se ejecuta entre los eventos PreRequestHandlerExecute
y PostRequestHandlerExecute.
Los ltimos dos eventos no son deterministas y pueden producirse en cualquier
momento (por ejemplo, como resultado de Response.Flush). Todos los dems
eventos son secuenciales.

No es necesario implementar un mdulo HTTP simplemente para enlazar uno de estos
eventos. Puede agregar controladores de eventos a Global.asax. Adems de los eventos
de la tabla 1 (que pueden enlazarse mediante objetos de mdulo HTTP individuales), el
objeto HttpApplication activa los controladores Application_OnStart y
Application_OnEnd, ya conocidos para los desarrolladores de ASP. Slo pueden
controlarse en Global.asax. Por ltimo, puede implementar adems controladores de
eventos personalizados en Global.asax para los eventos activados por objetos de
mdulo HTTP individuales. Por ejemplo, el mdulo de estado de la sesin activa los
eventos Session_OnStart y Session_OnEnd.
Implementar un mdulo HTTP personalizado
Para crear su propio mdulo HTTP e insertarlo en la canalizacin de
procesamiento de ASP.NET
1. Cree una clase que implemente IHttpModule.
2. Inserte el ensamblado que contiene el mdulo en el subdirectorio \bin de la
aplicacin o instlelo en la cach de ensamblados global.
3. Agregue un elemento <HttpModules> al archivo Web.config de la aplicacin, tal y
como se muestra a continuacin.

<system.web>
<httpModules>
<add name="modulename"
type="namespace.classname,assemblyname" />
</httpModules>
</system.web>


Implementar un controlador HTTP personalizado
Puede que necesite implementar un controlador HTTP personalizado, por ejemplo, para
controlar el procesamiento de archivos con la extensin de archivo .data.
Para implementar un controlador HTTP personalizado
1. Agregue una asignacin a la metabase IIS para asignar la extensin de archivo
.data a la extensin ISAPI de ASP.NET (Aspnet_isapi.dll).
Haga clic con el botn secundario del mouse en el complemento MMC de IIS del
directorio virtual de la aplicacin, haga clic en el botn Configuracin y, a
continuacin, haga clic en Agregar para crear una nueva asignacin de los
archivos .data en C:\Winnt\Microsoft.NET\Framework\v1.0.3705\aspnet_isapi.dll.

Nota: Si ha activado la casilla de verificacin Comprobar si el archivo existe al
agregar la asignacin, el archivo debe existir fsicamente. Normalmente es lo que
se espera, a menos que tenga rutas de acceso virtuales que no estn asignadas a
un archivo fsico. Las rutas de acceso virtuales que terminan en .rem o .soap se
utilizan en .NET Remoting.

2. Cree una clase que implemente IHttpHandler (y opcionalmente
IHttpAsyncHandler si desea controlar solicitudes de forma asncrona).
3. Inserte el ensamblado que contiene el controlador en el subdirectorio \bin de la
aplicacin o instlelo en la cach de ensamblados global.
4. Agregue el controlador a la canalizacin de procesamiento; para ello, agregue una
seccin <httpHandlers> al archivo Web.config de la aplicacin.

<system.web>
<httpHandlers>
<add verb="*" path="*.data" type="namespace.classname, assemblyname" />
</httpHandlers>
</system.web>

También podría gustarte