|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
效率会有不少的变化。而实际上java是基于堆栈机器来设计,这和我们常见的基于寄存器的本地机器是差异比较大的。总体来说,这是一种虚拟机的设计思路。asp.net|cookie|成绩 当你筹办将Web使用程序从ASP.NET1.1晋级到ASP.NET2.0,你将面临如许一个cookie成绩:在ASP.NET1.1使用程序中客户端保留的一切cookie将生效。
博客园也碰到了如许的成绩,对博客园来讲,意味着一切利用cookie的用户都必要从头登录,固然这不是一个很年夜的成绩,但切实其实给人人带来了贫苦,假如健忘了暗码,将加倍贫苦。
关于一个十分器重用户中意度的网站来讲,应当勉力往办理这个成绩。博客园但愿尽量削减晋级带来的影响,以是这两天我一向在研讨这个成绩并找到懂得决办法。
成绩的缘故原由是:当程序从ASP.NET1.1晋级到于ASP.NET2.0后,ASP.NET2.0利用新的算法与密钥对客户端发送过去的cookie举行解密,如许招致ASP.NET中天生的cookie在ASP.NET2.0中生效。在ASP.NET1.1中,利用3DES算法对cookie的内容举行加密,而在ASP.NET2.0中默许利用AdvancedEncryptedStandards(AES)算法举行解密,这是引发成绩的缘故原由之一,经由过程响应的设置能够将ASP.NET2.0中将cookie加密算法改成3DES,只需在web.config中加上:<machineKeydecryption="3DES"/>。但如许做以后成绩仍然存在,由于解密时除必要不异的算法,还必要不异的密钥。假如没有在machineKey中指定密钥,ASP.NET2.0会默许会利用随机天生的密钥,这个随秘密钥由System.Web.HttpRuntime.SetAutogenKeys()天生并存储于System.Web.HttpRuntime.s_autogenKeys中,经由过程反射你能够猎取这个值。ASP.NET1.1的machineKey是在machine.config中举行设置的,默许也是利用随秘密钥:
<machineKeyvalidationKey="AutoGenerate,IsolateApps"decryptionKey="AutoGenerate,IsolateApps"validation="SHA1"/>。
成绩就出在分歧的随秘密钥上。假如你在本来的ASP.NET1.1中指定了密钥,那就不存在这个成绩了,但一样平常在利用Webfarm时,才会思索这一点。以是一般情形都是利用随秘密钥。ASP.NET会为分歧的使用程序天生分歧的随秘密钥,这个客户端cookie生效成绩会出一在良多情形下,好比:重装体系、将ASP.NET使用程序移至别的一台盘算机,将Web使用程序移到分歧的假造目次中等等。
怎样办理这个成绩呢?
道理很复杂,只需我们晓得在ASP.NET1.1中随机天生的密钥的值,然后在ASP.NET2.0使用程序的web.config中举行指定就好了,这里的密钥有两个:一个是加密密钥decryptionKey,一个是散列盘算密钥validationKey(避免cookie被半途改动)。假设我们晓得密钥分离为:X、Y,那在web.config
举行以下设置就可以办理成绩:
<machineKeyvalidationKey="X"decryptionKey="Y"decryption="3DES"/>
而困难就在于怎样失掉ASP.NET1.1中随机天生的密钥的值。密钥存储在LSA(WindowsLocalSecurityAuthority)中,但我没找到能够从LSA猎取密钥的办法。
因为博客园次要是办理登录cookie的成绩,而这个cookie是在System.Web.Security.FormsAuthentication.SetAuthCookie(stringuserName,boolcreatePersistentCookie)中天生的,以是我就从ASP.NET1.1的System.Web.Security.FormsAuthentication的源代码动手,发明了System.Web.Configuration.MachineKey,经由进一步对MachineKey的源代码举行研讨,在MachineKey的MachineKeyConfig中发明了两个密钥分离存在于s_validationKey与s_oDes这两个公有静态成员中(发明这个费了很多工夫),validationKey的值间接存储于s_validationKey中,而decryptionKey存储于s_oDes.Key中。因为MachineKey是internalclass,MachineKeyConfig是公有范例,那两个成员是公有静态成员,没法间接会见。这时候,该是.NET中壮大的反射功效发扬感化的时分了。经由过程反射失掉这两个值,必要注重的是这两个值的范例是Byte[],经由过程测试发明间接转换成字符串天生的密钥有效,必要经由过程反射挪用System.Web.Configuration.MachineKey.ByteArrayToHexString(Byte[],Int32)转换成字符串。
明天早晨终究办理了这个成绩,好镇静!半途几回想保持,但想到在博客园程序晋级到ASP.NET2.0后,会由于这个成绩给良多人带来贫苦,固然只必要从头登录一下就好了,但我仍是以为要办理这个成绩,做程序开辟不就是尽量给用户带来便利吗?
办理了这个成绩就为博客园网站晋级到ASP.NET2.0作好了进一步的筹办。
效率会有不少的变化。而实际上java是基于堆栈机器来设计,这和我们常见的基于寄存器的本地机器是差异比较大的。总体来说,这是一种虚拟机的设计思路。 |
|