编码:
Session["foo"] = "bar";
Response.Redirect("foo.aspx");
问题:
当 foo.aspx 从会话中读取“foo”时,它不存在。会话在那里,但“foo”没有任何价值。
我在我们的生产环境中间歇性地观察到这一点。但我在这里并不是要问一个关于 Response.Redirect() 的问题。
说明:
Bertrand Le Roy解释说(粗体字是我的):
现在,重定向所做的是向客户端发送一个特殊的标头,以便它向服务器请求与它等待的页面不同的页面。服务端,发送这个header后,Redirect结束响应。 这是一件非常暴力的事情。 Response.End 实际上会在页面使用 ThreadAbortException 时停止执行。这里真正发生的是 会话令牌在战斗中丢失。
我的收获是 Response.Redirect() 可以通过结束线程来处理。如果它们发生得太接近那种严厉,那可能会威胁到我的会话写作。
问题:
ASP.NET 会话管理如何使它如此容易受到此攻击?Response.Redirect() 代码行直到会话写入行“完成”才开始执行——它怎么会对我的会话写入造成如此大的威胁?
在下一行代码执行之前会话写入没有“完成”怎么办?是否存在会话写入类似(好像从未发生过)丢失的其他场景?