Asp.net Google Chrome在崩溃后恢复会话cookie,如何避免?

Asp.net Google Chrome在崩溃后恢复会话cookie,如何避免?,asp.net,.net,google-chrome,authentication,session-cookies,Asp.net,.net,Google Chrome,Authentication,Session Cookies,在Google Chrome上(我在Windows 8.1上看到了35版,到目前为止我没有尝试过其他版本)当浏览器崩溃时(或者你只需拔下电源线…),当你再次打开它时,会要求你恢复上一个会话。功能良好,但它也将恢复会话cookie 我不想在这里讨论它是否是一个bug,因为对该机器具有物理访问权限的用户可能会“引发”崩溃,窃取未关闭的会话及其所有内容(不会要求您再次登录) 最后我的问题是:网站如何避免这种情况?如果我对会话cookie使用普通ASP.NET身份验证,我不希望它们在浏览器崩溃时存活(即

在Google Chrome上(我在Windows 8.1上看到了35版,到目前为止我没有尝试过其他版本)当浏览器崩溃时(或者你只需拔下电源线…),当你再次打开它时,会要求你恢复上一个会话。功能良好,但它也将恢复会话cookie

我不想在这里讨论它是否是一个bug,因为对该机器具有物理访问权限的用户可能会“引发”崩溃,窃取未关闭的会话及其所有内容(不会要求您再次登录)

最后我的问题是:网站如何避免这种情况?如果我对会话cookie使用普通ASP.NET身份验证,我不希望它们在浏览器崩溃时存活(即使计算机重新启动!)


用户代理字符串中没有类似于进程ID的内容,JavaScript变量都已恢复(因此我无法存储随机种子,例如服务器端生成的种子)。还有其他可行的办法吗?会话超时可以处理这个问题,但通常会很长,并且会有一个不安全的窗口,我会消除它。

我没有找到任何可以用作进程id的东西来确保Chrome没有重新启动,但有一个棘手的解决方法:如果我设置了计时器(比如说间隔5秒)我可以检查从最后一次滴答声经过了多少时间。如果经过的时间过长,则会话已恢复并执行注销。大致如下(每页):

当然,这不是一个完美的解决方案(因为恶意攻击者可能会处理此问题和/或禁用JavaScript),但到目前为止,它总比什么都没有好


有更好的解决方案的新答案非常受欢迎。

阿德里亚诺的建议是一个好主意,但实施是有缺陷的。我们需要记住坠机前的时间,以便与坠机后的时间进行比较。最简单的方法是使用
sessionStorage

const CRASH\u DETECT\u THRESHOLD\u(毫秒)=10000;
const marker=parseInt(sessionStorage.getItem('crashDetectMarker')| | new Date().valueOf());
const diff=新日期().valueOf()-标记;
console.log('diff',diff)
如果(差异>崩溃检测阈值,以毫秒为单位){
警报(“注销”);
}否则{
警报(“正常”);
}
设置间隔(()=>{
setItem('crashDetectMarker',new Date().valueOf());
}, 1000)
要进行测试,您可以通过输入
chrome://crash
位于位置栏中


当用户注销时,不要忘记清除
crashDetectMarker

使用
beforeunload
事件显式删除Cookie是有效的。您可能想使用localStorage来跟踪您的站点打开了多少个选项卡。@ZachB tnx,我在一年前(大约一年前)尝试复制此内容,但似乎已解决,但无论如何,我无法在卸载之前使用
,因为浏览器崩溃时不会调用它(或者您只是从计算机上拔下电源线…)这就是我正在写的两个案例。关于日期的一个注意事项(我对我发布的代码有相同的问题):这是当地时间,在过渡到/从夏季时间时,它会错误地计算时间间隔,只需要在这里使用UTC。它过去之所以能工作,只是因为Chrome恢复了(我想…)整个JS状态(或者它的最后一个快照)。我从来没有调查过,现在看来Chrome的效果和预期的一样。。。
var lastTickTime = new Date();

setInterval(function () {
    var currentTickTime = new Date();

    // Difference is arbitrary and shouldn't be too small, here I suppose
    // a 5 seconds timer with a maximum delay of 10 seconds.
    if ((currentTickTime - lastTickTime) / 1000 > 10) {
        // Perform logout
    }

    lastTickTime = currentTickTime;
}, 5000);