如何防止Ajax调用使会话保持活动状态?

时间:2014-05-04 17:24:52

标签: ajax asp.net-mvc-5

我在MVC5中使用Cookie身份验证。我的网页每隔1-5秒就严重依赖经过身份验证和未经身份验证的Ajax调用来保持数据更新。因此,我的用户永远不会退出该网站。

我的理想情况:如果用户正在我的网站上主动浏览或执行操作,请保持会话处于活动状态。如果他们在10分钟后打开了一个页面,我希望他们的会话超时,我将使用失败的Ajax调用重定向到登录页面。我认为最好在控制器或行动层面完成。

我尝试按照下面的建议控制会话状态行为,但会话仍然没有超时。在每秒点击ReadOnly / Public一次65秒后,我调用ReadOnly / Authorized并成功从中检索数据。

这是我的CookieAuthentication配置。

public void ConfigureAuth(IAppBuilder app)
{
    // Enable the application to use a cookie to store information for the signed in user
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        ExpireTimeSpan = TimeSpan.FromMinutes(1),
    });
}

我的测试页:

<div id="public"></div>
<div id="authorized"></div>


@section scripts{
<script>

function poll(times) {
    var url = '/ReadOnly/Public';
    $.ajax({
        url: url,
        dataType: 'json',
        data: null,
        cache: false,
        success: function (data) {
            $('#public').html(times + ' ' + data.test);

        },
        error: function (data) {
            $('#public').html(times + ' ' + 'failed');
        }
    });
};

function checkAuth(times) {
    var url = '/ReadOnly/Authorized';
    $.ajax({
        url: url,
        dataType: 'json',
        data: null,
        cache: false,
        success: function (data) {
            $('#authorized').html(times + ' ' + data.test);

        },
        error: function (data) {
            $('#authorized').html(times + ' ' + 'failed');
        }
    });
};

$(function () {
    var times = 1;
    setInterval(function () {
        poll(times);
        times++;
    }, 1000);
    setInterval(function () {
        checkAuth(times);
    }, 65000);

});
</script>
}

和测试控制器代码(尝试使用禁用和只读选项)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.SessionState;

namespace SessionTest.Controllers
{
[SessionState(SessionStateBehavior.ReadOnly)]
public class ReadOnlyController : Controller
{
    [Authorize]
    public ActionResult Authorized()
    {
        return Json(new
        {
            test = "ReadOnly and Authorized"
        }, JsonRequestBehavior.AllowGet);
    }

    public ActionResult Public()
    {
        return Json(new
        {
            test = "ReadOnly and Public"
        }, JsonRequestBehavior.AllowGet);
    }
}
}

5 个答案:

答案 0 :(得分:3)

也许您需要拥有2个独立的网络应用。一个用于提供经过身份验证的请求。另一个是所有公开要求。

这类似于Google Analytics脚本在Google网站上创建和维护自己的关于您网站的会话的方式,而不会影响您的网络应用程序的内部会话管理。否则,您将无法处理ASP .NET的默认行为,就像它处理cookie并保持会话活动一样。

祝你好运。

答案 1 :(得分:2)

在这种情况下我不会实现超时。事实上,我试图避免它们,除非有必要的基本和关键原因,否则它们只会变成烦恼。

但是如果你觉得你需要一个,我会在这种情况下实现它,通过创建一个单独的javascript函数,它具有一个计时器,并通过用户输入重置。如果计时器完成,则执行ajax调用,该调用在服务器端执行手动会话失效。

答案 2 :(得分:2)

我会将侦听器方法或类配置为不使用会阻止它被扩展的会话。

可用于提供不同会话模式的方法和控制器的属性。

更多信息: http://www.dotnet-tricks.com/Tutorial/mvc/906b060113-Controlling-Session-Behavior-in-Asp.Net-MVC4.html

答案 3 :(得分:2)

Ajax调用将使会话保持活跃状态​​。

一种方法是在客户端设置超时以在一段时间后删除cookie。 我不确定你有更多的选择。

如果每5秒的呼叫仅针对未经过身份验证的请求,则只需将cookie保留在ajax请求之外。

答案 4 :(得分:0)

我认为默认情况下滑动过期设置为true。

我想也许在对公共行动进行的通话时,它是用cookie制作的,从而延长了超时时间。

    public ActionResult Public()
    {
        return Json(new
        {
            test = "ReadOnly and Public"
        }, JsonRequestBehavior.AllowGet);
    }

如果我在下面设置:( SlidingExpiration = false)。我收到了失败的消息。

       app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            ExpireTimeSpan =  TimeSpan.FromMinutes(1.0),
            SlidingExpiration = false
            //Provider = new CookieAuthenticationProvider
            //{
            //    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            //        validateInterval: TimeSpan.FromMinutes(30),
            //        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            //}
        });