博主最近忙着做毕业设计,在做的时候也遇到了些问题,例如:

博主毕业设计是做一个管理系统,用户的登陆信息当然是以 Cookie 的形式保存,但是有时需要使用 Token 来验证信息有效性,于是使用 SessionId+Salt 的散列值作为 Token 的值。但是博主很少用 Session 来保存信息,经过查找和学习,了解了强制使用新的 SessionId 的方法。

 

在 ASP.NET 中有两种方法在浏览器中传递会话 Id,其一是使用 Cookie 记录 Session 的会话 Id,其二是将会话 Id 在 URL 链接中进行传递。这里着重讲“使用 Cookie 记录会话 Id”时,如何强制使用新的 SessionId。

在第一次访问会写入 Session 的页面时,服务器将向浏览器发送一个名为 ASP.NET_SessionId、值是 24 位由数字和小写字母组成的字符串的 Cookie。(Mono发送的值字母是大写= =)

之后,访问相同域名的网页时,浏览器将会发送这个 Cookie。

 

有时,我们希望强制使用新的 SessionId,但是使用 Session.Clear()Session.removeAll()Session("SOS")="" 并不能销毁 Session ,这只能移除 Session 中的值,却无法销毁 Session 这个容器,当然,SessionId 也不会改变。

想要销毁 Session ,就要使用 Session.Abandon()使用这个方法将会销毁当前用户的所有会话内容,如果只是想销毁当前用户某一个 Session ,就不要使用这个方法了。

 

本来博主以为销毁 Session 后,下一次分配的 SessionId 将会不同,但是,ASP.NET 并不这样做,它不会从用户的浏览器中删除会话 Id 的 Cookie 。当浏览器带着一个已过期或已被销毁的 SessionId 访问页面,只要该 SessionId 没有被他人使用,这个 SessionId 就会被重新使用,只不过此会话非彼会话了。不过要是这个 SessionId 已经被他人使用了,这不就是获得了别人的会话信息么…._(:3」∠)_

跪了,shenmegui…

 

于是,解决方案来了…既然这个 SessionId 是以 Cookie 的形式保存的,那么要更换 SessionId ,只需要改变 Cookie 就行了:

第一种方法,将 Session 销毁,再使 ASP.NET_SessionId 这个 Cookie 立即过期,这时将会分配一个新的 SessionId 。

HttpContext.Current.Session.Abandon()
HttpContext.Current.Response.Cookies("ASP.NET_SessionId").Expires = Now.AddSeconds(-1)

第二种方法,将 Session 销毁,再把 SessionId 设为空值或其他非 24 位的字符串。

HttpContext.Current.Session.Abandon()
HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""))

 

这样,就可以强制使用新的 SessionId 了。

 

话说这篇文章的 ID 是1111….(╯°口°)╯(┴—┴

注孤身的节奏…


原创文章,转载请以链接形式注明出处:http://blog.ttionya.com/article-1111.html