浏览器的会话使用存储在 SessionID 属性中的唯一标识符进行标识。会话 ID 使 ASP.NET 应用程序能够将特定的浏览器与 Web 服务器上相关的会话数据和信息相关联。会话 ID 的值在浏览器和 Web 服务器间通过 Cookie 进行传输,如果指定了无 Cookie 会话,则通过 URL 进行传输。
警告 |
|---|
| 无论是作为 Cookie 还是作为 URL 的一部分,P:System.Web.SessionState.HttpSessionState.SessionID 值都是以明文形式发送的。有害源如果获取此 SessionID 值并将其包含在对服务器的请求中,则可以访问另一位用户的会话。如果将私人信息或敏感信息存储在会话状态中,建议您使用 SSL 来加密浏览器和服务器之间包含 SessionID 的任何通信。 |
无 Cookie SessionID
默认情况下,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 之前解析应用程序的名称。
下面的示例演示一个 Web.config 文件,它将 ASP.NET 应用程序配置为使用无 Cookie 会话标识符。
<configuration>
<system.web>
<sessionState cookieless="true"
regenerateExpiredSessionId="true" />
</system.web>
</configuration>
重新生成已过期的会话标识符
默认情况下会回收无 Cookie 会话中使用的会话 ID 值。即如果使用已过期的会话 ID 发起一个请求,将使用此请求提供的 SessionID 启动一个新的会话。如果一个包含无 Cookie SessionID 的链接被多个浏览器共享时(可能通过搜索引擎或其他程序),此行为可能导致对会话数据的意外共享。可以通过禁用会话标识符的回收来降低多个客户端共享会话数据的可能性。为此,将 sessionState 配置元素的 regenerateExpiredSessionId 属性设置为 true。这样,在使用已过期的会话 ID 发起无 Cookie 会话请求时,将生成一个新的会话 ID。
注意 |
|---|
| 如果使用 HTTP POST 方法发起使用已过期会话 ID 的请求,则当 regenerateExpiredSessionId 为 true 时,将丢失发送的所有数据,因为 ASP.NET 会执行重定向,以确保浏览器在 URL 中具有新的会话标识符。 |
自定义会话标识符
可以实现自定义类来提供和验证 SessionID 值。方法是创建一个类,使其继承 SessionIDManager 类,然后用您自定义的实现来重写 CreateSessionID 和 Validate 方法。有关重写 SessionIDManager 类并实现这些方法的示例,请参见为 CreateSessionID 方法提供的示例。
可以通过创建实现 ISessionIDManager 接口的类来替换整个 SessionIDManager。例如,有的 Web 应用程序可能将唯一标识符与非 ASP.NET 页(如 HTML 页或使用 ISAPI 筛选器的图像)相关联。可以实现自定义的 SessionIDManager 类,将此唯一标识符用于 ASP.NET 会话状态。如果您的自定义类支持无 Cookie 会话标识符,则需要实现一个解决方案,在 URL 中发送和检索会话标识符。
请参见