所有斜体字是原始帖子,以下修订内容不是斜体字
我正在使用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" 时... 当我执行重定向时,我的会话变量 "username" 消失了。 实际上,该会话项数为 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正在向服务器呈现自己以获取新会话...啊。
例如: Chrome: 登录前:myjuzrmccerk1t4eakcliq14 登录后:myjuzrmccerk1t4eakcliq14
IE: 登录前:unyebuc2ikac12xnhpssy0em 登录后:unyebuc2ikac12xnhpssy0em
按下F5或Ctrl-R刷新: one: ptjt42fjwzgdreyyyo3cmvrs two: s1hd5aatl5yexeuc125aqhst three: kbpflurcdcxubux3scmdm4k5
更新2
我已将网站更改为使用“状态服务器”作为会话,并启动了相应的服务......但行为没有改变。
答案
由于我的声望较低...这让我无法在另外3个小时内回答自己的问题...但是这就是解决方法。
我通过试错找到了解决方法。
在sessionstate中,InProc和StateServer的结果都相同,直到我加入了“cookieless=true”选项。
<sessionState mode="StateServer" cookieless="true" />
这样做可以使会话状态在Chrome和IE(存在问题)中保持一致,我的会话ID在页面刷新之间不再改变。我无法确定为什么会发生这种情况,但它已经被修复了。感谢Mike和antinescience的帮助!
FormsAuthentication.RedirectFromLoginPage(userName.ToUpper(), true);
而忘记会话呢... 这并不是处理身份验证的最佳方式。 - MikeSmithDev