斜体字为原帖,以下修改为非斜体字
我正在使用 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 的帮助!