2008-11-21 7 views
5

Ich verwende meine eigene benutzerdefinierte Authentifizierung mit IIS, und ich möchte den Server unter alle Seite laden (unabhängig von der Art der Datei) zuerst die Application-Variable zu überprüfen, ob der Benutzer authentifiziert und berechtigt ist, die Website zu sehen . In global.asax könnte das sein:Welche Alternativen gibt es für die Verwendung von global.asax?

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

Das Problem ist, dass diese Website mehrere Unterwurzeln hat. Das heißt, http://example.com/site1 ist eine komplett andere Website als http://example.com/site2. Daher möchte ich, dass die Application_Start-Funktion auf site1 funktioniert, aber nicht auf site2.

Wenn global.asax auf Verzeichnisebene angepasst werden konnte, wäre das kein Problem. Aber da es nur einen global.asax pro Server gibt, kann ich diese Lösung nicht implementieren.

Welche Alternativen gibt es für global.asax? oder kann global.asax irgendwie für jedes Verzeichnis unterschiedlich sein?

Antwort

9

Httpmodules sind eine Alternative in web.config

Httpmodules sind eingetragene

(auch 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 sehen) zu Global.asax; was ist bequem auf Verzeichnis-Ebene anpassen. So kann jedes Verzeichnis seinen eigenen eindeutigen Satz von Modulen haben (die in unteren Verzeichnissen vererbt werden). Alle Module haben die gleiche Funktionalität wie in global.asax.

Grundsätzlich wird jede Seitenanforderung durch alle registrierte Modul übergeben, bevor es jemals den eigentlichen Seitencode selbst erreicht. Dies geschieht unabhängig davon, welche Art von Anfrage es ist:

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

So ((ein viel besseres Bild und Beschreibung finden Sie unter https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm) gefunden werden), dann alles, was Sie tun müssen, ist Ihr Code als definieren Modul statt in global.asax. Wenn der Benutzer nicht authentifiziert wird, dann: response.redirect("login.aspx") wird die Steuerung daran hindern, jemals den Handler zu erreichen und die angeforderte Seite zu analysieren/zurückzugeben/auszuführen.

Es ist ein wenig komplizierter als das, so dass eine bessere Beschreibung/Tutorial auf der Codeguru-Website gefunden werden kann.

1

Ich bin mir ziemlich sicher, dass Ihr Code den Zugriff auf alle ermöglicht, sobald sich eine einzelne Person anmeldet - wahrscheinlich nicht das, was Sie wollen.

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

„aufgerufen, wenn die erste Ressource (wie etwa einer Seite) in einer ASP.NET-Anwendung angefordert Die Application_Start Methode ist nur einmal während des gesamten Lebenszyklus genannt. Eine Anwendung "

Darüber hinaus nach http://support.microsoft.com/kb/307598#1 " Anwendungsstatusvariablen sind in der Tat globale Variablen für jede ASP.NET-Anwendung. "

Ich würde vorschlagen, dass Sie die integrierte Mitgliedschaft-API verwenden und den Zugriff über die web.config-Dateien einschränken.

Wenn Sie für die Verwendung der Mitgliedschafts-API offen sind, statt Ihren eigenen Authentifizierungsmechanismus zu rollen, können Sie mit der Datei web.config prüfen, ob ein Benutzer für einen bestimmten Ordner autorisiert ist. Sie können den Benutzer auch relativ einfach dazu veranlassen, sich bei einer Site anzumelden und sich automatisch bei den anderen Sites anzumelden, indem er Authentifizierungstickets teilt - vorausgesetzt, sie befinden sich alle in der gleichen Stammdomäne.

Für Authentifizierungstickets teilen sehen: http://msdn.microsoft.com/en-us/library/ms998288.aspx und http://www.netomatix.com/development/singlesignon.aspx

Wie Sie die web.config verwenden, um Zugang zu beschränken: http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=85

0

Eigentlich glaube ich, es gibt nur eine global.asax pro asp.net Anwendung . Wenn example.com/subsite1 eine andere Anwendung als example.com/subsite2 sein soll, können Sie zwei verschiedene Anwendungen in IIS erstellen. Daher werden sie in völlig anderen Anwendungsdomänen ausgeführt (obwohl sie sich möglicherweise im selben Prozess befinden (aspnet_wp.exe oder w3wp.exe) und sogar Anwendungspools teilen). Als solche sollten sie auch unabhängige global.asax-Dateien haben.

Um ein Verzeichnis in eine Anwendung zu verwandeln. Öffnen Sie IIS-> Suchen Sie das Verzeichnis/Unter-Site, Rechtsklick-> Eigenschaften-> Home-Verzeichnis-Registerkarte-> Klicken Sie auf "Erstellen".

Weitere Informationen zu Anwendungsdomänen und Arbeitsprozessen finden Sie in reading this blog entry. Ich hoffe, das hilft.