国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:11:34
字體:
來源:轉載
供稿:網友

  當你準備將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 decryption="3des"/>。但這樣做之后問題依然存在,因為解密時除了需要相同的算法,還需要相同的密鑰。如果沒有在machinekey中指定密鑰,asp.net 2.0會默認會使用隨機生成的密鑰,這個隨機密鑰由system.web.httpruntime.setautogenkeys()生成并存儲于system.web.httpruntime.s_autogenkeys中,通過反射你可以獲取這個值。asp.net 1.1的machinekey是在machine.config中進行設置的,默認也是使用隨機密鑰:

<machinekey validationkey="autogenerate,isolateapps" decryptionkey="autogenerate,isolateapps" validation="sha1"/>。

  問題就出在不同的隨機密鑰上。如果你在原來的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
進行如下設置就能解決問題:

<machinekey validationkey="x" decryptionkey="y" decryption="3des"/>

      而難題就在于如何得到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作好了進一步的準備。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泸定县| 綦江县| 白水县| 北安市| 庆城县| 锦州市| 常熟市| 瓦房店市| 贡觉县| 武宁县| 田林县| 夹江县| 徐州市| 胶南市| 马关县| 驻马店市| 兴安盟| 沛县| 三穗县| 霞浦县| 都安| 浦东新区| 曲靖市| 彰化市| 二连浩特市| 津南区| 石棉县| 合阳县| 昌都县| 读书| 台东县| 彭水| 崇文区| 阳原县| 靖远县| 昭觉县| 凤城市| 宁安市| 图木舒克市| 龙山县| 井研县|