所有斜体字都是原帖,下面的编辑是非斜体的
我使用ASP.NET 4.0在C#中编写。 我通过SQL查找验证用户凭据,如果有效,我将用户名存储在会话变量中,然后将用户重定向回主页面。非常简单。
if (!db.isValidLogin(userName, passWord))
{
//invalid login, show it!
//just some code to tell the user invalid credentials
}
else
{
//show login successful!
//update some items on the screen
Session["username"] = userName.ToUpper();
Response.Redirect("/");
}
目前尚未通过SSL,因为它是内部开发。 当我使用Chrome版本“25.0.1364.172 m”时,我已正确重定向并且“已登录”。通过向我显示我的用户名并允许我访问身份验证允许的功能,我的屏幕代表了这一点。 当我使用(32位)IE 9版本“9.0.8112.16421”与相同的服务器端代码和过程...当我重定向时,我的会话变量“用户名”消失了。实际上,会话对项目的计数为0。在重定向之前,会话变量已设置且正确。 我在Windows Server 2008 R2 64位盒和Windows 7 64位盒上获得了相同的结果。 我正在使用托管IIS和SQL的单个服务器。我没有使用会话服务器。 我已经找到了...代码运行完全按照需要运行直到重定向。接收凭据,执行我的存储过程以验证...在重定向之前设置会话变量(我可以看到会话和变量以及值是正确的)..然后重定向...并且如上所述,使用Chrome它可以正常工作根据需要...使用IE会话在重定向时丢失。 我也试过这个但没有成功: Response.Redirect(“/”,false); 所以我确信IE正在做的事情,可能是在客户端设置cookie,导致浏览器和服务器会话之间不匹配。 我不应该做一个response.redirect ???如果我执行response.redirect,如何防止会话重置?再一次,请记住,当我使用Chrome时,这不会发生。 令人沮丧的... 谢谢你的帮助!
新信息
根据答案尝试关闭IE缓存后...我决定将sessionID输出到浏览器,以便我可以看到它是什么。
行为更直接的是登录和重定向...
在IE中,只需使用F5刷新浏览器,就会在服务器上创建新会话。每次刷新我都会收到一个新的会话ID。
使用Chrome进行测试除非我调用session.abandon,超时会话或关闭并重新启动浏览器,否则我不会获得新的会话ID。
我只是在用户点击退出时调用session.abandon,但已注释掉该代码(以防万一),以确保我不会在意外时放弃它。
实际页面刷新之间的某个地方IE正在向服务器呈现新会话...... ARGH。
例如: 铬: 登录前:myjuzrmccerk1t4eakcliq14 登录后:myjuzrmccerk1t4eakcliq14
IE: 登录前:unyebuc2ikac12xnhpssy0em 登录后:unyebuc2ikac12xnhpssy0em
使用F5或Ctrl-R刷新: 一:ptjt42fjwzgdreyyyo3cmvrs 二:s1hd5aatl5yexeuc125aqhst 三:kbpflurcdcxubux3scmdm4k5
更新2
我已将网站更改为会话使用“状态服务器”并启动了相应的服务......行为没有变化。
ANSWER
因为我的代表很低..这不会让我回答我自己的问题再过3个小时......但是这里是......
我通过反复试验找到了解决办法。
在sessionstate中的InProc和StateServer都有相同的结果,直到我添加“cookieless = true”
<sessionState mode="StateServer" cookieless="true" />
这会导致会话状态在Chrome和IE中出现一致(问题出在哪里),并且我的会话ID在页面刷新之间不再更改。我无法确定为什么会发生这种情况,但它仍然是固定的..感谢Mike和antinescience的帮助!
答案 0 :(得分:4)
在sessionstate中的InProc和StateServer都有相同的结果,直到我添加“cookieless = true”
这会导致会话状态在Chrome和IE(问题所在)中保持一致,并且我的会话ID在页面刷新之间不再更改。我无法确定为什么会发生这种情况,但它仍然是固定的..感谢Mike和antinescience的帮助!
答案 1 :(得分:2)
有some other个报告表明IE的缓存机制(被广泛认为是,不好,不是很好)可能在这里受到指责。您可以尝试将以下内容添加到您的页面中:
// Stop Caching in IE
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
// Stop Caching in Firefox
Response.Cache.SetNoStore();
......看看是否有任何影响?另一种选择是:
int randomNumber = new Random().Next(1, 1000);
Response.Redirect("/?nocache=" + randomNumber);
......仅供测试。哎呀,你可以把日期作为数字来测试。
答案 2 :(得分:1)
我现在有几天同样的问题,最后我知道每次刷新会话的原因,首先使用Response.Redirect(URL,false)方法后我意识到我输入的URL为AbspoluteURI作为&#34; http:// ServerIP / File / Page.aspx&#34; ,我使用 AbsolutePath 方法代替&#34; 〜/文件/ Page.aspx &#34;,我的问题解决了!!当您编写 AbsoluteURL 而不是AbsolutePath 时,IE认为服务器已更改,我希望这可以帮助
答案 3 :(得分:0)
我在IFrame中托管的网页遇到了同样的问题。故障排除显示ASP.NET会话cookie在此过程中丢失,并且仅在使用Internet Explorer时发生。当我在IE的单独标签中打开我的网页时,一切正常。
问题是由Internet Explorer中的安全性引起的。除非有P3P HTTP标头,否则它不会保留cookie。您可以通过访问IE-&gt;查看 - &gt;网页隐私权报告...来查看被阻止的网址,并选择显示“受限制的网站”。
我通过在每个请求中添加虚拟P3P标头来解决问题。标题看起来像这样;
P3P:"Bogus P3P header because Internet Explorer requires one"
这与facebook.com使用的方法相同。他们的p3p标题看起来像这样;
p3p:CP="Facebook does not have a P3P policy. Learn why here: http://(...)/p3p"
答案 4 :(得分:0)
我也遇到了这个问题,这个SO response解决了我的问题。如果您的主机名带有下划线(似乎无效),则IE似乎会删除会话(!)。