ASP.NET MVC、IIS 7.5 - 跨伺服器失去會話(負載平衡)
我們有一個在 3 個 Web 節點上執行的站點。我們正在使用 SQL Server 會話儲存。
我們最近又添加了兩個,結果發現使用者的會話在被發送到其中一台機器時失去了。
我們已經檢查了站點 ID 以及機器驗證密鑰和解密密鑰。
編輯:
我確實忘記提及該機器是農場中現有機器的複製(VMWare)版本。
已解決 - 我們只是擦除了新機器並重新安裝了 Server 08。這個問題的原因仍然未知。
您是否確認機器密鑰正在工作?一種方法是,如果您有表單身份驗證,則可以使用幾行程式碼來嘗試讀取身份驗證 cookie。如果機器密鑰無效,您將無法讀取 cookie,並且 User.Identity.IsAuthenticated 將為 false。SQL 會話狀態也需要機器密鑰,因此這是主要嫌疑人。
下面的一些範常式式碼。
如果您在 machine.config(而不是 web.config)中有您的密鑰,您可能需要驗證您是否更新了正確的文件。如果您同時擁有 .NET 3 和 4,則可能在四個地方都有一個 machine.config 文件。我通常更新所有四個只是為了確定。
C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Config \
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\
另一種遙遠的可能性是您可能還想為機器密鑰散列算法指定 validation=“xxxx” 屬性。在 .NET4 中,預設的散列算法是 SHA256,但在以前的版本中是 SHA1。因此,通常最好將其包含在內,這樣它們都將是相同的。
ASP.NET 4 重大更改 - 預設雜湊算法現在是 HMACSHA256
受保護的配置提供程序。在網路場中共享機器密鑰僅適用於 RsaProtectedConfigurationProvider。如果 web.config 或 machine.config 僅指定 DpapiProtectedConfigurationProvider,它將不起作用:
指定受保護的配置提供程序
http://msdn.microsoft.com/en-us/library/68ze1hb2%28v=VS.100%29.aspx
範例 cookie 驗證程式碼:
if (Request.Cookies[FormsAuthentication.FormsCookieName] != null) { try { FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value); Debug.WriteLine(String.Format("Cookie timeout: {0}, ticket.Expiration.ToString("yyyy-MMM-dd HH:mm:ss"))); } catch (Exception e) { Debug.WriteLine(String.Format("Error reading cookie: {0}", e.ToString())); } } else { Debug.WriteLine("Cookie unavailable"); }