代码之家  ›  专栏  ›  技术社区  ›  Joel Etherton

ASP.NET FormsAuthentication Redirect在重定向和应用程序验证请求之间丢失cookie

  •  3
  • Joel Etherton  · 技术社区  · 15 年前

    我有一个表单身份验证cookie,它是持久的,在开发、测试和生产环境中独立工作。我有一个可以进行身份验证的用户,创建用户对象,将身份验证cookie添加到响应中:

    'Custom object to grab the TLD from the url
    authCookie.Domain = myTicketModule.GetTopLevelDomain(Request.ServerVariables("HTTP_HOST"))
    FormsAuthentication.SetAuthCookie(authTicket.Name, False)
    Response.SetCookie(authCookie)
    

    用户将得到一点处理,以检查第一次登录、安全问题等,然后使用以下tiddit进行重定向:

    Session.Add("ForceRedirect", "/FirstTimeLogin.aspx")
    Response.Redirect("~/FirstTimeLogin.aspx", True)
    

    通过调试中断,我可以验证cookie集合是否包含与我为不同目的设置的身份验证无关的cookie和FormsAuthentication cookie。然后在global.asax中的applicationAuthenticateRequest中执行该过程的下一步:

    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
        Dim formsCookieName As String = myConfigurationManager.AppSettings("FormsCookieName")
        Dim authCookie As HttpCookie = Request.Cookies(formsCookieName) 
    

    此时,对于这一个用户来说,authcookie什么都不是。我还有15000个其他用户没有受到这种影响。然而,对于一个用户来说,cookie只是消失了,没有任何痕迹。我以前见过w3wp.exe异常、状态服务器异常和其他与IIS进程相关的异常,但在事件日志中没有得到异常。W3wp.exe没有崩溃,状态服务器有一些超时,但它们似乎不相关(由时间戳验证),并且它只发生在这一个域上的这一个用户身上(此代码在两个不同的TLD上使用,大约有10个子域)。

    我正在调查的一个方法是饼干可能太大了。我认为在响应中会有一个关于cookie大小的检查,我不认为它会以这种方式影响它。你知道为什么请求会丢弃cookie吗?

    注意:我提到的第二个cookie也会被丢弃(非常小)。

    edit-note:发生这种情况时,会话令牌不会丢失。但是,由于身份验证cookie丢失,因此在后续登录时将忽略并替换它。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Joel Etherton    15 年前

    事实证明,为这个特定用户转储到cookie中的cookie数据恰好超过了其加密格式中允许的最大大小。未加密,数据适合,但一旦加密在上面运行,大小就变得太大,无法处理。这导致cookie和在其之后添加的所有cookie从响应头中删除。

    切断注入cookie的数据量解决了这个问题。

        2
  •  0
  •   Romhein    15 年前

    一个潜在的问题是您重定向的方式;通过将布尔值设置为true,您发送一个threadabortexception,您可能会丢失会话令牌。将布尔值设置为 false 或使用 FormsAuthentication.RedirectFromLoginPage