對於ASPNET Forms驗證想必大家都非常的熟悉然而在控制用戶的(過期時間)expired time的時候你是否遇到過一些奇怪的現象呢?雖說只是一個小小的cookie但是其中可能有很多的東西你都不知道今天我將和大家詳細討論一下cookie的注意點
在ASPNET 的Forms驗證中通常我們會使用ASPNET自帶的Login控件來進行驗證同時在nfig文件中我們所有的Forms設置都設為默認現在問題就來了
) 為什麼我明明點了Remember me而大概半個小時後我又Log out了?
) 為什麼我明明設置了timeout為無限期 eg 為什麼一兩天之後我又Log out了呢?
這是Forms驗證中遇到的比較多的問題下面我就這兩個問題做一個詳細的解釋對於問題一首先我要闡明ticket和cookie的區別cookie是一個容器用來存放東西它是保存在客戶端的而ticket是具體的數據用來表示具體的驗證信息它是放在cookie這個容器中的因而在我們驗證的過程中以下事情發生了首先ticket被創造了裡面包含著用戶名等信息同時它有一個過期時間然後cookie被創造了它同樣也有一個過期時間最後將ticket保存在cookie中並將此cookie發送到client的浏覽器中讀到這裡我想問題已經很明白了用戶的Log out就是因為時間過期的問題但具體是誰的時間過期了呢?在我們ASPNET nfig的設置中timeout是cookie的過期時間(注意默認是分鐘)而ticket的過期時間是無限的因為我們選了Remember me這就是為什麼雖然我點了Remember me但在分鐘左右後我仍然被Log out了因為我們並沒有設置cookie的timeoutticket和cookie只要其中之一不是永遠不過期我們都無法實現永不過期
當我們解決了問題一後(假如手動設置timeout=)我們又遇到了問題二這又是什麼原因呢?這得從ticket的加密解密機制說起ASPNET會使用一個machinekey來對cookie進行加密這個machinekey默認是在application啟動時隨機生成的然後ASPNET會使用同一個machinekey進行cookie進行解密正式因為這個key是application啟動時隨機生成的才導致了問題二試想如果application recycle(重啟)了怎麼辦?ASPNET會生成另一個key進行解密以前的cookie將不再有效這就是問題二的原因了知道了這個解決第二個問題的辦法就很簡單了手動設置一個特定的key
如Code <machineKey validationKey=CBCACFCFBBCFBBFCFCADEBE decryptionKey=BACFC validation=SHA />
PS 網上也有些隨機生成key的站點如/tools/keycreatoraspx看到這裡大家是不是對Forms驗證cookie有新的了解呢 )
From:http://tw.wingwit.com/Article/program/net/201311/13170.html