【问题标题】:forms authentication cookie replacement表单身份验证 cookie 替换
【发布时间】:2013-03-28 09:20:44
【问题描述】:

在更新表单身份验证票且旧票已过期后,我遇到了用户被踢出的问题。 我登录时得到的第一张票是:

机票:A094D6F0401A5B6D97688198B09F17B03D209............ 结束:格林威治标准时间 2013 年 3 月 28 日星期四 08:56:33

过了一段时间,票被更新,我得到了这个 cookie:(当票过期时,cookie 过期,所以没有问题)

票:215373E662852AD0CC540AC27F547787...... 结束:格林威治标准时间 2013 年 3 月 28 日星期四 08:58:17

此票证由后台的 javascript 重新加载器为用户更新。现在,如果我更新页面,我将被踢出,为什么? 当我更新票时,我使用这个:

        var Id = (FormsIdentity)HttpContext.Current.User.Identity;
        var Ticket = Id.Ticket;

        var NewAuthTicket = FormsAuthentication.RenewTicketIfOld(Ticket);

        HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(NewAuthTicket), new[] {""});

        if (NewAuthTicket != null && NewAuthTicket.Expiration > Ticket.Expiration)
        {
            // Create the (encrypted) cookie.
            var ObjCookie = new HttpCookie(FormsAuthentication.FormsCookieName,
                                           FormsAuthentication.Encrypt(NewAuthTicket))
                                {
                                    HttpOnly = true,
                                    Expires = NewAuthTicket.Expiration,
                                    Secure = FormsAuthentication.RequireSSL
                                };
            // Add the cookie to the list for outbound response. 
            HttpContext.Current.Response.Cookies.Add(ObjCookie);
            Ticket = NewAuthTicket;
         }

有什么解决办法吗?

更新:

当我第一次设置 cookie 时,我使用这个:

var ExpiryDate = !rememberMe ? DateTime.Now.AddMinutes(cookieTimeoutHour) : DateTime.Now.AddYears(1);

                //create a new forms auth ticket
                var Ticket = new FormsAuthenticationTicket(2, ui.UserNr.ToString(CultureInfo.InvariantCulture), DateTime.Now, ExpiryDate, true, String.Empty);
                //encrypt the ticket
                var EncryptedTicket = FormsAuthentication.Encrypt(Ticket);
                //create a new authentication cookie - and set its expiration date
                var AuthenticationCookie = new HttpCookie(FormsAuthentication.FormsCookieName, EncryptedTicket)
                                               {
                                                   Expires = Ticket.Expiration,
                                                   HttpOnly = true,
                                                   Secure = FormsAuthentication.RequireSSL
                                               };


                Current.Response.Cookies.Add(AuthenticationCookie);

【问题讨论】:

    标签: c# asp.net cookies


    【解决方案1】:

    当客户端页面上的简单保持活动可以保持表单身份验证 cookie 活动时,为什么要付出所有努力?

    jQuery 示例:

    $(function() {
        window.setInterval(keepalive, 600000); // run keepalive every 10 mins
    });
    
    function keepalive()
    {
       $.get({url:'/myemptykeepalivepage.aspx',cache:false});
    }
    

    当客户端关闭浏览器时,间隔功能被取消,瞧,forms auth ticket自然会过期。

    【讨论】:

    • 我已经尝试过了。我在web.config中使用了slidingExpiration="true",并没有使用上面的代码,但是随后更新了ticket,但不是cookie的过期时间。并且当cookie过期时,用户被踢出。当我使用我的代码时,票证超时和 cookie 超时被延长,但用户仍然被踢出。为什么?
    • 使用上面的代码(把它放在一个脚本文件中,该文件从您网站中每个页面的 head 标签中引用)。该代码与slidingExpiration="true" 相结合将解决您的问题(当然,您必须检查上面的代码运行的频率是否高于表单票的超时)
    • (上面的所有代码都是确保用户至少每 10 分钟访问一次 Web 服务器,从而强制表单票证保持“活动”)
    • 好的,我会再试一次。但是当我创建第一个cookie时没有错吗? (我更新了我的问题)
    • 谢谢,我会尝试更简单的方法 =)
    猜你喜欢
    • 1970-01-01
    • 2014-04-01
    • 2011-06-11
    • 2012-07-25
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 2013-09-16
    相关资源
    最近更新 更多