有3个网络应用。
站点A和B都是带有FormsAuthentications配置的ASP.NET Web应用程序,站点B中有一个受保护的文件夹,它也在web.config中正确配置。站点C是一个经典的ASP Web,它使Session保持身份验证状态。
现在请考虑以下步骤:
1,网站A的页面上有一个target =“_ blank”属性的链接,并链接到网站B的受保护文件夹;
2,点击此链接,您应该在新的浏览器窗口中打开站点B并重定向到登录页面;
3,使用您的凭据登录然后正常重定向到受保护的页面,现在您可以浏览站点B的页面;
4,现在关闭浏览器窗口,显示站点B的受保护页面,您可以单击浏览器的关闭按钮或按Alt + F4;
5,然后再次单击站点A上的链接,现在您无需再次登录即可访问站点B的受保护页面。
6,网站A的页面上还有另一个与target =“_ blank”的链接,并链接到网站C的受保护页面,网站C是一个ASP网站;
7,首先打开网站C的受保护页面,完全需要登录;
8,登录网站C当然可以查看受保护的页面,然后关闭浏览器;
9,再次单击指向站点C的链接,您可以发现自己已经在站点C上进行了身份验证。
糟糕。已经有10个步骤,我觉得这些都很无聊,但实际上让我困惑了几天。
有人知道这个问题吗? 非常感谢。
答案 0 :(得分:1)
ASP和ASP.NET都使用会话cookie,该cookie存储在浏览器进程的内存中。从链接打开新的浏览器窗口不会启动新进程只需打开一个与原始窗口相同的进程所拥有的新窗口。
关闭窗口不会“注销”会话,因为会话cookie仍然在进程内存中,当另一个窗口访问该站点时,现有的会话cookie将被发送,因此从站点的角度来看这仍然是相同的会议,这是绘制的正确推理。
编辑:问题在评论中提出,“如何避免这种情况”。最好的答案是:不要避免它,将其作为正常操作吸收,并为自己节省一大堆麻烦。
您要求的是检测当前没有窗口显示特定应用程序内容的方法。这真的很难实现。即使您在应用程序上只有一个窗口(无法保证),您也必须确保所有页面都被困在窗口上的onunload事件中,并通知服务器该应用程序正在注销。
如果用户能够注销应用程序至关重要,那么最好通过在页面中的每个页面上提供注销链接来实现,就像您现在正在查看的页面一样。
通常,通过在会话对象中存储某种令牌,ASP中的会话被标记为“已登录”。构成该应用程序一部分的页面将检查该令牌,如果它不存在,则重定向到登录页面。
要注销,会话值将被删除,客户端将重定向到登录页面。
在ASP.NET FormsAuthentication中,SignOut和RedirectToLoginPage方法以及Forms Authentication自动处理重定向到Login页面。
答案 1 :(得分:0)
例如,在window.close事件中使用session.abandoned。
创建将在header和catch事件window.close中加载的函数。 不要忘记验证上一页是否来自同一域/ IP。 因为您的用户可能忘记注销并转到其他网站,然后单击后退按钮...