0

我在网站上使用 C# 通过 FormsAuthenticationTicket 创建会话。

FormsAuthenticationTicket 的票证代码如下

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, 
                                                                 model.UserName,
                                                                 DateTime.Now,
                                                                 DateTime.Now.AddMinutes(30),
                                                                 false,
                                                                 admin.Role);
string encTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) {   Expires = ticket.Expiration });

网站的每一部分都继承了 Site.Master,所以我想在这些行中添加一些东西到 Site.Master

$(document).ready(function() {
    $(window).bind('mousemove mouseclick keydown mousewheel', idle);
});

function idle(e) {
    if (window.idleTimeout) {
        clearTimeout(window.idleTimeout);
    }
    <%= FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity;  %>
    <%= FormsAuthentication.RenewTicketIfOld(identity.Ticket); %>
    window.idleTimeout = setTimeout(userIdle, 900000);
}
function userIdle() {
    //either do stuff here or trigger the "idle" event
    $(window).trigger('idle');
}

这不起作用。它不能使用 FormsIdentity 因为我不能“使用 System.Web.Security;” 这里。

是否有任何类似的逻辑可以用来在按键和鼠标事件等事件上不断刷新票证?

仅供参考:如果我去网站的其他部分,票不会过期,所以这不是问题。只有当人们使用 40 分钟完成表格然后尝试提交并失去所有进度时。当然我可以增加超时时间,但这不是我想要做的。

4

1 回答 1

0

您可以向服务器发送 AJAX 请求以刷新 cookie:

function idle(e) {
    if (window.idleTimeout) {
        clearTimeout(window.idleTimeout);
    }
    $.ajax({
        url: '<%= Url.Action("RenewCookie") %>',
        type: 'POST'
    });
    window.idleTimeout = setTimeout(userIdle, 900000);
}

然后在您的服务器上,您将有一个控制器操作来执行必要的步骤。但请注意,在每次击键或鼠标滚轮时使用 AJAX 请求攻击您的服务器可能是毁灭性的。

于 2013-01-11T11:16:44.427 回答