从ASP.NE T 1.1升级到ASP.NET 2.0需要考虑的Cookie问题

asp.net|cookie|问题

  当你准备将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作好了进一步的准备。

时间: 2024-10-11 15:22:55

从ASP.NE T 1.1升级到ASP.NET 2.0需要考虑的Cookie问题的相关文章

关于asp.net 1.0升级到asp.net 2.0时发现的一个有趣的问题

asp.net|问题     今天终于把原来的asp.net 1.0程序升级到asp.net 2.0了,vs 2005带有转换向导,一切自动化,操作比较方便.等它自动转换后,突然发现在App_Code文件夹里多了几个比较奇怪的文件都是stub开头的,并在一个mi开头的文件夹中(具体名称因为删除了,忘记了),因为原来根本就没有这些.cs文件,打开一看,原来都是抽象类,有几个还有抽象方法和共有字段.经过查看,才发现,原来在asp.net 1.0中有几个页面后置文件即.aspx.cs文件,里面有pub

Asp.ne response对象与request对象使用介绍

 这篇文章主要介绍了Asp.ne response对象与request对象使用,需要的朋友可以参考下 1.Response:服务器发给客户端信息,或者说是服务器的向用户发送输出结果.    Redirect:让客户端重新定向到指定的 URL.    Write:写出指定字符串.    2.request:客户端发给服务器,或者说是从客户端取得信息.    form:从使用post提交方式的表单获取表单元素的值.    querystring:取回查询字符串中的变量值,适用于get提交方式的表单.

【翻译】在没有安装ASP.NET MVC3的服务器上运行ASP.NET MVC3的程序-scottgu

原文地址: http://weblogs.asp.net/scottgu/archive/2011/01/18/running-an-asp-net-mvc-3-app-on-a-web-server-that-doesn-t-have-asp-net-mvc-3-installed.aspx 为了更符合中文阅读习惯,我对原文做了小幅度修改   最近我们发布了一些新的Web产品 - 包括ASP.NET MVC 3.至今为止,我们已经获得了大量的反馈. 有几个朋友在问我一个问题:"我的网站托管服务

把ASP应用中的Session传递给asp.net应用

asp.net|session 最近做一个业务处理系统,因为它原有的用户系统使用ASP开发,在新的业务系统中使用了ASP.NET,ASP.NET APPLICATION要使用原来的ASP用户系统,于是问题出现了,ASP APPLICATION怎样才能让用户登录的状态及用户信息在ASP.NET中依然有效呢.于是我们考虑用构造FORM来自动提交传递ASP应用中的Session变量.例子如下ASP应用URL为http://127.0.0.1/asp/,并在ASP.NET应用中的web.config设定

利用ASP.NET设计FTP文件上传(asp.net)

asp.net|上传|设计|asp.net|上传 這個版本和純前臺的上傳類似是一樣的功能,只是將前後臺的代碼給分開了 .aspx<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm6.aspx.vb" Inherits="MyData.WebForm6"%><!DOCTYPE HTML PUBLIC "-//W3C//D

ASP.NET底层架构探索之进入ASP.NET

asp.net|架构 ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用.绝大多数的人只熟悉高层的框架如WebForms和WebServices-这些都在ASP.NET层次结构在最高层.在这篇文章中我将会讨论ASP.NET的底层机制并解释请求(request)是怎么从Web服务器传送到ASP.NET运行时然后如何通过ASP.NET管道来处理请求. 对我而言了解平台的内幕通常会带来满足感和舒适感,深入了解也能帮助我写出更好的应用.

不能ASP图像组件来生成图像的ASP计数器程序(一)

程序|计数器 不能ASP图像组件来生成图像的ASP计数器程序这是我去年编的一个ASP程序,那时用惯了C语言,所以对Basic反而忘了,但由于觉得ASP很热门,所以试着编了这个程序,程序没经过优化,代码很长,主要是数据那时候不知道该怎么用:) 别笑我,因为现在我会用啦!!这是个简单的计数器申请系统,采用文本,所以只要是支持ASP的空间就都可以测试!!其中TXT目录放的是所有人的计数文本文件number是用来统计当前申请计数器的最大人数 初始化内容为0apply.asp applycheck.asp

asp+初体验---用c#写的asp+域名查询程序

asp+|程序 终于有时间可以学点新东西了,今天大略看了一下有关asp+的资料,并且写了个域名查询的页面,感觉很不错,asp+比起asp来进步实在是太大了,尽管用asp+组件也能实现域名查询的功能,并且前几天我用vc写过这么个组件,但用asp+简单方便多了.好了,废话少提,看源码吧. <% @Page Language="C#" %><% @Assembly Name="System.Net" %><% @Import Namespac

ASP.NET MVC案例教程(基于ASP.NET MVC beta)—第七篇:闲话ASP.NET MVC

摘要 本文作为<ASP.NET MVC案例教程>的完结篇,仅从个人角度,发表一些对ASP.NET MVC框架的看法.并且在最后会附上本系列文章的Demo下 载. 前言 写这篇文章的目的,是想总结一些东西,以帮助朋友们更好的使用这个框架.但是,我又不像把官方列举的哪些优势.功能翻译过来列举在 这里.所以,我想干脆我就纯从个人观点上对这个框架评论一下吧.说的不好的,不对的还请批评指正.^_^ ASP.NET MVC--螺旋进步的产物 对于微软为什么要推出ASP.NET MVC,我们是无从得知的,也