2009-02-27 13 views
2

Ich habe ein HTTP-Modul zur Authentifizierung von Facebook, die im klassischen Pipeline-Modus funktioniert.IIS - Unterschiedliche Verarbeitung von Standarddokument im integrierten Pipeline-Modus?

Im integrierten Pipeline-Modus sehe ich jedoch eine zusätzliche Anforderung für das Standarddokument, wodurch das Modul fehlschlägt. Wir betrachten die Anfrage (von Facebook), um den Benutzer, der auf unsere App zugreift, abzurufen und zu validieren. Die erste Anfrage authentifiziert sich in Ordnung, aber dann sehe ich eine zweite Anfrage, die die geposteten Formularvariablen nicht enthält und somit die Authentifizierung fehlschlägt.

In integrierten Pipelinemodus, eine HTTP-Anforderung für die "/" ergibt 2 AuthenticateRequests in Folge:

  1. Eine Anforderung, wo AppRelativeCurrentExecutionFilePath = "~ /"
  2. Eine Anforderung, wo AppRelativeCurrentExecutionFilePath = „~/default .aspx "

Diese zweite Anforderung verliert alle Formularwerte, so dass es sich nicht authentifizieren kann. Im klassischen Modus ist diese zweite Anforderung die einzige, und die Formularwerte bleiben erhalten.

Irgendwelche Ideen, was hier vor sich geht?

UPDATE: Hier ist ein Bild der Ablaufverfolgung von Modulbenachrichtigungen in IIS. Beachten Sie, dass mein Modul, FBAuth, AUTHENTICATE_REQUEST mehrere Male sieht (ich erwarte 2 - 1 für die Authentifizierung und 1 für postauthenticate, aber ich bekomme 4).

Events raised multiple times

Ich beginne das etwas mit Modul/Filterkonfiguration zu tun hat, zu glauben, weil ich eine (Vista) Box ausgeführt werden, den gleichen Code gefunden habe, die diese Ereignisse nicht wiederholt Feuer - es verhält sich wie erwartet. Ich arbeite durch den Versuch herauszufinden, was der Unterschied sein könnte ...

Vielen Dank! Tom

Antwort

0

Defaulthttp nicht unterstützt wird, so unter Berufung Anwendungen auf Unterklassen von Defaulthttp nicht in der Lage Anfragen zu bedienen sein werden, wenn Ihre Anwendung Defaulthttp oder Handler verwendet , die von Defaulthttp ableiten, wird es nicht Funktion korrekt. In Integrierter Modus, Handler von abgeleitet DefaultHttpHandler kann nicht übergeben Sie die Anfrage zurück an IIS für Verarbeitung, und dienen stattdessen die angeforderte Ressource als statische Datei. Im integrierten Modus können ASP.NET-Module für alle Anforderungen ohne ausgeführt werden, die die Verwendung von DefaultHttpHandler erfordern.

Umgehung

Ändern Sie Ihre Anwendung Module verwenden Anforderungsverarbeitung für alle Anforderungen zu erfüllen, anstelle der Verwendung von Wildcard-Mapping ASP.NET für alle Anfragen zu erfassen und dann mit Defaulthttp abgeleitet Handler Pass die Anfrage zurück an IIS.

Hmmm, oder das könnte das Problem sein.

ASP.NET Module in frühen Anfrage Verarbeitungsstufen werden sehen, Anfragen , die zuvor von IIS Eingabe ASP.NET vor abgelehnt worden sein, die Beginrequest sehen anonyme Anforderungen für Ressourcen ausgeführt Module enthält, die erfordern Authentifizierung ASP.NET-Module können in allen Pipeline-Stufen ausgeführt werden, die für native IIS-Module verfügbar sind. Aufgrund dieser anfordert, dass zuvor in die Authentifizierungsstufe (wie anonyme Anforderungen für Ressourcen, die eine Authentifizierung erfordern ) abgewiesen worden sein können oder andere Stufen vor ASP.NET kann Lauf ASP.NET Module Eingabe. Dieses Verhalten ist von Entwurf, um ASP.NET Module IIS in alle Anforderung Verarbeitungsstufen erweitern zu ermöglichen.

Umgehung

ändern Anwendungscode alle anwendungsspezifische Probleme zu vermeiden, die nicht sehen Anfragen entstehen die während Anfrage Verarbeitung später abgelehnt werden. Dies kann beinhalten, dass Module geändert werden, um Pipeline-Ereignisse zu abonnieren, die später während Anfrageverarbeitung ausgelöst werden. http://learn.iis.net/page.aspx/381/aspnet-20-breaking-changes-on-iis-70/

+0

Great Link, obwohl ich glaube nicht, dass ich irgendwelche dieser Probleme begegnen. Ich arbeite mit einem Modul, nicht mit einem Handler, und das von mir überwachte Ereignis ist das Authentifizierungsereignis. Obwohl es möglich ist, dass dies erklärt, warum ich es zweimal sehe, erklärt es nicht, warum die http-Informationen verloren gehen (zB form vars). –

1

Haben Sie eine Lösung gefunden? Mein war, den folgenden Code am Ende von Application_BeginRequest hinzuzufügen:

if (Request.RawUrl.TrimEnd('/') == HostingEnvironment.ApplicationVirtualPath.TrimEnd('/')) 
    Server.Transfer(Request.RawUrl+"Default.aspx", true);