如何在javascript中处理MVC3中的会话超时?

时间:2013-01-02 07:58:44

标签: asp.net-mvc-3 session-timeout

在我的应用程序中,这就是我们到目前为止处理会话超时的方式

<authentication mode="Forms">
    <forms loginUrl="~/Account/LogOn" timeout="20" />
</authentication>

现在我想在客户端处理会话时间,就像这样

<authentication mode="Forms">
   <forms loginUrl="showPopup();" timeout="20" />
</authentication>

这可能,或任何其他建议的方法来实现这一目标吗?

修改

我访问了同类型的其他问题,但无法从他们那里得到任何真正的帮助。

2 个答案:

答案 0 :(得分:2)

  

在我的应用程序中,这就是我们到目前为止处理会话超时的方式

很好,这是在web.config中定义表单身份验证的正确方法

  

可能吗

不,抱歉,将javascript放入loginUrl属性是毫无意义的。

  

或任何其他建议的实现方式

根据我的理解,如果会话已过期,您将尝试使用某些javascript函数显示LogOn表单。

您应该区分两种类型的服务器请求:

  1. 标准同步请求(锚点,表单,重定向,......)
  2. 异步请求(AJAX - 使用javascript完成)
  3. 在服务器端的这两种情况下,您应该通过使用[Authorize]属性进行装饰来保护需要身份验证的操作。例如:

    [Authorize]
    public ActionResult SomeAction()
    {
        ...
    }
    

    一旦您保护了服务器,就可以开始考虑如何处理表单身份验证cookie过期,或者仅仅是匿名用户尝试调用此操作的情况。

    对于第一个对服务器进行标准同步调用的情况,表单身份验证模块将拦截请求,如果用户未经过身份验证或其会话已过期,ASP.NET将自动将您重定向到您在服务器中定义的LogOn页面。 loginUrl属性。它还将作为ReturnUrl查询字符串参数传递给此操作,该操作将指向用户最初请求的URL并且尚未对其进行授权。然后,此参数可用于在经过身份验证后将其重定向回此页面。

    现在第二种情况有点困难,因为ASP.NET自动将请求重定向到LogOn页面,你无法知道你的AJAX成功回调,用户未被授权,服务器将请求重定向到登录页面。 Phil Haack写了一篇关于如何阻止AJAX请求重定向的excellent article。我邀请你现在阅读这篇文章。

    好了,既然你已经阅读了这篇文章并安装了他的NuGet(Install-Package AspNetHaack),假设你正在为你的AJAX请求使用jQuery,你可以订阅.ajaxComplete()全局事件处理程序。在此处理程序中,您可以测试服务器响应代码,如果它是401,则表示用户未经授权。所以你可以采取相应的行动:

    <script type="text/javascript">
        $(document).ajaxComplete(function(event, xhr, ajaxOptions) {
            if (xhr.status == 401) {
                // the AJAX request failed because either the user was not
                // authenticated or his session expired. So here you could
                // do whatever you want. For example you could redirect him
                // to the loginUrl defined in your web.config file:
    
                window.location.href = '@FormsAuthentication.LoginUrl';
    
                // you also have the possibility to show this logon form
                // inside a popup or render it inline inside the page,
                // by sending an AJAX request to this action and retrieving the
                // corresponding partial
            }
        });
    </script>
    

答案 1 :(得分:0)

此配置区域用于配置服务器端行为,该行为在服务器尝试处理会话已过期的请求时发生。这是客户的结果 - &gt;服务器请求页面。由于客户端是Web浏览器,并且设计与服务器断开连接,因此您必须在每个页面中包含所需的逻辑(可能在主布局模板中),然后以重复的间隔向服务器进行AJAX调用以确定用户的会话超时状态。弹出窗口也将在客户端处理。

这个配置区域可能无法帮助您实现目标,我只需完全删除<forms>元素,然后使用对服务器的AJAX调用来解决问题。