1

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

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

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

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

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

编辑

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

4

2 回答 2

2

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

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

那可能吗

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

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

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

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

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

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

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

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

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

现在第二种情况有点困难,因为由于 ASP.NET 自动将请求重定向到 LogOn 页面,您无法在 AJAX 成功回调中知道用户未被授权并且服务器将请求重定向到 LogOn 页面。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>
于 2013-01-02T09:24:32.313 回答
0

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

这个配置区域可能不会帮助您实现目标,我将完全删除该<forms>元素并考虑使用对服务器的 AJAX 调用来解决问题。

于 2013-01-02T09:09:05.230 回答