如何以及为什么在ASP.NET会话ID重用

ASP.NET会话状态是一种技术,可以让您存储服务器端,用户特定的数据。 Web应用程序可以利用这些数据来处理来自用户的会话状态被实例化的要求。 会话状态的用户是由一个会话ID。 会话ID是交付使用下列方法之一:

  • 会话ID是一个被发送到用户的浏览器cookie的一部分。
  • 会话ID嵌入在URL中。 这种技术也被称为cookie的会话 。
会话ID是一个120位的随机数,它是由20个字符的字符串表示。 该字符串的格式,以便它可以包含在一个网址,它没有经过URL编码。 例如,字符串可能被用于无cookie会话。 传递会话ID的最常用的方法是使用Cookie来存储会话ID。 

当用户第一次打开他们的Web浏览器,然后进入一个网站,实现ASP.NET会话状态,cookie发送到浏览器名为“ASP.NET_SessionId”和一个20个字符的值。 

当在相同的DNS域的用户浏览,Web浏览器继续发送这个cookie的是提出它是源自域。 

例如,app1.tailspintoys.com和app2.tailspintoys.com都是ASP.NET应用程序。 如果用户进入app1.tailspintoys.com,然后去app2.tailspintoys.com,两个应用程序将使用相同​​的Cookie和相同的会话ID来跟踪每个应用程序的用户的会话状态。 应用程序不共享相同的会话状态。 中的应用只共享会话ID。 

因此,您可以重复使用,原因有几个会话ID。 例如,如果您重复使用会话ID,你没有做到以下几点:
  • 创建一个新的加密的唯一的会话ID,当你是一个有效的会话ID主办。
  • 创建一个ASP.NET应用程序,在每一个领域是新的会话ID。
当Web应用需要,并提供了一​​个登录页面或选项日志,我们建议您清除会话状态,当用户已经注销该网站。 要清除会话状态,调用Session.Abandon方法。 Session.Abandon方法可以让你冲洗时间,执行国家会话状态,而不必等待了会议。 默认情况下,这个时间是20分钟的滑动过期。 这过期刷新每次用户进行一到Web站点的请求,并提出了会话ID的Cookie。 Abandon方法设置一个废弃的标志在会话状态对象,指出应会话状态。 该标志审查,然后采取行动在页面请求结束后。 因此,用户可以使用页面会话对象在后调用 Abandon方法。 只要页面处理完成后,该会话将被删除。 

当您使用进程内会话状态模式,这些会话状态对象都存储在HttpCache。 该HttpCache支持回调方法,当下列条件为真:
  • 一个缓存项被删除。
  • 会话状态管理器注册Session_OnEnd事件处理程序被调用时,缓存项被删除。
当会话状态管理器中删除会话状态对象驻留在缓存中,HttpCache经理会调用任何已注册的回调。 实际上,这种行为引发Session_OnEnd事件处理程序。 

当你放弃一个会话,会话ID cookie不删除从用户的浏览器。 因此,只要会话已被废弃,到同一个应用程序的任何新的请求将使用相同​​的会话ID,但将有一个新的会话状态实例。 同时,如果用户打开一个应用程序在DNS域相同,用户也不会失去他们的会话状态后Abandon方法是应用程序调用之一。 

有时候,你可能不希望重用会话ID。 如果你,如果你了解不重用会话ID的后果,使用下面的代码示例以放弃会话并清除会话ID的Cookie:
  Session.Abandon();
 Response.Cookies.Add(新HttpCookie(“ASP.NET_SessionId”,"")); 
此代码示例从服务器中清除会话状态和设置会话状态Cookie为空。 空值可以有效清除从浏览器的cookie。 

当用户不记录从应用程序和会话状态时发生超时关闭,应用程序仍然可以使用同一个会话状态Cookie如果浏览器没有关闭。 此行为导致用户被定向到登录页面,用户的会话状态cookie被提出。 为了保证一个新的会话ID用于当您打开登录页面(login.aspx的),发送一个空的cookie返回给客户端。 要做到这一点,添加到响应的Cookie集合。 然后,发送响应返回给客户端的集合。 最简单的方式发送一个空饼干是使用Response.Redirect方法。 由于Cookies集合总有ASP.NET_SessionId价值的,你不能只是测试,如果这个cookie存在,因为你将创建一个Response.Redirect循环。 您可以设置一个查询字符串重定向到登录页面。 

或者,如下面的代码示例所示,您可以使用不同的cookie来证明你是否已经重定向到登录页面。 为了帮助提高安全性,并确保没有人试图打开ASP.NET Cookie的登录页面第二个cookie一起使用,下面的代码示例使用FormsAuthentication类加密和解密cookie数据。 然后,代码示例设置5秒钟的时间了。
 私人无效的Page_Load(对象发件人,System.EventArgs五)
 { 
如果(!的IsPostBack&& 
 (Request.Cookies [“__LOGINCOOKIE__”] ==空| |
 Request.Cookies [“__LOGINCOOKIE__”]。价值==“”))
 {
 / /在这一点上,我们不知道,如果会话ID,我们是一个新的
 / /会话ID,或者如果会话ID是由客户端通过。 
 / /更新的会话ID。

 Session.Abandon();
 Response.Cookies.Add(新HttpCookie(“ASP.NET_SessionId”,""));

 / /为了确保客户端的会话ID的Cookie清除,响应客户端来告诉 
 / /它是我们已作出回应。 要做到这一点,另设的cookie。
 AddRedirCookie();
 Response.Redirect(Request.Path);
 }

 / /确保不会有人试图欺骗。
尝试
 {
门票的FormsAuthenticationTicket =
 FormsAuthentication.Decrypt(Request.Cookies [“__LOGINCOOKIE__”]值。);

如果(空票== | | ticket.Expired ==真) 
抛出新的异常();

 RemoveRedirCookie();
 }
捕捉
 {
 / /如果有人试图欺骗,再做一次。
 AddRedirCookie();
 Response.Redirect(Request.Path);
 }


 Response.Write(“Session.SessionID =”+ Session.SessionID +“<br/>”);
 Response.Write(“曲奇ASP.NET_SessionId =”+ Request.Cookies [“ASP.NET_SessionId”]值+“<br/>”。);
 } 

私人无效RemoveRedirCookie() 
 { 
 Response.Cookies.Add(新HttpCookie(“__LOGINCOOKIE__”,"")); 
 } 

私人无效AddRedirCookie()
 {

门票的FormsAuthenticationTicket = 
新的FormsAuthenticationTicket(1,“测试”,DateTime.Now,DateTime.Now.AddSeconds(5),假,""); 
串encryptedText = FormsAuthentication.Encrypt(票); 
 Response.Cookies.Add(新HttpCookie(“__LOGINCOOKIE__”,encryptedText));
 }

原文地址:https://www.cnblogs.com/Traner/p/2819968.html