Sunteți pe pagina 1din 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
BeginRequest AuthenticateRequest AuthorizeRequest ResolveRequestCache AcquireRequestState PreRequestHandlerExecute PostRequestHandlerExecute ReleaseRequestState UpdateRequestCache EndRequest PreSendRequestHeaders PreSendRequestContent

Notas
Se activa antes de iniciar el procesamiento de la solicitud Para autenticar al llamador Para realizar comprobaciones de acceso Para obtener una respuesta de la cach Para cargar el estado de la sesin Se activa inmediatamente antes de enviar la solicitud al objeto de controlador Se activa inmediatamente despus de enviar la solicitud al objeto de controlador Para almacenar el estado de la sesin Para actualizar la cach de respuesta Se activa tras finalizar el procesamiento Se activa antes de enviar los encabezados de respuesta almacenados en bfer 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>