【问题标题】:How to handle session timeout in MVC3 in javascript?如何在 javascript 中处理 MVC3 中的会话超时?
【发布时间】:2013-01-02 07:58:43
【问题描述】:

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

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

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

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

这可能吗,或任何其他建议的方式来实现这一点?

编辑

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

【问题讨论】:

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


    【解决方案1】:

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

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

    这可能吗

    不,抱歉,将 javascript 放在 loginUrl 属性中是没有意义的。

    或任何其他建议的方式来实现这一点

    据我了解,如果会话已过期,您正在尝试使用一些 javascript 函数显示登录表单。

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

    1. 标准同步请求(锚点、表单、重定向...)
    2. 异步请求(AJAX - 使用 javascript 完成)

    在服务器端的这两种情况下,您都应该使用[Authorize] 属性来保护需要身份验证的操作。例如:

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

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

    对于服务器的标准同步调用的第一种情况,表单身份验证模块将拦截请求,如果用户未通过身份验证或其会话过期,ASP.NET 将自动将您重定向到您在loginUrl 属性。它还将作为 ReturnUrl 查询字符串参数传递给此操作,该操作将指向用户最初请求的 url,但他尚未获得授权。一旦他通过了身份验证,这个参数就可以用来将他重定向回这个页面。

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

    好的,既然您已经阅读了这篇文章并安装了他的 NuGet (Install-Package AspNetHaack),假设您使用 jQuery 处理您的 AJAX 请求,您可以订阅 .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>
    

    【讨论】:

    • 谢谢@Darin,实际上我是不允许使用这个包的当前正在打开哪个页面,可能在 _layout.cshtml 页面中。我没有办法做到这一点。
    • 如果您不允许使用该包,则只需从包中获取代码并将其添加到您的项目中。这是一个文件。
    【解决方案2】:

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

    此配置区域可能无法帮助您实现目标,我将完全删除 &lt;forms&gt; 元素并考虑使用对服务器的 AJAX 调用来解决问题。

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 2011-09-25
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多