2013-01-02 50 views
1

在我的应用程序,这是我们如何处理会话超时至今如何在JavaScript中处理MVC3中的会话超时?

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

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

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

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

编辑

我参观了同类型的其他问题,但不能从他们那里得到任何实际的帮助。

回答

0

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

这方面的配置可能不会帮助您达到目标,我只是完全删除<forms>元素,并着眼于解决使用AJAX调用服务器的问题。

2

在我的应用程序,这是我们如何处理会话超时至今

大,这是在web.config中定义窗体身份验证的正确方法

这是可能的

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

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

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

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

  1. 标准同步请求(锚,形式,重定向,...)
  2. 异步请求(AJAX - 通过使用JavaScript实现)

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

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

一旦你已经获得你的服务器,你可以开始思考如何处理窗体身份验证cookie到期或匿名用户试图调用这个动作的简单情况。

对于标准同步调用服务器的第一种情况,表单身份验证模块将拦截请求,如果用户未通过身份验证或者会话过期,ASP.NET会自动将您重定向到您已定义的LogOn页面loginUrl属性。它也将作为ReturnUrl查询字符串参数传递给此操作,该操作将指向用户原先请求的url并且尚未授权他。这个参数可以用来在他认证之后将他重定向回这个页面。

现在第二种情况有点困难,因为ASP.NET自动将请求重定向到LogOn页面,您无法知道AJAX成功回调中用户未被授权,并且服务器将请求重定向到LogOn页面。菲尔哈克写了一个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> 
+0

感谢@Darin,其实我不允许:(我想我的问题也可以,如果我能先手运行定时器sitewise的方式解决使用包它应该无论当前打开哪个页面,都可以在_layout.cshtml页面中持续运行。 –

+0

如果您不允许使用该软件包,那么只需从软件包中获取代码并将其添加到你的项目,它是一个单一的文件。 –