ASP.Net中的客户端会话超时重定向

时间:2010-05-17 19:28:06

标签: asp.net session timeout forms-authentication

我想构建一种方法,在会话因不活动而到期时自动将用户重定向到Timeout.aspx。我的应用程序使用表单身份验证,并且在相同的aspx页面中严重依赖于用户交互的更新面板,因此我不想在页面级计时器到期后简单地重定向。出于同样的原因,我不能使用'< meta http-equiv =“refresh”/>'

我想要做的是使用名为IsSessionTimedOut()的方法创建一个简单的ajax Web服务,它只返回一个布尔值。我将使用javascript计时器定期调用该方法,如果它返回true,则重定向到Timeout.aspx。但是,我不希望调用此方法来重置会话超时计时器,或者由于服务调用会话永远不会超时。是否有一种干净的方法来避免这种捕获-22?希望有一个简单的解决方案到目前为止还没有找到我。

5 个答案:

答案 0 :(得分:9)

问题的关键在于,在AJAX应用程序中,为了提供强大的用户体验,您必须使用大量代码检查每个调用的状态并确定是否由于过时的会话/票证导致的故障而使客户端脚本混乱。通过主动方法,您的客户端脚本可以大大简化,同时提供更好的用户体验。

我特意为这个问题建立了一个解决方案。

它允许交互式会话和表单票证生命周期审核,而不会碰撞会话或票证。

多个浏览器/标签都没有问题。

忘掉防晒霜;记住:在做Ajax时,要积极主动 - 你应该放弃一个会话,一个会话不应该放弃你; - )

AsynchronousSessionAuditor 1.0

答案 1 :(得分:2)

这是迄今为止我提出的最佳解决方案,但我对更好的事情持开放态度。基本上,我有一个15分钟的javascript计时器,每次异步回发都会重置。这种方法的缺点是,即使用户在另一个浏览器窗口中主动使用该应用程序,在后台打开的第二个选项卡或窗口也会导致会话结束。

类似的东西存在于我的母版页面上。最后一行javascript添加了我的重置函数,以便在任何更新面板刷新时触发:

        <asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Release" OnAsyncPostBackError="ScriptManager1_AsyncPostBackError">
        <Scripts >
            <asp:ScriptReference Path="~/scripts/jquery/jquery-1.3.2.min.js" />
        </Scripts>
        </asp:ScriptManager>

        <script type="text/javascript">

        var redirectTimer = setTimeout('redirectToLogout()', 900000);

        function redirectToLogout() {
            window.location = "/logout.aspx";
        }

        function ResetTimeoutTimer() {
            clearTimeout(redirectTimer);
            redirectTimer = setTimeout('redirectToLogout()', 900000);
        }


        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(ResetTimeoutTimer);

       </script>

答案 2 :(得分:0)

服务器端会话到期时,超时是否真的很重要?

如果您只想强制用户刷新会话或将其计时,我会在设定的时间后使用window.setTimeout()重定向到Timeout.aspx。 Timeout.aspx的代码隐藏可以调用Session.Abort()来终止会话,如果他们想要继续,将强制用户重新登录。

我认为这种方法实际上比会话超时更加准确和可靠,根据我的经验,这会因服务器负载和其他因素而异。

答案 3 :(得分:0)

我认为如果您为Web服务启用会话状态,然后将SessionStateBehavior设置为只在您的global.asax中读取,如果Web服务被命中,您应该是好的。您需要在生命周期的早期执行此操作。

http://msdn.microsoft.com/en-us/library/system.web.httpcontext.setsessionstatebehavior(v=VS.100).aspx

答案 4 :(得分:0)

我认为你的方法是错误的...如果你绝对不能使用简单的元刷新(到目前为止最简单的处理方式),那么只需处理你的AJAX方法返回值的情况表明你的会话已经超时。为什么你需要一个额外的机制才能做到这一点?我对UpdatePanel并不熟悉......但如果会话过期后更新失败,你肯定可以发回一些“嘿pardner,你需要再次登录”的消息吗?