從ASP.NET 1.1升級到ASP.NET 2.0要考慮的Cookie問題_.Net教程
推薦:asp.net2.0 URL重寫以及urlMappings問題(2) 由于一旦進行了URL重寫,原先的WEBFORM中的Action會發生改變,容易造成:請求的資源不存在問題具體怎么樣?各位DX看看就清楚了!!! 所有才有了這個ResponseFilter了,
當你準備將Web應用程序從ASP.NET 1.1升級到ASP.NET 2.0,你將面對這樣一個cookie問題:在ASP.NET 1.1應用程序中客戶端保存的所有cookie將失效。
博客園也遇到了這樣的問題,對博客園來說,意味著所有使用cookie的用戶都需要重新登錄,雖然這不是一個很大的問題,但的確給大家帶來了麻煩,如果忘記了密碼,將更加麻煩。
對于一個非常重視用戶滿意度的網站來說,應該努力去解決這個問題。博客園希望盡可能減少升級帶來的影響,所以這兩天我一直在研究這個問題并找到了解決方法。
問題的原因是:當程序從ASP.NET 1.1升級到于ASP.NET 2.0后,ASP.NET 2.0使用新的算法與密鑰對客戶端發送過來的cookie進行解密,這樣導致ASP.NET中生成的cookie在ASP.NET 2.0中失效。在ASP.NET 1.1中,使用3DES算法對cookie的內容進行加密,而在ASP.NET 2.0中默認使用Advanced Encrypted Standards (AES)算法進行解密,這是引起問題的原因之一,通過相應的設置可以將ASP.NET 2.0中將cookie加密算法改為3DES,只需在web.config中加上:.但這樣做之后問題依然存在,因為解密時除了需要相同的算法,還需要相同的密鑰。如果沒有在machineKey中指定密鑰,ASP.NET 2.0會默認會使用隨機生成的密鑰,這個隨機密鑰由System.Web.HttpRuntime.SetAutogenKeys生成并存儲于System.Web.HttpRuntime.s_autogenKeys中,通過反射你可以獲取這個值。ASP.NET 1.1的machineKey是在machine.config中進行設置的,默認也是使用隨機密鑰:.問題就出在不同的隨機密鑰上。如果你在原來的ASP.NET 1.1中指定了密鑰,那就不存在這個問題了,但一般在使用Web farm時,才會考慮這一點。所以通常情況都是使用隨機密鑰。ASP.NET會為不同的應用程序生成不同的隨機密鑰,這個客戶端cookie失效問題會出一在很多情況下,比如:重裝系統、將ASP.NET應用程序移至另外一臺計算機,將Web應用程序移到不同的虛擬目錄中等等。
如何解決這個問題呢?
原理很簡單,只要我們知道在ASP.NET 1.1中隨機生成的密鑰的值,然后在ASP.NET 2.0應用程序的web.config中進行指定就行了,這里的密鑰有兩個:一個是加密密鑰decryptionKey,一個是散列計算密鑰validationKey(防止cookie被中途篡改)。假如我們知道密鑰分別為:X、Y,那在web.config進行如下設置就能解決問題:而難題就在于如何得到ASP.NET 1.1中隨機生成的密鑰的值。密鑰存儲在LSA(Windows Local Security Authority)中,但我沒找到可以從LSA獲取密鑰的方法。
由于博客園主要是解決登錄cookie的問題,而這個cookie是在System.Web.Security.FormsAuthentication. SetAuthCookie(string userName, bool createPersistentCookie)中生成的,所以我就從ASP.NET 1.1的System.Web.Security.FormsAuthentication的源代碼下手,發現了System.Web.Configuration.MachineKey,經過進一步對MachineKey的源代碼進行研究,在MachineKey的MachineKeyConfig中發現了兩個密鑰分別存在于s_validationKey與s_oDes這兩個私有靜態成員中(發現這個費了不少功夫),validationKey的值直接存儲于s_validationKey中,而decryptionKey存儲于s_oDes.Key中。由于MachineKey是internal class,MachineKeyConfig是私有類型,那兩個成員是私有靜態成員,無法直接訪問。這時,該是。NET中強大的反射功能發揮作用的時候了。通過反射得到這兩個值,需要注意的是這兩個值的類型是Byte[],通過測試發現直接轉換成字符串生成的密鑰無效,需要通過反射調用System.Web.Configuration.MachineKey.ByteArrayToHexString(Byte[], Int32) 轉換成字符串。
今天晚上終于解決了這個問題,好興奮!中途幾次想放棄,但想到在博客園程序升級到ASP.NET 2.0后,會因為這個問題給很多人帶來麻煩,雖然只需要重新登錄一下就行了,但我還是覺得要解決這個問題,做程序開發不就是盡可能給用戶帶來方便嗎?
解決了這個問題就為博客園網站升級到ASP.NET 2.0作好了進一步的準備。
分享:asp.net2.0 URL重寫以及urlMappings問題(1)在asp.net2.0中的urlMappings倒是非常好用,可惜暫不支持正則表達式,不過,好在如果用IHttpModule的話 不管什么樣的請求都會先經過IHttpModule這樣就為URL重寫提供了一個好機會:
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面傳值測試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-從ASP.NET 1.1升級到ASP.NET 2.0要考慮的Cookie問題。