如何在ASP.NET中处理表单身份验证超时异常?

ale*_*nso 10 .net c# asp.net forms-authentication exception

如果会话已过期且用户单击指向另一个webform的链接,则asp.net身份验证会自动将用户重定向到登录页面.

但是,有些用户没有点击指向其他网络表单的链接.例如:在gridviews中编辑链接,当使用带有文本框的AutoCompleteExtender并且应用程序尝试获取信息时,基本上,在每种情况下,当回发完成并且事件不是由asp.net身份验证自动处理时.

处理这些异常的最佳方法是什么?

更新:我刚刚修改了问题标题:表单身份验证超时,而不是初始会话超时.谢谢你让我意识到这种差异.

更新:我刚刚针对我面临的具体问题创建了一个新问题:如何使用UpdatePanel处理因过期身份验证票据而导致的异常?.令人惊讶的是,我没有找到关于它的更多信息.我将衷心感谢您的帮助.

Ada*_*SFT 10

这就是为什么许多系统在页面上包含计时器以给出大致的超时时间.交互式页面很难实现.你真的需要挂钩ajax函数并查看返回状态代码,这有点困难.一种替代方法是使用基于以下内容的代码,该代码在页面生命周期的早期运行并执行ajax重定向到登录页面.否则你会试图拦截来自ajax和asp.net的返回代码,其中ajax是为你做的(即不是像jQuery这样的手动方法)你会失去这种易于检测的能力.

http://www.eggheadcafe.com/tutorials/aspnet/7262426f-3c65-4c90-b49c-106470f1d22a/build-an-aspnet-session-timeout-redirect-control.aspx

快速入侵你可以直接在pre_init http://forums.asp.net/t/1193501.aspx上试试

编辑 表单身份验证超时所需的内容,而不是会话超时.表单身份验证超时的运行时间与会话超时不同.会话超时随每个请求更新.表格身份验证票据实际上没有更新,直到有一半的时间流逝.因此,如果您将超时设置为一小时并在一个请求中发送25分钟,则会话将重置为一小时超时,表单身份验证票未触及并在35分钟后到期!要解决此问题,请同步会话超时和表单身份验证票证.这样您仍然可以只检查会话超时.如果您不喜欢这样,那么仍然 - 执行以下操作并同步超时,然后解析身份验证票并读取其超时.您可以使用FormsAuthentication.Decrypt执行此操作 - 请参阅:

从asp.net代码后面读取表单身份验证cookie

请注意,此代码要求在登录时设置一些会话值 - 在本例中为"UniqueUserId".同时更改下面的登录页面路径以适合您的.


protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            //Only access session state if it is available
            if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState)
            {
                //If we are authenticated AND we dont have a session here.. redirect to login page.
                HttpCookie authenticationCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
                if (authenticationCookie != null)
                {
                    FormsAuthenticationTicket authenticationTicket = FormsAuthentication.Decrypt(authenticationCookie.Value);
                    if (!authenticationTicket.Expired)
                    {
                        if (Session["UniqueUserId"] == null)
                        {
                            //This means for some reason the session expired before the authentication ticket. Force a login.
                            FormsAuthentication.SignOut();
                            Response.Redirect("Login.aspx", true);
                            return;
                        }
                    }
                }
            }
        }