我遇到了奇怪的会话问题。我开发了一个网站,该网站使用会话来跟踪用户特定信息,以确定特定用户是否有权访问网站的某些部分。我正在使用VSTS 2008 + .Net 3.5 + C#开发ASP.Net网站。
在我的设计中,当我访问http://mysite/sitemanager时,如果没有可用的会话ID,将要求用户输入他们的用户名和密码(如果通过密码检查,将授予可用的会话ID);如果会话ID可用,则表示用户具有站点管理权限并经过身份验证,然后用户可以访问站点管理员的所有功能 - 即所有登录用户都有权访问站点管理员。
麻烦的情况是这样的,
任何想法有什么不对?我想要的是在步骤(3)中应该要求用户输入密码。
答案 0 :(得分:2)
您的会话尚未因为您离开网站而结束。会话在自上次与站点交互后的超时时间内保持活动状态。这就是会话信息仍然存在的原因。
要回答您的评论,您可以通过调用Session.Abandon()来结束会话。如果你想在有人离开网站时这样做,我建议你在页面的卸载客户端事件上进行ajax调用,然后调用Session.Abandon()或者至少重置凭据。但是,这可能会很棘手,因为即使您将页面留在您自己的站点中的另一个页面,也会调用卸载,因此您也必须检查它。是的,它是设计的。除非另行指定,否则默认会话超时为20分钟。
答案 1 :(得分:2)
只有当用户删除了服务器提供给他/她的会话cookie时,才会丢失会话状态。或者用户未请求特定的(Session.TimeOut
属性)期间。或者如果你在代码中放弃它。
答案 2 :(得分:1)
这是网络会话在各地工作的方式。为了避免令人惊讶的用户;你最好只接受这种行为。
但如果你真的希望你的用户在他们停止使用你的网站时注销,那么这就是......
而不是使用卸载事件(因为很难判断某人是否真的离开了您的网站时会出现问题 - 如果他们有两个窗口打开您的网站会发生什么?),我建议将会话超时缩短为1分钟,并使用客户端keepalive:基本上,浏览器每隔几秒钟(例如10)将服务器ping到一个预定的URL,除了保持会话活动之外什么都没做。
如果需要,可以在没有javascript的情况下完全实现,通过iframe到具有元刷新标记的页面。当然,它在javascript中更健壮,更简单,但隐藏的iframe不是太复杂,也不是元标记。如果服务器端刷新页面支持发送304 Not-modified,那么您的开销解决方案也非常低。
在您的主文件中,您总是包含以下内容:
<iframe src="keepalive.aspx" width="1" height="1" />
<!--and perhaps use css to hide the iframe - but test that!-->
在keepalive.aspx中你会包括:
<meta http-equiv="refresh" content="5" />
最后,作为带宽优化,在keepalive.aspx的代码中,您可以添加Last-Modified响应头,并检查浏览器是否发送了If-Not-Modified-Since请求标题,如果有,则发送304 Not-Modified而不是完整文档。
最后,如果你依赖javascript(许多这样的基于Web的应用程序),你可以简单地使用你最喜欢的ajax框架来定期执行请求 - 而不需要iframe。