4

斜体字为原帖,以下修改为非斜体字

我正在使用 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 时,这不会发生。令人沮丧...感谢您的帮助!接收凭据,执行我的存储过程以验证...在重定向之前设置会话变量(我可以看到会话和变量并且值是正确的)..然后重定向...如前所述,使用 Chrome 可以正常工作根据需要...使用 IE,会话在重定向时丢失。我也尝试过,但没有成功: Response.Redirect("/", false); 所以我确信 IE 正在做的事情,可能是在客户端上设置 cookie,这会导致浏览器和服务器会话之间不匹配。我不应该做一个response.redirect吗???如果我执行 response.redirect,如何防止会话重置?再一次记住,当我使用 Chrome 时,这不会发生。令人沮丧...感谢您的帮助!接收凭据,执行我的存储过程以验证...在重定向之前设置会话变量(我可以看到会话和变量并且值是正确的)..然后重定向...如前所述,使用 Chrome 可以正常工作根据需要...使用 IE,会话在重定向时丢失。我也尝试过,但没有成功: Response.Redirect("/", false); 所以我确信 IE 正在做的事情,可能是在客户端上设置 cookie,这会导致浏览器和服务器会话之间不匹配。我不应该做一个response.redirect吗???如果我执行 response.redirect,如何防止会话重置?再一次记住,当我使用 Chrome 时,这不会发生。令人沮丧...感谢您的帮助!在重定向之前设置会话变量(我可以看到会话和变量并且值是正确的)..然后重定向......并且如前所述,使用Chrome它可以完全按照需要工作......使用IE会话丢失重定向。我也尝试过,但没有成功: Response.Redirect("/", false); 所以我确信 IE 正在做的事情,可能是在客户端上设置 cookie,这会导致浏览器和服务器会话之间不匹配。我不应该做一个response.redirect吗???如果我执行 response.redirect,如何防止会话重置?再一次记住,当我使用 Chrome 时,这不会发生。令人沮丧...感谢您的帮助!在重定向之前设置会话变量(我可以看到会话和变量并且值是正确的)..然后重定向......并且如前所述,使用Chrome它可以完全按照需要工作......使用IE会话丢失重定向。我也尝试过,但没有成功: Response.Redirect("/", false); 所以我确信 IE 正在做的事情,可能是在客户端上设置 cookie,这会导致浏览器和服务器会话之间不匹配。我不应该做一个response.redirect吗???如果我执行 response.redirect,如何防止会话重置?再一次记住,当我使用 Chrome 时,这不会发生。令人沮丧...感谢您的帮助!并且如前所述,对于 Chrome,它可以完全按照需要工作......对于 IE,会话在重定向时丢失。我也尝试过,但没有成功: Response.Redirect("/", false); 所以我确信 IE 正在做的事情,可能是在客户端上设置 cookie,这会导致浏览器和服务器会话之间不匹配。我不应该做一个response.redirect吗???如果我执行 response.redirect,如何防止会话重置?再一次记住,当我使用 Chrome 时,这不会发生。令人沮丧...感谢您的帮助!并且如前所述,对于 Chrome,它可以完全按照需要工作......对于 IE,会话在重定向时丢失。我也尝试过,但没有成功: Response.Redirect("/", false); 所以我确信 IE 正在做的事情,可能是在客户端上设置 cookie,这会导致浏览器和服务器会话之间不匹配。我不应该做一个response.redirect吗???如果我执行 response.redirect,如何防止会话重置?再一次记住,当我使用 Chrome 时,这不会发生。令人沮丧...感谢您的帮助!这导致浏览器和服务器会话之间不匹配。我不应该做一个response.redirect吗???如果我执行 response.redirect,如何防止会话重置?再一次记住,当我使用 Chrome 时,这不会发生。令人沮丧...感谢您的帮助!这导致浏览器和服务器会话之间不匹配。我不应该做一个response.redirect吗???如果我执行 response.redirect,如何防止会话重置?再一次记住,当我使用 Chrome 时,这不会发生。令人沮丧...感谢您的帮助!

