2010-11-25 4 views
0

Я хочу управлять своим AUTH печеньем, аналогичных http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/Asp.Net MVC - доступ к IoC контейнера из session_start

Я хотел бы, чтобы проверить кук на начале сеанса аутентификации пользователя, если есть один и обменять его на новый в начале каждого нового сеанса. Я также хотел бы создать один, если он не существует.

Это должно позаботиться о функциональности типа «помнить меня» - подобно тому, как работает SO.

Для этого мне нужно иметь возможность извлекать службы из контейнера из метода Session_Start в global.asax. При отладке приложения я выполняю метод Application_Start, где сконструирован контейнер. Все идет хорошо, и создается свойство Container для global.asax. Но когда я вхожу в Session_Start, Контейнер имеет значение NULL.

Есть ли что-то, что я не знаю? Есть ли лучший способ сделать это?

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 
       } 
      } 
     } 

Благодаря

ш: //

+0

Какой * контейнер * вы используете? – 2010-11-25 18:09:33

+0

Добавьте источник, который поможет нам понять, что вы делаете в этих методах. – 2010-11-25 18:12:24

ответ

0

При внедрении IContainerAccessor стандартная практика хранения контейнера как статической переменной глобальной HttpApplication. См. http://hammett.castleproject.org/?p=233 для справки.

Если вы не используете статическую переменную, контейнер будет потерян, когда среда выполнения ASP.NET будет использовать HttpApplication (внутренняя среда выполнения поддерживает пул экземпляров HttpApplication).

0

Move (декларация) Container в статический класс и убедитесь, что он (контейнер) является статическим.

Смежные вопросы