2009-02-27 9 views
2

J'ai un module HTTP pour gérer l'authentification de Facebook, qui fonctionne bien en mode pipeline classique.IIS - Traitement différent du document par défaut en mode Pipeline intégré?

En mode pipeline intégré, cependant, une requête supplémentaire est transmise pour le document par défaut, ce qui provoque l'échec du module. Nous regardons la demande (de Facebook) pour récupérer et valider l'utilisateur accédant à notre application. La demande initiale s'authentifie correctement, mais je vois une demande deuxième, qui n'a pas les variables de formulaire publiées, et provoque donc l'échec de l'authentification.

En mode pipeline intégré, une requête http pour "/" rendements 2 AuthenticateRequests consécutives:

  1. Une demande où AppRelativeCurrentExecutionFilePath = "~ /"
  2. Une demande où AppRelativeCurrentExecutionFilePath = « ~/default .aspx "

Cette deuxième requête perd toutes les valeurs de formulaire, de sorte qu'elle ne parvient pas à s'authentifier. En mode classique, cette deuxième requête est la seule qui arrive, et elle préserve les valeurs du formulaire.

Des idées que se passe-t-il ici?

MISE À JOUR: Voici une image de la trace provenant des notifications de module dans IIS. Notez que mon module, FBAuth, voit AUTHENTICATE_REQUEST plusieurs fois (je m'attendrais à 2 - un pour l'authentification et un pour postauthenticate, mais j'en ai 4).

Events raised multiple times

Je commence à croire que cela a quelque chose à voir avec la configuration du module/filtre parce que je l'ai trouvé un (Vista), à exécuter le même code qui ne se déclenche pas à plusieurs reprises ces événements - il se comporte comme prévu. Je travaille à travers essayer de comprendre ce que la différence pourrait être ...

Merci! Tom

Répondre

0

DefaultHttpHandler est pas pris en charge, donc des applications reposant sur des sous-classes de DefaultHttpHandler ne pourra pas pour servir les demandes Si votre application utilise DefaultHttpHandler ou gestionnaires qui dérivent de DefaultHttpHandler, il ne sera pas fonctionner correctement. Dans mode intégré, les gestionnaires dérivés de DefaultHttpHandler ne pourront pas transmettre la demande à IIS pour le traitement , et servir à la place la ressource demandée en tant que fichier statique. Le mode intégré permet aux modules ASP.NET de s'exécuter pour toutes les demandes sans nécessitant l'utilisation de DefaultHttpHandler.

Solution

Modifier votre application à utiliser modules pour effectuer la demande de traitement pour toutes les demandes, au lieu d'utiliser la cartographie générique pour carte ASP.NET à toutes les demandes puis en utilisant DefaultHttpHandler gestionnaires dérivés de passe la demande à IIS.

Hmmm, ou cela pourrait être le problème.

modules ASP.NET à la demande début étapes de traitement verront demandes qui ont éventuellement été rejetées par IIS avant d'entrer dans ASP.NET, qui comprend des modules en cours d'exécution dans BeginRequest voient des demandes anonymes pour les ressources qui nécessitent authentification Les modules ASP.NET peuvent exécuter dans toutes les étapes de pipeline disponibles pour les modules IIS natifs. Pour cette raison, demande que peut avoir été précédemment rejetée dans la phase d'authentification (comme des demandes anonymes pour des ressources qui nécessitent une authentification) ou d'autres étapes avant d'entrer dans ASP.NET peuvent modules ASP.NET exécution. Ce comportement est par conception afin de permettre aux modules ASP.NET d'étendre IIS dans toutes les étapes de traitement de demande .

Solution

Modifier le code d'application pour éviter des problèmes spécifiques à l'application qui découlent de voir les demandes qui peuvent être rejetées plus tard lors de la demande de traitement . Cela peut impliquer de modifier modules pour vous abonner au pipeline événements qui sont soulevées plus tard pendant le traitement de la demande . http://learn.iis.net/page.aspx/381/aspnet-20-breaking-changes-on-iis-70/

+0

Excellent lien, bien que je ne crois pas que je rencontre un de ces problèmes. Je travaille avec un module, pas un gestionnaire, et l'événement que je surveille est l'événement d'authentification. Bien que ce soit possible, cela explique pourquoi je le vois deux fois, cela n'explique pas pourquoi l'info http est perdue (par exemple vars). –

1

Avez-vous trouvé une solution? Le mien était d'ajouter le code suivant à la fin de Application_BeginRequest:

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