新信息

在尝试关闭每个答案的 IE 缓存后......我决定将 sessionID 输出到浏览器,以便我可以看到它是什么。

这种行为比登录和重定向更直接......

在 IE 中,只需使用 F5 刷新浏览器即可在服务器上创建一个新会话。每次刷新我都会收到一个新的会话 ID。

使用 Chrome 进行测试,除非我调用 session.abandon、超时会话或关闭并重新启动浏览器,否则我不会获得新的会话 ID。

我只是在用户单击注销时调用 session.abandon ,但已注释掉该代码(以防万一)以确保我不会意外放弃它。

在实际页面刷新之间的某个地方,IE 正在将自己呈现给服务器以进行新会话...... ARGH。

例如:Chrome:登录前:myjuzrmccerk1t4eakcliq14 登录后:myjuzrmccerk1t4eakcliq14

IE:登录前:unyebuc2ikac12xnhpssy0em 登录后:unyebuc2ikac12xnhpssy0em

使用 F5 或 Ctrl-R 刷新: 一:ptjt42fjwzgdreyyyo3cmvrs 二:s1hd5aatl5yexeuc125aqhst 三:kbpflurcdcxubux3scmdm4k5

更新 2

我已将站点更改为使用“状态服务器”进行会话并启动了相应的服务......行为没有变化。

回答

由于我的代表很低……这不会让我再等 3 个小时来回答我自己的问题……但是就在这里……

我找到了解决办法……通过反复试验。

在我添加“cookieless=true”之前,会话状态中的 InProc 和 StateServer 都具有相同的结果

<sessionState mode="StateServer" cookieless="true" />

这会导致会话状态在 Chrome 和 IE(问题所在)中保持一致,并且我的会话 ID 在页面刷新之间不再更改。我无法确定为什么会发生这种情况,但它仍然是固定的。感谢 Mike 和 antinescience 的帮助!

4

5 回答 5

4

在我添加“cookieless=true”之前,会话状态中的 InProc 和 StateServer 都具有相同的结果

这会导致会话状态在 Chrome 和 IE(问题所在)中保持一致,并且我的会话 ID 在页面刷新之间不再更改。我无法确定为什么会发生这种情况,但它仍然是固定的。感谢 Mike 和 antinescience 的帮助!

于 2013-03-25T13:28:25.350 回答
2

还有一些 其他报告表明,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);

...只是为了测试。哎呀,您也可以将日期作为数字输入以进行测试。

于 2013-03-24T20:57:02.480 回答
1

几天以来我都遇到了同样的问题,最后我知道了每次刷新都更改会话的原因,首先在使用 Response.Redirect( URL ,false) 方法之后,我意识到我输入的 URL 是 AbspoluteURI 作为“http :// ServerIP/File/Page.aspx",我用AbsolutePath方法代替" ~/File/Page.aspx ",我的问题解决了!!IE 认为当您编写AbsoluteURL 而不是 AbsolutePath时服务器已更改,我希望这会有所帮助

于 2014-09-07T08:47:45.203 回答
0

我也有这个问题,这个SO 响应解决了我的问题。如果您的主机名有下划线(这似乎是无效的),IE 似乎会放弃会话(!)。

于 2018-10-16T17:09:47.080 回答
0

我在 IFrame 中托管的网页也遇到了同样的问题。故障排除显示 ASP.NET 会话 cookie 在此过程中丢失,并且仅在使用 Internet Explorer 时发生。当我在 IE 的单独选项卡中打开我的网页时,一切正常。

该问题是由 Internet Explorer 中的安全性引起的。除非有 P3P HTTP 标头,否则它不会保留 cookie。您可以通过转到 IE->查看->网页隐私报告...来查看被阻止的 URL,然后选择显示“受限网站”。

我通过在每个请求中添加一个虚拟 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"

另请参阅Internet Explorer 中的 IFRAME 中被阻止/未保存的 Cookie

于 2016-05-04T09:38:18.437 回答