2008-11-21 11 views
5

Estoy usando mi propia autenticación personalizada con IIS, y quiero el servidor en cada carga de página (sin importar qué tipo de archivo) para verificar primero la variable Aplicación para ver si el usuario está autenticado y autorizado para ver el sitio . En global.asax esto podría ser:¿Qué alternativas hay para usar global.asax?

void Application_Start(Object Sender, EventArgs e) 
{ 
    if(Application["username"] == null) 
    { 
    Response.redirect("login.aspx"); 
    } 
} 

El problema es que este sitio tiene varias raíces secundarias. Es decir, http://example.com/site1 es un sitio web completamente diferente al http://example.com/site2. Por lo tanto, me gustaría que dicha función Application_Start funcione en site1 pero no afecte a site2.

Si global.asax fue personalizable a nivel de directorio, entonces esto no sería un problema. Pero dado que solo hay un archivo.asax global por servidor , no puedo implementar esta solución.

¿Qué alternativas hay para global.asax? o puede global.asax ser diferente de alguna manera para cada directorio?

Respuesta

9

HttpModules son una alternativa a Global.asax

(ver también https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm
http://codebetter.com/blogs/karlseguin/archive/2006/06/12/146356.aspx)

HttpModules están registrados en web.config; que, convenientemente, es personalizable a nivel de directorio. De modo que cada directorio puede tener su propio conjunto único de módulos (que se heredan en directorios inferiores). Todos los módulos tienen la misma funcionalidad que los encontrados en global.asax.

Básicamente, cada solicitud de página se pasa a través de cada módulo registrado antes de que llegue al código de la página real. Esto ocurre independientemente de qué tipo de petición es:

 
"page.aspx" "page.html" 
    |    | 
( | module 1 | ) 
( | module 2 | ) 
( | module 3 | ) 
    V    V 
(handler 1) (handler 2) 

((una imagen mucho mejor y la descripción se pueden encontrar en https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm))

Así entonces todo lo que necesita hacer es definir su código como una módulo en lugar de en global.asax. Si el usuario no está autenticado, entonces: response.redirect("login.aspx") impedirá que el control llegue al controlador y analice/devuelva/ejecute la página solicitada.

Es un poco más complicado que eso, por lo que se puede encontrar una mejor descripción/tutorial en el sitio web codeguru.

1

Estoy bastante seguro de que su código permitirá el acceso a todo el mundo una vez que inicie sesión una sola persona, probablemente no lo que desea.

Según http://msdn.microsoft.com/en-us/library/ms178473.aspx:

"Se llama cuando se solicita el primer recurso (por ejemplo, una página) en una aplicación ASP.NET El métodoApplication_Start es llamado una sola vez durante el ciclo de vida de. una aplicación "

Además según http://support.microsoft.com/kb/307598#1 " Las variables de estado de la aplicación son, en efecto, variables globales para cada aplicación ASP.NET. "

Le sugiero que utilice la API integrada de Membresía y restrinja el acceso utilizando los archivos web.config.

Si está abierto a usar la API de membresía en lugar de transferir su propio mecanismo de autenticación, puede usar web.config para verificar si un usuario está autorizado para una carpeta en particular. También puede hacer que el usuario simplemente inicie sesión en un sitio y inicie sesión automáticamente en los otros sitios compartiendo tickets de autenticación, siempre que todos estén en el mismo dominio raíz.

Para compartir los vales de autenticación ver: http://msdn.microsoft.com/en-us/library/ms998288.aspx y http://www.netomatix.com/development/singlesignon.aspx

Para saber cómo utilizar el web.config para restringir el acceso: http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=85

0

En realidad creo que sólo hay una global.asax por aplicación asp.net . Si desea que example.com/subsite1 sea una aplicación diferente de example.com/subsite2, puede crear dos aplicaciones diferentes en IIS. Como resultado, se ejecutarán en dominios de aplicación completamente diferentes (aunque pueden estar en el mismo proceso (aspnet_wp.exe o w3wp.exe) e incluso compartir grupos de aplicaciones). Como tal, si son aplicaciones diferentes, también deberían tener archivos global.asax independientes.

Para convertir un directorio en una aplicación. Abra IIS-> Busque el directorio/sub-sitio, haga clic derecho-> Propiedades-> pestaña Directorio de inicio-> haga clic en "Crear".

Para obtener más información sobre dominios de aplicaciones y procesos de trabajo, considere reading this blog entry. Espero que ayude.

Cuestiones relacionadas