ASP.NET:Session.SessionID在请求之间改变

为什么ASP.NET页面中Session对象上的SessionID属性在请求之间发生变化?

我有这样一个页面:

... <div> SessionID: <%= SessionID %> </div> ... 

每次我点击F5时,输出都会不断变化,而不依赖于浏览器。

这是原因

当使用基于Cookie的会话状态时,ASP.NET将不会为会话数据分配存储,直到使用Session对象。 因此,每个页面请求都会生成一个新的会话ID,直到访问会话对象。 如果您的应用程序需要整个会话的静态会话ID,则可以在应用程序的Global.asax文件中实现Session_Start方法,并将数据存储在Session对象中以修复会话ID,也可以在您的另一部分中使用代码应用程序显式地将数据存储在Session对象中。

http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx

所以基本上,除非你在后端访问你的会话对象,每个请求将会产生一个新的sessionId

编辑

此代码必须添加到Global.asax文件中。 它向Session对象添加一个条目,以便修复会话直到它到期。

 protected void Session_Start(Object sender, EventArgs e) { Session["init"] = 0; } 

还有另外一个更阴险的原因,即使Session对象已经被Cladudio演示初始化,为什么会出现这种情况。

在Web.config中,如果有一个设置为requireSSL="true"但实际上没有使用HTTPS的<httpCookies>条目:对于特定请求,则会话cookie不会被发送(或者可能不会返回,I不知道是哪个),这意味着你最终会为每个请求build立一个全新的会话。

我发现这是一个艰难的方式,花费了好几个小时在我的源代码控制中的几次提交之间来回切换,直到我发现有什么具体的改变破坏了我的应用程序。

在我的情况下,我发现会话cookie有一个包含www. www. 前缀,而我正在请求页面没有www.
添加www. 到URL立即解决了问题。 后来我把cookie的域名改为了.mysite.com而不是www.mysite.com

使用Neville的答案(在web.config中删除requireSSL = true) 稍微修改Joel Etherton的代码,这里是处理一个站点的代码,这个站点在SSL模式和非SSL模式下运行,取决于用户和页面我跳回到代码中,并没有在SSL上进行testing,但期望它能工作 – 以后会太忙,回到这里,所以这里是:

 if (HttpContext.Current.Response.Cookies.Count > 0) { foreach (string s in HttpContext.Current.Response.Cookies.AllKeys) { if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid") { HttpContext.Current.Response.Cookies[s].Secure = HttpContext.Current.Request.IsSecureConnection; } } } 

我的问题是,我们在web.config中设置了这个

<httpCookies httpOnlyCookies="true" requireSSL="true" />

这意味着当以非SSL(默认)进行debugging时,auth cookie不会被发送回服务器。 这将意味着服务器将发送一个新的身份validationcookie(与一个新的会话)为每个请求回到客户端。

修复方法是在web.config中将requiressl设置为false,在web.release.config中设置为true,或者在debugging时打开SSL:

打开SSL

即使在Session_OnStart被定义和/或Session被初始化时,导致SessionID在请求之间改变的另一种可能性是URL主机名包含无效字符(例如下划线)。 我相信这是特定于IE的(未validation),但是如果您的URL是http://server_name/app ,那么IE将阻止所有cookie,并且您的会话信息将不能在请求之间访问。

实际上,每个请求都会在服务器上启动一个单独的会话,因此如果您的页面包含多个图像,脚本标记等,那么每个GET请求都将导致服务器上的不同会话。

更多信息: http : //support.microsoft.com/kb/316112

我的问题是与Microsoft MediaRoom IPTV应用程序。 事实certificate,MPF MRML应用程序不支持cookies; 更改为在web.config中使用无Cookie会话解决了我的问题

 <sessionState cookieless="true" /> 

这里有一个关于它的真正的旧文章: Cookieless ASP.NET

在我的情况下,这在我的开发和testing环境中发生了很多。 尝试所有上述解决scheme后,没有任何成功,我发现我能够通过删除所有会话cookie来解决这个问题。 Web开发人员的扩展使得这非常容易。 我主要使用Firefox进行testing和开发,但这也是在Chrome中进行testing时发生的。 该修补程序也在Chrome中工作。

在生产环境中,我还没有做到这一点,并没有收到任何人无法login的报告。这也只是在确保会话cookie安全之后才发生。 当他们不安全时,过去从来没有发生过。

请确保您没有很短的会话超时时间,并且确保您正在使用基于Cookie的会话来接受会话。

FireFox webDeveloperToolbar在这个时候很有帮助,因为您可以看到为您的应用程序设置的Cookie。

会话ID重置可能有很多原因。 但是,上面提到的任何东西都不涉及我的问题。 所以我会描述它以备将来参考。

在我的情况下,每个请求上创build一个新的会话导致无限的redirect循环。 redirect操作发生在OnActionExecuting事件中。

此外,我已经清除所有的http头(也在使用Response.ClearHeaders方法的OnActionExecuting事件),以防止在客户端caching网站。 但是这种方法会清除所有包含用户会话信息的标题,从而清除临时存储器中的所有数据(我稍后在程序中使用)。 所以即使在Session_Start事件中设置新的会话也没有帮助。

为了解决我的问题,我确保在发生redirect时不要删除标题。

希望它可以帮助别人。

我以不同的方式遇到了这个问题。 具有此属性[SessionState(SessionStateBehavior.ReadOnly)]的控制器正在从不同的会话读取,即使我在应用程序启动时在原始会话中设置了值。 我正在通过_layout.cshtml添加会话值(可能不是最好的主意?)

显然是ReadOnly导致的问题,因为当我删除属性,原来的会话(和SessionId)将保持机智。 使用克劳迪奥/微软的解决scheme修复它。