2013-03-07 57 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; 
    } 

這裏是我的問題。我使用Azure中的兩個實例測試了WebRole:

  • 假設我登錄並且WebRole實例A執行身份驗證。
  • 當我發出新的請求,並且請求轉到WebRole實例B時,Current.Request.CookiesHttpContext.Current.Session["__SessionSID"]中的authTicket正常。

有人能解釋嗎?我在所有WebRole實例之間共享會話?

回答

2

這一切都歸結於Session State Provider配置。

通常情況下,您必須實現自定義提供程序(通常是Windows Azure緩存或SQL Azure)以允許跨多個實例保留會話數據。

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

一旦登錄(無論哪個實例)你在它收到一個cookie用的SessionID。

對任何實例的進一步請求將導致應用程序從配置的提供程序請求您的會話數據。

+0

但我粘貼上面的代碼,它的工作沒有實現任何自定義提供程序。我原來的問題是爲什麼? – 2013-03-07 12:58:33

+1

您的代碼只檢查會話是否爲空(不應該與會話狀態無關)。 您還在會話日期中添加了一些值,但您不會稍後檢查/記錄/比較它們以驗證您是否跨實例獲得相同的值。 – haim770 2013-03-07 13:01:36