C# Session互串 解决方案

SessionID 属性用于唯一地标识在服务器上包含会话数据的浏览器。 SessionID 值由 ASP.NET 随机生成。

ASP.NET 可唯一标识每个浏览器使用的会话。默认条件下,会话的唯一标识符存储在浏览器的不过期会话 Cookie 中。

说明
要提高应用程序的安全性,您的应用程序必须允许用户注销,以便此时它可以调用 Abandon 方法。这样可以减少不必要代码使用 URL 中唯一标识符检索存储在会话中的用户专用数据的潜在风险。

如果您希望禁止在 ASP.NET 应用程序中使用 Cookie,但是仍使用会话状态,则可以通过以下方法将应用程序配置为在 URL(而非 Cookie)中存储会话标识符:在应用程序的 Web.config 文件中将 sessionState 配置元素的 cookieless 特性设置为 true

SessionID 在服务器和浏览器之间以纯文本的形式发送到 Cookie 或者 URL 中。在这种情况下,不必要代码可能会获取 SessionID 值并包含在发送至服务器的请求中,从而获权访问另一用户的会话。如果将私人信息或敏感信息存储在会话状态中,建议您使用 SSL 来加密浏览器和服务器之间包含 SessionID 的任何通信。

使用基于 Cookie 的会话状态时,只有使用 Session 对象后,ASP.NET 才能分配会话数据存储。因此,在访问会话对象之前,会为每个页请求生成一个新的会话 ID。如果您的应用程序要求整个会话使用一个静态会话 ID,则可以实现应用程序的 Global.asax 文件中的 Session_Start 方法,并将数据存储在 Session 对象中以修复会话 ID,或者可以在应用程序的其他部分使用代码将数据显式存储在 Session 对象中。

下面的代码示例演示 Web.config 文件如何配置会话状态来使用无 Cookie 会话标识符

代码
<configuration>
  <system.web>
    <sessionState 
      mode="InProc"
      cookieless="true"
      regenerateExpiredSessionId="true"
      timeout="30" />
  </system.web>
</configuration>

ASP.NET 通过自动在页的 URL 中插入唯一的会话 ID 来保持无 Cookie 会话状态。例如,下面的 URL 已被 ASP.NET 修改。

  http://www.example.com/(S(4danlfat035muve4g0mvgfrr))/orderform.aspx

ASP.NET 对所有请求的页中包含的链接进行修改,方法是就在要将每页发送到浏览器之前,在链接中嵌入一个会话 ID。只要用户使用站点提供的链接路径,即可对会话状态进行维护。但是,如果用户代理重写了 URL,则会话状态实例可能会丢失。

会话 ID 紧随在应用程序名后的斜杠之后,在其余所有文件或虚拟目录标识符之前。这使 ASP.NET 可以在涉及请求中的 SessionStateModule 之前解析应用程序的名称。

默认条件下,无 Cookie 会话中使用的会话标识符将被回收。也就是说,如果使用已过期的会话 ID 发送了请求,则新会话将使用随请求一起提供的会话 ID 启动。当某个包含无 Cookie 会话 ID 的链接与多个浏览器共享时(可能通过搜索引擎或其他程序),这种行为可能会导致有害的会话数据共享。您可以通过禁用会话标识符的回收来减少会话数据被多个客户端共享的可能性。为此,将 sessionState 配置元素的 regenerateExpiredSessionId 特性设置为 true这样,在使用已过期的会话 ID 发起无 cookie 会话请求时,将生成一个新的会话 ID。注意,如果使用 HTTP POST 方法发起使用已过期会话 ID 的请求,则当 regenerateExpiredSessionIdtrue 时,将丢失发送的所有数据,因为 ASP.NET 会执行重定向,以确保浏览器在 URL 中具有新的会话标识符。

 

posted @ 2013-03-08 14:02  肖寒  阅读(1118)  评论(0编辑  收藏  举报