0

我們有一個Web角色,它曾經在單個實例中運行一段時間。爲了應付更高的負載(並獲得更好的SLA),我們目前正在將角色遷移以支持多個實例。AzPro Session Table在AspProvider的TableStorageSessionStateProvider中保持爲空

該角色使用表單身份驗證(使用自定義成員資格提供程序),我們的理解是我們必須在實例之間啓用某種共享會話狀態,因此如果用戶登錄實例1並獲取他的.ASPXAUTH cookie,那麼實例2知道這個cookie。

我們這樣做了,目前角色正在兩個實例上運行,並且一切正常。我們測試了用戶保持登錄狀態,即使他的請求是在他登錄的其他實例上處理的。如果用戶未登錄,訪問將被拒絕。

我們還檢查是否TableStorageSessionStateProvider在Azure的表存儲帳戶創建一個表,而事實上,有一個表SessionsPartitionKeyRowKeyTimestamp列。

但令我們驚訝的是,Sessions表格始終保持爲空。無論登錄多少用戶,表格中都沒有數據。

這些實例如何不通過Sessions表進行通信?

回答

2

你混淆這裏有兩個不同的東西:認證會話狀態

的確,爲了使用具有多個實例的會話狀態,您需要共享存儲(InProc不起作用)。在這種情況下,TableStorageSessionStateProvider可以工作,因爲所有實例都可以訪問此處存儲的會話數據。會話狀態用於在用戶的當前會話中存儲某些內容,如購物車。你可以這樣稱呼它:Session["UserShoppingCart"] = shoppingCart;

但是你在你的問題中描述的內容與會話狀態無關,這都與表單身份驗證有關。當你在實例1上進行身份驗證時,你會得到一張票(存儲在.ASPXAUTH cookie中)。這張票是加密和簽名,幷包含基本信息,如您的用戶名,到期時間,自定義用戶數據......

既然您有多個實例,它可能是下一個請求讓你在實例2。問題是,實例如何交流? 那麼,他們不。每當請求開始時,在它到達您的頁面或您的控制器之前,FormsAuthenticationHttpModule會啓動並查找.ASPXAUTH cookie。它檢查簽名,解密它,然後用cookie中的信息(票據)填充HttpContext.Current.User。

實例之間的唯一鏈接是machineKey(用於加密/解密/簽名/驗證cookie)。無論何時在Windows Azure中部署多個實例,結構控制器都會確保all instances get the same machineKey。這樣,實例2將能夠解密和驗證實例1加密和簽名的票證。

+0

謝謝,這解釋了一切! – cheeesus