2008-11-21 4 views
5

J'utilise ma propre authentification personnalisée avec IIS, et je veux que le serveur chaque chargement de page (quel que soit le type de fichier) d'abord vérifier la variable d'application pour voir si l'utilisateur est authentifié et autorisé à voir le site . En global.asax cela pourrait être:quelles sont les alternatives à l'utilisation de global.asax?

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

Le problème est que ce site a plusieurs sous-racines. C'est, http://example.com/site1 est un site Web complètement différent de http://example.com/site2. Par conséquent, je voudrais que la fonction Application_Start fonctionne sur site1 mais n'affecte pas site2.

Si global.asax était personnalisable au niveau du répertoire, cela ne poserait aucun problème. Mais puisqu'il n'y a qu'un global.asax par serveur je ne peux pas implémenter cette solution.

Quelles sont les alternatives à global.asax? ou global.asax peut-il être différent d'une manière ou d'une autre pour chaque répertoire?

Répondre

9

HttpModules sont une alternative aux Global.asax

(voir aussi 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 sont enregistrés dans web.config; ce qui, commodément, est personnalisable au niveau du répertoire. Ainsi, chaque répertoire peut avoir son propre ensemble de modules (hérités dans les répertoires inférieurs). Tous les modules ont la même fonctionnalité que ceux trouvés dans global.asax.

Fondamentalement, chaque demande de page est passée par tous les modules enregistrés avant même d'arriver au code de la page elle-même. Cela se produit peu importe le type de demande, il est:

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

((une bien meilleure image et la description se trouvent à https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm))

donc tout ce que vous devez faire est de définir votre code comme module au lieu de dans global.asax. Si l'utilisateur n'est pas authentifié, alors: response.redirect("login.aspx") empêchera le contrôle d'atteindre le gestionnaire et d'analyser/retourner/exécuter la page demandée.

C'est un peu plus compliqué que cela, donc une meilleure description/tutoriel peut être trouvé sur le site web de codeguru.

1

Je suis à peu près sûr que votre code va autoriser l'accès à tout le monde une fois qu'une seule personne se connecte - probablement pas ce que vous voulez.

Selon http://msdn.microsoft.com/en-us/library/ms178473.aspx:

« Appelée lorsque la première ressource (par exemple une page) dans une application ASP.NET est demandée La méthode Application_Start est appelé une seule fois au cours du cycle de vie. une application "

En outre selon http://support.microsoft.com/kb/307598#1 " Les variables d'état d'application sont, en effet, des variables globales pour chaque application ASP.NET. "

Je vous suggère d'utiliser l'API Membership intégrée et de restreindre l'accès à l'aide des fichiers web.config.

Si vous êtes ouvert à l'utilisation de l'API Membership plutôt qu'à l'exécution de votre propre mécanisme d'authentification, vous pouvez utiliser web.config pour vérifier si un utilisateur est autorisé pour un dossier particulier. Vous pouvez également avoir simplement l'utilisateur se connecter sur un site et être automatiquement connecté aux autres sites en partageant des tickets d'authentification - à condition qu'ils soient tous sur le même domaine racine.

Pour partager les tickets d'authentification voir: http://msdn.microsoft.com/en-us/library/ms998288.aspx et http://www.netomatix.com/development/singlesignon.aspx

Pour savoir comment utiliser le web.config pour restreindre l'accès: http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=85

0

En fait, je crois qu'il ya un seul global.asax par application asp.net . Si vous souhaitez que example.com/subsite1 soit une application différente de example.com/subsite2, vous pouvez créer deux applications différentes dans IIS. En conséquence, ils fonctionneront dans des domaines d'application entièrement différents (bien qu'ils puissent être dans le même processus (aspnet_wp.exe ou w3wp.exe) et même partager des pools d'applications). En tant que tel, si elles sont différentes applications, ils devraient également avoir des fichiers indépendants global.asax.

Pour transformer un répertoire en application. Ouvrir IIS-> Trouver le répertoire/sous-site, clic droit-> Propriétés-> onglet Répertoire de base-> Cliquez sur "Créer".

Pour plus d'informations sur les domaines d'application et les processus de travail, consultez le document reading this blog entry. J'espère que cela pourra aider.

Questions connexes