從ASP.NET 1.1升級到ASP.NET 2.0要考慮的Cookie問題

來源:互聯網
上載者:User
當你準備將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作好了進一步的準備。
來源: 站長吧 - http://www.master8.net/data/2007/0529/article_8185.htm
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.