2010-11-25 8 views
0

Je veux gérer mes cookies auth similaires à http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/Asp.Net mvc - l'accès à conteneur IoC de Session_Start

Je voudrais vérifier le cookie lors du démarrage de la session, l'utilisateur auth s'il y a un et l'échanger pour un nouveau au début de chaque nouvelle session. J'aimerais aussi en créer un si aucun n'existe. Ceci permet de prendre en charge la fonctionnalité de type "remember me", similaire au fonctionnement de SO. Pour ce faire, je dois pouvoir extraire des services du conteneur à partir de la méthode Session_Start dans global.asax. Lors du débogage de l'application, je passe par la méthode Application_Start où le conteneur est construit. Tout se passe bien et la propriété Container de global.asax est créée. Mais quand j'entre dans le Session_Start - le conteneur est nul.

Est-ce qu'il se passe quelque chose que je ne connais pas? Y a-t-il une meilleure façon de faire cela?

protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      RegisterGlobalFilters(GlobalFilters.Filters); 
      RegisterRoutes(RouteTable.Routes); 

      Container = new WindsorContainer().AddFacility<WcfFacility>() 
       .Install(Configuration.FromXmlFile("Configuration\\Windsor.config")) 
       .Install(FromAssembly.InDirectory(new AssemblyFilter(HttpRuntime.BinDirectory, "SonaTribe*.dll"))); 


     } 

     /// <summary> 
     /// See http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/ 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     protected void Session_Start(object sender, EventArgs e) 
     { 
      if (Container != null) 
      { 
       var accountService = Container.Resolve<IAccountService>(); 
       var logger = Container.Resolve<ILogger>(); 
       var forms = Container.Resolve<IFormsAuthentication>(); 

       // if there is a cookie 
       if (Context.Request.Cookies["user-id"] != null) 
       { 
        try 
        { 
         //get the new cookie key from the server 
         var newUserSessionResponse = accountService.RegisterNewUserSession(new RegisterNewUserSessionRequest 
         { 
          SessionId = Context.Request.Cookies["user-id"].Value 
         }); 

         if (newUserSessionResponse.Success) 
         { 
          //do something 
         } 
         else 
         { 
          logger.Info("Failed attaching the user to the session", newUserSessionResponse.Message); 
         } 
        } 
        catch (Exception exc) 
        { 
         logger.Error("Failed attaching the user to the session", exc); 
        } 
       } 
       else 
       { 
        //new user: 
        //do things 
       } 
      } 
     } 

Merci

w: //

+0

Quel * conteneur * utilisez-vous? –

+0

Ajoutez une petite source pour nous aider à comprendre ce que vous faites dans ces méthodes. –

+0

comment stockez-vous le conteneur, puis en le tirant dans Session_Start()? –

Répondre

0

Lors de l'implémentation IContainerAccessor il est pratique courante pour stocker le récipient comme une variable statique de la HttpApplication globale. Voir http://hammett.castleproject.org/?p=233 pour référence.

Si vous n'utilisez pas de variable statique, le conteneur sera perdu lorsque l'exécution ASP.NET éliminera HttpApplication (le moteur d'exécution conserve en interne un pool d'instances HttpApplication).

0

Move (la déclaration de) conteneur dans une classe statique et assurez-vous qu'il (Container) est statique.

+0

J'ai essayé ceci et pendant que je peux maintenant accéder au conteneur à partir de la méthode session_start - je suis sûr qu'il doit y avoir des connotations négatives liées à rendre le conteneur statique ? – iwayneo