重定向后ASP.NET会话丢失,但仅限于IE

时间:2013-03-24 19:20:06

标签: asp.net session redirect internet-explorer-9

所有斜体字都是原帖,下面的编辑是非斜体的

我使用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的帮助!

5 个答案:

答案 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"

另见Cookie blocked/not saved in IFRAME in Internet Explorer

答案 4 :(得分:0)

我也遇到了这个问题,这个SO response解决了我的问题。如果您的主机名带有下划线(似乎无效),则IE似乎会删除会话(!)。