ASP.NET Forms驗證
對于ASP.NET Forms驗證,想必大家都非常的熟悉。然而,在控制用戶的(過期時間)expired time的時候,你是否遇到過一些奇怪的現(xiàn)象呢?雖說只是一個小小的cookie,但是其中可能有很多的東西你都不知道。今天我將和大家詳細討論一下cookie的注意點。
在ASP.NET Forms驗證中,通常我們會使用ASP.NET自帶的Login控件來進行驗證。同時,在web.config文件中,我們所有的Forms設(shè)置都設(shè)為默認?,F(xiàn)在,問題就來了。
1.為什么我明明點了"Remember me",而大概半個小時后,我又Log out了?
2.為什么我明明設(shè)置了timeout為無限期 e.g. 400000,為什么一兩天之后我又Log out了呢?
這是Forms驗證中遇到的比較多的問題。下面,我就這兩個問題做一個詳細的解釋:對于問題一,首先我要闡明ticket和cookie的區(qū)別。cookie是一個容器,用來存放東西,它是保存在客戶端的。而ticket是具體的數(shù)據(jù),用來表示具體的驗證信息,它是放在cookie這個容器中的。因而,在我們驗證的過程中,以下事情發(fā)生了。首先,ticket被創(chuàng)造了,里面包含著用戶名等信息,同時它有一個過期時間。
然后,cookie被創(chuàng)造了,它同樣也有一個過期時間。***,將ticket保存在cookie中,并將此cookie發(fā)送到client的瀏覽器中。讀到這里,我想問題已經(jīng)很明白了,用戶的Log out就是因為時間過期的問題。但具體是誰的時間過期了呢?在我們ASP.NET web.config的設(shè)置中,timeout是cookie的過期時間(注意,默認是30分鐘),而ticket的過期時間是無限的,因為我們選了"Remember me".這就是為什么雖然我點了"Remember me"。
但在30分鐘左右后,我仍然被Log out了,因為我們并沒有設(shè)置cookie的timeout.ticket和cookie,只要其中之一不是永遠不過期,我們都無法實現(xiàn)永不過期。
當我們解決了問題一后(假如手動設(shè)置timeout="4000000"),我們又遇到了問題二。這又是什么原因呢?這得從ticket的加密解密機制說起。ASP.NET會使用一個machinekey來對cookie進行加密,這個machinekey默認是在application啟動時隨機生成的。然后,ASP.NET會使用同一個machinekey進行cookie進行解密。正式因為這個key是application啟動時隨機生成的才導(dǎo)致了問題二。試想,如果application recycle(重啟)了怎么辦?
ASP.NET會生成另一個key進行解密,以前的cookie將不再有效,這就是問題二的原因了。知道了這個,解決第二個問題的辦法就很簡單了,手動設(shè)置一個特定的key.如:<machineKey validationKey="88CB6CA6CF403C5FBB41C2F62BB7FCFCA05DE7BE" decryptionKey="B8A7CF3816C57176" validation="SHA1" /> P.S. 網(wǎng)上也有些隨機生成key的站點,如:http://www.aspnetresources.com/tools/keycreator.aspx.看到這里,大家是不是對ASP.NET Forms驗證cookie有新的了解呢 :)
【編輯推薦】