浏览器会话使用一个被存储在 SessionID 属性中的唯一标识符来进行识别。会话 ID 允许 ASP.NET 应用程序把特定浏览器与 Web 服务器相关的会话数据和信息进行联合。会话 ID 的值在浏览器和 Web 服务器之间的一个 Cookie 中被传递,或者是在无 Cookie 会话所指定的 URL 中。 小心:不论 System.Web.SessionState.HttpSessionState.SessionID 的值是一个 Cookie 还是 URL 中的一部分,它都是以明文的方式进行发送的。一个多余的来源能够对被另一个用户通过获取 SessionID 的值并把它包括在发送到服务器的请求中的会话进行访问。如果你把机密信息存储在会话状态中,建议你使用 SSL 在包括 SessionID 的浏览器和服务器之间对所有的通信内容进行加密。 无 Cookie 的会话 ID 默认时,SessionID 被存储在一个永不过期的会话 Cookie 中。你可以把 Web.config 文件中 sessionState 配置段的 cookieless 参数设置成 true 来指定应用程序不要把会话标识符存储到 Cookie 中。 提示:要改进应用程序的安全性,你应该允许用户能够从应用程序中执行登出任务,那时在应用程序中就应该调用 Abandon 方法。这减少了一个多余的来源潜在地获取 URL 中的唯一标识符并使用它来获取被存储在会话中的机密用户数据。 ASP.NET 通过自动在页面 URL 中插入唯一的会话 ID 的方式来对无 Cookie 的会话状态进行维护。例如,如下所示的 URL 被 ASP.NET 更改并包括了一个唯一的会话 ID:lit3py55t21z5v55vlm25s55: http://www.example.com/s(lit3py55t21z5v55vlm25s55)/orderform.aspx ASP.NET 通过把会话 ID 的值嵌入到每一个被发送到浏览器的页面链接的前面的方式来对包含在所有被请求页面的应用程序相对路径中的链接进行更改。会话状态在用户跟随着 ASP.NET 应用程序所提供的链接路径进行访问的时候被维护。但是,如果应用程序所提供的 URL 在客户端被改写,那么 ASP.NET 就不能对会话 ID 进行解析并把请求与现有的会话相关联,从而导致应用程序为该请求启动一个新的会话。 会话 ID 被嵌入在随着应用程序名称和任何所保持文件或虚拟目录标识符的 URL 的正斜线符号(/)后面。这允许 ASP.NET 在请求中包括 SessionStateModule 之前对应用程序的名称进行解析。 如下实例显示了一个配置 ASP.NET 应用程序来使用无 Cookie 的会话标识符的 Web.config 文件。 重新生成已失效的会话标识符默认时,无 Cookie 会话所使用的会话 ID 的值是被重复利用的。也就是说,如果一个产生了会话 ID 的请求已经过期,那么另一个使用相同 SessionID 的新会话将被启动并继续为该请求提供支持。这个行为能够导致在包含无 Cookie SessionID 的链接在多个浏览器中被共享的时候分配多余的状态数据,链接的来源或许是通过某个搜索引擎或其他程序。你能够通过禁用会话标识符的重复利用来减少会话数据被多个客户端所共享的可能性。要这样做,就需要把 sessionState 配置元素的 regenerateExpiredSessionId 参数值设置成 true。这将导致在已过期会话 ID 产生无 Cookie 会话请求的时候会生成一个新的会话 ID。 提示:如果已过期的会话 ID 所产生的请求使用了 HTTP POST 方法,那么任何被提交的数据将在 regenerateExpiredSessionId 参数的值是 true 的时候被丢失,与 ASP.NET 通过执行重定向来确认浏览器是否已经在 URL 中使用了新的会话标识符一样。 自定义会话标识符你可以通过创建一个继承自 SessionIDManager 类并使用自定义的实现对 CreateSessionID 和 Validate 方法进行重载的方式来实现一个自定义类以提供 SessionID 的值并对其进行验证。关于重载 SessionIDManager 类并实现这些方法的一个实例,请参考[CreateSessionID 方法]中所提供的实例。 你可以通过创建一个实现了 ISessionIDManager 接口的类来替换 SessionIDManager 类中的全部实现。例如,你可能有一个与拥有唯一标识符的非 ASP.NET 页面(如 HTML 页面或使用 ISAPI 过滤器的图片)相关联的 Web 应用程序。你可以实现一个自定义的 SessionIDManager 类来与 ASP.NET 会话状态一起使用唯一的标识符。如果你的自定义类支持无 Cookie 的会话标识符,你将需要为在 URL 中发送并获取会话标识符而实现一套方案。