表单例份验证票证的另一个问题是过期太早。
我需要使用将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);
    }

我的问题是:
  • 是错误的还是可接受的解决方案,请在每个请求上重置cookie?
  • 为什么仍然不起作用?看来新票从未更新过。
  • 是否还有其他原因可能导致我应进行调查,原因是用户的表单例份验证过早过期。

  • 谢谢,
    问候,

    最佳答案

    表单例份验证cookie仅在其过期时间的一半过后才进行自我更新。

    从Microsoft:



    这可能是您的问题。如果您的客户在9分钟标记处访问您的站点,而又在10分钟内没有再次访问该站点,则它们将超时。即使您将 session 超时设置为20分钟,也会发生这种情况。

    无需像您一样手动更新票证。您只需要启用滑动到期。如果“半数特定时间”规则对您不起作用,那么您将不得不考虑其他解决方案。

    关于asp.net - 手动续订表单例份验证票:,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10945715/

    10-12 01:44