手动更新表单身份验证票证:

时间:2012-06-08 08:50:06

标签: asp.net forms-authentication httpcookie

表单身份验证票证过早出现的另一个问题。 我需要使用滑动Expiration设置为true。我已阅读论坛并了解精度损失的问题,如果请求仅在到期时间的一半之后进行,则只会更新故障单。

问题: 在我的webconfig中,我有以下内容:

    <authentication mode="Forms">
        <forms timeout="20" name="SqlAuthCookie" protection="All" slidingExpiration="true" />
    </authentication>
    <sessionState timeout="20" />
    <authorization>

只有在20分钟间隔内没有请求时,才能注销用户并将其重定向到login.aspx。问题是用户正在发出请求,但仍然会被抛到登录页面。这不应该发生。我想做的是为每个请求手动重置SqlAuthCookie。

以下是我的代码。它在context.AcquireRequestState。

上调用
    void context_AcquireRequestState(object sender, EventArgs e)
    {
        HttpContext ctx = HttpContext.Current;
        ResetAuthCookie(ctx);
     }

            private void ResetAuthCookie(HttpContext ctx)
    {
        HttpCookie authCookie = ctx.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie == null)
            return;

        FormsAuthenticationTicket ticketOld = FormsAuthentication.Decrypt(authCookie.Value);
        if (ticketOld == null)
            return;

        if (ticketOld.Expired)
            return;

        FormsAuthenticationTicket ticketNew = null;
        if (FormsAuthentication.SlidingExpiration)
           ticketNew = FormsAuthentication.RenewTicketIfOld(ticketOld);

        if (ticketNew != ticketOld)
            StoreNewCookie(ticketNew, authCookie, ctx);
    }

    private void StoreNewCookie(FormsAuthenticationTicket ticketNew, HttpCookie authCookie, HttpContext ctx)
    {
        string hash = FormsAuthentication.Encrypt(ticketNew);
        if (ticketNew.IsPersistent)
            authCookie.Expires = ticketNew.Expiration;

        authCookie.Value = hash;
        authCookie.HttpOnly = true;

        ctx.Response.Cookies.Add(authCookie);
    }

我的问题是:

  1. 是错误还是可接受的解决方案,在每次请求时重置cookie?
  2. 为什么它仍然不起作用?似乎新的Ticket永远不会更新。
  3. 是否有其他可能的原因,因为用户的表单身份验证过早过期,我应该调查一下?
  4. 谢谢你, 的问候,

1 个答案:

答案 0 :(得分:14)

表单身份验证Cookie仅在其过期时间过半后自行续订。

来自Microsoft:

  

如果在到期时间的一半之前访问网页,   票证到期时间不会被重置。例如,如果有任何Web   页面将在下午5:04 00:00:00再次访问,cookie和票证   超时时间不会被重置。

     

防止性能受损,并避免多个浏览器   对于已启用cookie警告的用户的警告,cookie为   超过指定时间的一半时更新。

这可能是你的问题。如果您的客户在9分钟内访问您的网站,并且再次访问该网站10分钟,他们就会超时。即使您将会话超时设置为20分钟,也会发生这种情况。

像您一样手动更新机票并不是必要的。您只需要启用滑动过期。如果具体时间的一半&#39;规则不适合你,那么你必须看看其他解决方案。