我们做了一些故障排除,找不到任何东西.下次遇到这些问题时,我们要求用户与我们联系.他确实与我们联系了,我们能够和他一起去打乒乓球,用自己的眼睛看待这个问题.
他不仅是活动,而且被认定为应用程序中的其他人.他可以访问其他人应该访问的所有内容.那是当我们意识到我们正在混合一个问题的时候.
一点关于我们的代码:
像任何其他应用程序一样,我们有一个简单的登录页面,用户输入电子邮件和密码,我们会根据我们的数据库进行身份验证,如果它们有效,我们将调用FormsAuthentication.SetAuthCookie()将当前用户ID保存在cookie中,我们让他进入.
BL.User currentUser = BL.User.Authenticate(txtUsername.Text,txtPassword.Text); if (currentUser != null) { this.Session["NumberOfLoginTried"] = "0"; FormsAuthentication.SetAuthCookie(currentUser.UserID.ToString(),chRememberMe.Checked); Response.Redirect(FormsAuthentication.GetRedirectUrl(currentUser.UserID.ToString(),false)); }
我们还使用以下代码段在我们的应用程序中获取登录用户ID(当前用户).
public static int GetCurrentUserID() { int userID = -1; int.TryParse(HttpContext.Current.User.Identity.Name,out userID); return userID; }
是的,我们做了我们的家庭作业和谷歌搜索,看到以下两个环节:
http://lionsden.co.il/codeden/?p=446
ASP.NET Session Mix-up using StateServer (SCARY!)
我们已经禁用了.aspx和.ascx文件的内核模式缓存和用户模式缓存,这仍然在发生.
P.S-该应用程序在具有IIS 7.5的Windows 2008 R2上运行.而且我们没有使用无Cookie会话.
解决方法
问题原来是ASP.NET页面缓存机制 – 在我们的例子中,特别是<%@ OutputCache标签. 我们使用了一条线
<%@ OutputCache NoStore =“true”持续时间=“1”%>这基本上意味着如果两个用户在1秒钟内访问同一页面,他们将看到相同的页面(包括其他用户的登录用户名).所以如果他们刷新页面,他们得到了正确的信息.
在我们的情况下,改变这一行
<%@ OutputCache NoStore =“true”持续时间=“1”VaryByParam =“*”%>在IIS中禁用内核缓存(http://lionsden.co.il/codeden/?p=446)
Response.CacheControl = "private"; Response.ExpiresAbsolute = DateTime.Now.AddDays(-1d); Response.Cache.SetCacheability(HttpCacheability.NoCache);
似乎已经解决了我们的问题.希望这可以帮助别人遇到类似的问题.