Asp.net会话交叉/混合

Hou*_*uda 17 asp.net session-cookies iis-7.5

几周前,我们有一位客户联系我们说,有时当他创建活动时,它会以别人的名字创建!

我们做了一些故障排除,找不到任何东西.我们要求用户在下次遇到这些问题时与我们联系.他确实与我们联系,我们能够与他进行一次讨论,并亲眼看到问题.

这不仅仅是活动,他被认为是应用程序中的其他人.他可以访问其他人应该访问的所有内容.就在那时我们意识到我们正在讨论会话混淆问题.

关于我们的代码:
与任何其他应用程序一样,我们有一个简单的登录页面,用户输入电子邮件和密码,我们根据数据库对它们进行身份验证,如果它们有效,我们调用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));
}
Run Code Online (Sandbox Code Playgroud)

我们还使用以下代码在我们的应用程序中获取登录用户ID(当前用户).

public static int GetCurrentUserID()
{
    int userID = -1;
    int.TryParse(HttpContext.Current.User.Identity.Name, out userID);
    return userID;
}
Run Code Online (Sandbox Code Playgroud)

是的,我们做了我们的家庭作业,并搜索了以下两个链接:

http://lionsden.co.il/codeden/?p=446
使用StateServer的ASP.NET会话混合(SCARY!)

我们已禁用.aspx和.ascx文件的内核模式缓存和用户模式缓存,但这仍然存在.

PS-该应用程序在带有IIS 7.5的Windows 2008 R2上运行.我们使用cookieless会话.

Joe*_*one 14

我们刚刚遇到了一个非常类似的问题,这个问题是随机发生的,似乎是不可重复的.

问题原来是ASP.NETs页面缓存机制 - 在我们的例子<%@ OutputCache中特别是标签.

我们使用了一条线 <%@ OutputCache NoStore="true" Duration="1" %>,基本上意味着如果两个用户在1秒内访问同一页面,他们会看到相同的页面(包括其他用户的登录用户名).因此,如果他们刷新了所述页面,他们就会得到正确的信息.

在我们的例子中,将所述行更改为 <%@ OutputCache NoStore="true" Duration="1" VaryByParam="*" %>,在此链接中禁用IIS中的内核缓存(http://lionsden.co.il/codeden/?p=446)

并将以下行添加到Page_Load相关页面的事件中:

Response.CacheControl = "private";
Response.ExpiresAbsolute = DateTime.Now.AddDays(-1d);
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Run Code Online (Sandbox Code Playgroud)

似乎已经为我们解决了问题.希望这有助于其他类似问题的人.


Ari*_*tos 2

因为你们都禁用了内核模式缓存,所以我想指出一些其他的想法。

1) 要正确使用HttpContext.Current.User.Identity.Name,您首先需要验证您的用户是否已使用以下方式登录User.Identity.IsAuthenticated

2)在这一点上,Session.Add("CurrentUser", currentUser);你真正想要拯救什么?

现在我认为问题出在缓存上。这些页面存储在您的用户之间的某个位置,并且一个页面与另一个页面混合在一起。您可以在页面中使用一些标头以避免中间代理计算机上的缓存。

Response.Cache.SetExpires(DateTime.UtcNow.AddYears(-2));
Response.Cache.SetNoStore();
Response.Cache.SetValidUntilExpires(false);
Response.Cache.SetCacheability(HttpCacheability.NoCache);                
Response.ExpiresAbsolute = DateTime.Now.Subtract(new TimeSpan(1, 0, 0, 0));
Response.Expires = 0;
Response.CacheControl = "no-cache";
Response.AppendHeader("Pragma", "no-cache");
Run Code Online (Sandbox Code Playgroud)

<httpCookies httpOnlyCookies="true" requireSSL="true" />我还想说,如果您的页面包含您不希望在用户之间共享的数据,您需要使用安全 HTTPS 页面,并通过添加 web.config将您的 cookie 设置为仅在安全页面上可用

另外,检查您是否将会话保存在您计划每 1 分钟运行一次清理路由的 SQL Server 上。

为了能够找到更多信息,我建议在页面上存储一些隐藏文本,例如呈现的日期时间,可能是用户 ID 的最后 4 位数字,以及您可能会看到的其他内容可以帮助您查看是否该页面是否来自缓存。