2010-02-08 100 views
3

我有一个FormsAuthentication cookie,它是持久的,并且在开发,测试和生产环境中独立工作。我有一个可以验证,用户对象被创建,身份验证Cookie添加到响应用户:ASP.Net FormsAuthentication重定向丢失重定向和Application_AuthenticateRequest之间的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集合持有两个不相关的,我为不同的目的和formsauthentication设置cookie身份验证的cookie。然后,在这个过程中,下一步在ApplicationAuthenticateRequest发生在Global.asax:

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是什么。我有15,000个其他用户不受这种影响。但是,对于一个用户来说,曲奇消失得无影无踪。我之前已经看到过这种情况,其中有w3wp.exe异常,状态服务器异常和其他与IIS进程相关的异常,但我在事件日志中没有发现异常。 w3wp.exe没有崩溃,状态服务器有一些超时,但它们似乎不相关(经过时间戳验证),并且只发生在这一个域上的这一个用户(该代码在2个不同的顶级域名和大约10个其他子域中使用) 。

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

注意:我提到的我设置的辅助cookie也被甩了(而且它非常小)。

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

回答

4

事实证明,被转储到该特定用户的Cookie中的Cookie数据恰好超过了加密格式允许的最大大小。未加密的数据是合适的,但一旦运行加密,尺寸变得太大而无法处理。这会导致cookie以及从响应头中删除的所有cookie。

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

+0

什么是最大Cookie大小? – 2011-09-06 16:04:19

+1

@Elan Hasson:4096字节:http://support.microsoft.com/kb/306070 – 2011-09-06 16:30:11

+0

谢谢 - 我跑了一些测试,以确定长度.. 在这个遗留应用程序中,他们将大部分内容都存储在cookie中。将所有内容移动到会话中解决了问题:) – 2011-09-15 14:37:47

0

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

+0

不,将布尔值设置为true会导致ThreadAbordException被忽略。我尝试使用FormsAuthentication.RedirectFromLoginPage具有相同的效果。值得注意的是,会话令牌不会丢失。它仍然存在。 – 2010-02-08 20:59:08

+0

根据mdsn文档http://msdn.microsoft.com/en-us/library/a8wa7sdt(VS.80).aspx'endResponse'指示当前页面的执行是否应该终止,因此将其设置为false是避免'ThreadAbordException'的方法。这就是说,我恐怕不能真正帮忙。你看过改变过期日期吗? – Romhein 2010-02-09 21:11:09