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

ASP.Net中客户端会话超时重定向,asp.net,session,timeout,forms-authentication,Asp.net,Session,Timeout,Forms Authentication,我想建立一种方法,当用户的会话因不活动而过期时,自动将用户重定向到Timeout.aspx。我的应用程序使用表单身份验证,并且在很大程度上依赖同一aspx页面中的更新面板进行用户交互,因此我不想在页面级计时器过期后简单地重定向。出于同样的原因,我不能使用“” 我要做的是创建一个简单的AJAXWeb服务,使用一个名为IsSessionTimedOut()的方法,该方法只返回一个布尔值。我将使用javascript计时器定期调用该方法,如果返回true,则重定向到Timeout.aspx。但是,我不

我想建立一种方法,当用户的会话因不活动而过期时,自动将用户重定向到Timeout.aspx。我的应用程序使用表单身份验证,并且在很大程度上依赖同一aspx页面中的更新面板进行用户交互,因此我不想在页面级计时器过期后简单地重定向。出于同样的原因,我不能使用“”


我要做的是创建一个简单的AJAXWeb服务,使用一个名为IsSessionTimedOut()的方法,该方法只返回一个布尔值。我将使用javascript计时器定期调用该方法,如果返回true,则重定向到Timeout.aspx。但是,我不希望调用此方法来重置会话超时计时器,否则会话将永远不会因为服务调用而超时。有没有一个干净的方法来避免这种第二十二条军规?希望有一个简单的解决方案,到目前为止我还没有找到。

服务器端会话过期时超时真的很重要吗

如果您只是想强制用户刷新会话或超时,我会使用window.setTimeout()在设置的时间后重定向到Timeout.aspx。Timeout.aspx的codebehind可以调用Session.Abort()来终止会话,这将强制用户在想要继续时重新登录


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

我认为如果为web服务启用会话状态,然后在global.asax中将SessionStateBehavior设置为只读。如果web服务被命中,您应该很好。在生命周期的早期,您需要这样做


我认为你走错了方向。。。如果您绝对不能使用简单的元刷新(到目前为止,这是最简单的处理方法),那么只需处理AJAX方法返回指示会话超时的值的情况。为什么你需要一个额外的机制来实现这一点?我对UpdatePanel不太熟悉。。。但是,如果会话过期时更新失败,您当然可以发回一些“嘿,伙计,您需要再次登录”的消息?

这是迄今为止我提出的最好的解决方案,但我对更好的解决方案持开放态度。基本上,我有一个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>

var redirectTimer=setTimeout('redirectToLogout()',900000);
函数redirectToLogout(){
window.location=“/logout.aspx”;
}
函数ResetTimeoutTimer(){
clearTimeout(重定向定时器);
redirectTimer=setTimeout('redirectToLogout()',900000);
}
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(ResetTimeoutTimer);

问题的关键在于,在AJAX应用程序中,为了提供强健的用户体验,您必须用大量的代码来检查每个调用的状态,并确定失败是否是由于过时的会话/票据造成的。通过积极主动的方法,您的客户端脚本可以大大简化,同时提供更好的用户体验

我专门为这个问题建立了一个解决方案

它允许交互式会话并形成票证生存期审核,而不影响会话或票证

多个浏览器/选项卡没有问题

忘记防晒霜;记住:在使用Ajax时,要积极主动-您应该放弃会话,会话不应该放弃您;-)


很好的解决方案,但我认为如果用户打开了多个选项卡或窗口,它就会崩溃。后台选项卡可能导致意外注销。这是一个好主意。。。不幸的是,它似乎只在.NET4.0中可用,我的目标是3.5。我的目标是.NET4.6。您是否尝试过这个方法,它是否真的有效?处理ajax返回值是不够的,因为我需要浏览器在一段时间不活动后(例如当用户起床离开计算机时)自动重定向到Timeout.aspx。在这种情况下,不会有对服务器的任何ajax调用,对于这样的事情,没有一种干净或正确的方法。称之为“架构的产物”…@all-有一种干净而正确的方法来处理这个问题。你只需要从另一个角度来看,这看起来很有希望。我从未想过在混合中引入HttpModule。谢谢@水星-非常欢迎你。我很高兴它可以使用。@SkySanders您的项目也可以在配置为StateServer的asp.net会话状态中的回调和回发场景中工作吗?如果是的话,我想讨论一下。致以最良好的祝愿