2013-03-07 4 views
1

Я тестирую WebRole с экземпляры кратных в Windows Azure для проверки балансировки нагрузки. Код, который я должен аутентифицировать пользователей, является следующим:Azure: Объект HttpContext.Current.Session используется всеми экземплярами WebRole?

protected void Application_AcquireRequestState(Object sender, EventArgs e) 
    { 
     HttpCookie authCookie = 
      HttpContext.Current.Request.Cookies 
       [FormsAuthentication.FormsCookieName]; 

     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = 
       FormsAuthentication.Decrypt(authCookie.Value); 

      SetUserCredentials(authTicket.Name, authTicket.UserData); 
     } 
    } 

    private void SetUserCredentials(string userName, string securityConfig) 
    { 
     Credentials auth = GetSessionCredentials(); 

     if (auth == null && HttpContext.Current.Session != null) 
     { 
      log.DebugFormat("Credentials not available in session variable. Building credentials to __SessionSID."); 

      SID sid = 
       AuthenticationHelper.Get(). 
        GetAuthenticatedSIDFromName(userName, securityConfig); 

      if (sid == null) 
      { 
       FormsAuthentication.SignOut(); 
       FormsAuthentication.RedirectToLoginPage(); 
       return; 
      } 

      auth = new Credentials(sid); 

      if (HttpContext.Current.Session != null) 
      { 
       log.DebugFormat("Saving credentials in a session variable"); 
       HttpContext.Current.Session.Add("__SessionSID", auth); 
      } 
     } 

     log.DebugFormat("Time setting user credentials for user: {0} {1}ms", userName, Environment.TickCount - ini); 
    } 

    private Credentials GetSessionCredentials() 
    { 
     if (HttpContext.Current == null) 
      return null; 
     if (HttpContext.Current.Session == null) 
      return null; 

     return HttpContext.Current.Session["__SessionSID"] as Credentials; 
    } 

Вот мои вопросы. Я проверил WebRole с двумя примерами в Azure:

  • Предположим, что я вхожу в систему и экземпляр WebRole A, выполняет аутентификацию.
  • Когда я делаю новые запросы, и запрос отправляется на экземпляр WebRole B, authTicket в Current.Request.Cookies и HttpContext.Current.Session["__SessionSID"] были в порядке.

Кто-то может это объяснить? Я провел сеанс между всеми экземплярами WebRole?

ответ

2

Все это относится к конфигурации Session State Provider.

Как правило, вам нужно будет реализовать пользовательский поставщик (обычно это кэш Windows Azure или SQL Azure), чтобы разрешить сохраняемые данные сеанса в нескольких экземплярах.

http://msdn.microsoft.com/en-us/library/windowsazure/gg185668.aspx

После входа в систему (не важно, на какой экземпляр) вы получаете печенье с SessionID в нем.

Другие запросы к любому экземпляру заставят приложение запрашивать данные сеанса у настроенного провайдера.

+0

Но код, который я вставил выше, работает без каких-либо пользовательских поставщиков. Мой оригинальный вопрос был почему? –

+1

Ваш код проверяет, что сеанс не является нулевым (что не должно быть независимо от состояния сеанса). Вы также добавляете некоторые значения в дату сеанса, но вы не проверяете/не регистрируете/не сравниваете их нигде позже, чтобы убедиться, что вы получаете одинаковое значение в разных экземплярах. – haim770

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