手动更新表单认证票据:

12

又一个关于表单认证票据过早过期的问题。我需要使用滑动过期,并将其设置为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. 除了会话过期之外,用户表单身份验证过期太快的原因可能还有其他原因,我应该进行调查吗?

谢谢, 敬礼,


你正在使用哪个版本的框架和IIS? - Imran Rizvi
项目的目标框架是4.0。IIS版本为7,但我正在使用Visual Studio 2010内置的Web服务器进行测试。 - Amc_rtty
我认为你应该在表单标签中添加domain属性。不需要在每个请求上写入更新cookie。 - Imran Rizvi
请详细说明为什么每次请求都不应该更新cookie。我正在查看域属性的文档,但我不知道它如何解决这个问题。谢谢。 - Amc_rtty
1个回答

16

表单身份验证 cookie 仅在其到期时间的一半过去后才会更新自身。

来自微软的解释:

 

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

    

为防止性能受损,并避免对已打开 cookie 警告的用户多次显示浏览器警告,当超过指定时间的一半时,cookie 将被更新。

这可能是你面临的问题。如果你的客户在9分钟标记处访问你的站点,然后10分钟内不再访问,他们将会超时。即使你的会话超时设置为20分钟,也会发生这种情况。

手动更新票证并不是必要的。你只需要启用滑动过期即可。如果“指定时间的一半”规则对你不起作用,那么你必须寻找其他解决方案。


1
我们遇到了同样的问题。在看到这篇文章之前,我看到了微软的一篇文章。大部分信息都在这里。https://support.microsoft.com/zh-cn/kb/910443 - Shrini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接