2014-01-30 24 views
5

Ich habe eine Anwendung, die in asp.net geschrieben ist und ich habe einige klassische ASP-Seiten in die Website integriert. Die Site verwendet die Windows-Authentifizierung. Da ich ASP-Seiten mit Rollen nicht verwalten kann, habe ich ein benutzerdefiniertes HttpModule geschrieben, um zu überprüfen, ob ein Benutzer Berechtigungen zum Anzeigen dieser Seiten hat, andernfalls wird auf eine Seite "Zugriff verweigert" umgeleitet. Das Hauptproblem ist, dass die Anwendung im "klassischen Modus" auf IIS7 ausgeführt werden muss. Mein Modul arbeitet im integrierten Modus, aber nicht im klassischen Modus. Gibt es einen Grund, warum dieser Code nicht auch im klassischen Modus funktionieren sollte? Danke im Voraus. HierBenutzerdefinierte HttpModule arbeiten in IIS7 integriert, aber nicht im klassischen Modus

ist der Code für das Modul, es ist ziemlich einfach:

public class MyModule: IHttpModule 
{ 
    public void Init(HttpApplication application) 
    { 
     application.PostAuthenticateRequest += new EventHandler(Application_PostAuthenticateRequest); 
    } 
    void Application_PostAuthenticateRequest(object source, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)source; 
     HttpContext context = ((HttpApplication)source).Context; 

     if (context.Request.RawUrl.Contains("/protected-subfolder/")) 
     { 
      // gets user from windows authentication 
      string currentUser = Convert.ToString(context.User.Identity.Name); 

      if (!isAdmin(currentUser)) 
      { 
       //deny access 
       (context.Response).Redirect(VirtualPathUtility.ToAbsolute("~/AccessDenied.aspx")); 
      } 
     } 
    } 

public void Dispose(){ } 

Hier ist die Einstellung in web.config für klassischen Modus (nicht funktioniert):

<configuration> 
    <system.web> 
     <httpModules> 
      <add name="MyModule" type="MyModule" /> 
     </httpModules> 
    </system.web> 
</configuration> 

Und die Einstellung für integrierter Modus (funktioniert):

<configuration> 
    <system.webServer> 
     <modules> 
      <add name="MyModule" type="MyModule"/> 
     </modules> 
     <validation validateIntegratedModeConfiguration="false" /> 
    </system.webServer> 
</configuration> 
+0

Aktivieren Sie fehlgeschlagene Anforderungsverfolgung, und Sie erhalten einen besseren Überblick darüber, was passiert. Siehe http://www.iis.net/learn/troubleshoot/using-failed-request-tracing/troubleshooting-failed-requests-using-tracing-in-iis – x0n

+0

Ich habe tatsächlich Failed Request Tracing aktiviert - das Problem ist, dass die Die Anfrage scheitert nicht, aber der Benutzer kann direkt auf die Seite gehen, auf die er/sie nicht zugreifen darf. Dies scheint zu bedeuten, dass das httpmodul überhaupt nicht läuft. – lem

+0

Wenn Sie ein httpModule wie folgt hinzufügen, ist es auch das letzte Modul, das ausgeführt wird. Dies könnte ein Problem sein. Sie können sich die geerbten Module aus der systemweiten web.config und dann in Ihrer Konfiguration ansehen, um sicherzustellen, dass Ihre erste in der Liste ist, und fügen Sie dann die aus dem System web.config hinzugefügten zurück. – x0n

Antwort

2

Im integrierten Modus ermöglichen IIS App-Pools Any Anforderungs-URL, um in die ASP.NET-ISAPI zu gelangen. Im klassischen Modus benötigen Sie jedoch eine ISAPI eines Drittanbieters, oder die Anforderung wird direkt an die Seite gesendet.

In integriert, wird das Modul überprüft vor dem eigentlichen Inhalt der Anfrage.

SO:

  1. Integrated Mode: http://www.yoursite.com/myfile.html erste in http-Module und global.asax konfiguriert Ihre HTTP-Module und Strecken geht durch (Ihr Request.Url sollte die URL oben haben)

  2. Klassik Modus: http://www.yoursite.com/myfile.html überprüft, ob es tatsächlich eine Datei namens myfile.html gibt, und wenn nicht, dann geht es auf eine 404-Seite. UNBEDINGT haben Sie ein benutzerdefiniertes URLRewrite-Modul.

Hoffe das hilft dir.