【问题标题】:ASP.Net FormsAuthentication Redirect Loses the cookie between Redirect and Application_AuthenticateRequestASP.Net FormsAuthentication Redirect 丢失 Redirect 和 Application_AuthenticateRequest 之间的 cookie
【发布时间】:2011-01-14 12:54:34
【问题描述】:

我有一个持久的 FormsAuthentication 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)

对用户进行一些处理以检查首次登录、安全问题等,然后使用以下花絮进行重定向:

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) 

此时,对于这个 ONE 用户,authCookie 什么都不是。我有 15,000 名其他用户没有受到这种方式的影响。然而,对于一个用户来说,cookie 就消失得无影无踪了。我之前在 w3wp.exe 异常、状态服务器异常和其他与 IIS 进程相关的异常中看到过这种情况,但我在事件日志中没有发现异常。 w3wp.exe 没有崩溃,状态服务器有一些超时,但它们看起来不相关(由时间戳验证)并且它只发生在这个域上的这个用户身上(此代码用于 2 个不同的 TLD 以及大约 10 个其他子域) .

我正在调查的一个途径是 cookie 可能太大了。我认为会检查进入响应的 cookie 的大小,我认为它不会以这种方式影响它。任何想法为什么请求可能会转储 cookie?

注意:我提到的我设置的辅助 cookie 也会被转储(而且非常小)。

编辑注意:发生这种情况时会话令牌不会丢失。但是,由于身份验证 cookie 丢失,它会被忽略并在后续登录时替换。

【问题讨论】:

    标签: asp.net cookies redirect iis-6 forms-authentication


    【解决方案1】:

    事实证明,被转储到该特定用户的 cookie 中的 cookie 数据碰巧超过了其加密格式中允许的最大大小。未加密的数据适合,但一旦对其运行加密,数据就会变得太大而无法处理。这会导致 cookie 以及在它之后添加的任何 cookie 从响应标头中删除。

    减少注入 cookie 的数据量解决了这个问题。

    【讨论】:

    • cookie 的最大大小是多少?
    • 谢谢——我进行了一些测试以确定长度。在这个遗留应用程序中,他们将大部分内容都存储在 cookie 中。将所有内容移动到会话中解决了这个问题 :)
    【解决方案2】:

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

    【讨论】:

    • 否,将布尔值设置为 true 会导致 ThreadAbordException 被忽略。我尝试了 FormsAuthentication.RedirectFromLoginPage 具有相同的效果。值得注意的是,会话令牌不会丢失。它仍然存在。
    • 根据mdsn文档msdn.microsoft.com/en-us/library/a8wa7sdt(VS.80).aspxendResponse表示是否应该终止当前页面的执行,所以设置为false是避免ThreadAbordException的方法。话虽如此,恐怕我真的帮不上忙。您是否考虑过更改有效期?
    猜你喜欢
    • 2013-05-03
    • 2011-09-22
    • 2014-09-10
    • 2014-07-22
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2023-01-30
    相关资源
    最近更新 更多