扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
当你准备将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中加上:
如何解决这个问题呢?
原理很简单,只要我们知道在ASP.NET 1.1中随机生成的密钥的值,然后在ASP.NET 2.0应用程序的web.config中进行指定就行了,这里的密钥有两个:一个是加密密钥decryptionKey,一个是散列计算密钥validationKey(防止cookie被中途篡改)。假如我们知道密钥分别为:X、Y,那在web.config进行如下设置就能解决问题:
由于博客园主要是解决登录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作好了进一步的准备。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者