我有一个MVC应用程序,并且我正在使用会话变量来存储变量以标识已登录的用户。除IE之外,这在其他任何地方都可以正常工作。首次登录将起作用,但是如果我注销后删除了会话变量,然后重新登录,则不会再次设置会话变量。我注销后正在做一个Response.Redirect回到登录页面。
我已经尝试了多种方法,包括更改为Server.Transfer请求和设置伪造的P3P标头,因为显然IE仍会读取此信息!该域没有下划线,这显然也是IE中的问题。任何帮助,将不胜感激!
Login:
Session.Add("UserID", extr_user.extr_id);
Logout:
Session.Remove("UserID");
Response.Redirect(Url.Action("Login", "Home"));
编辑
测试代码以模拟丢失会话变量的问题,该问题很明显在服务器和本地主机上都运行
下载代码here
家庭控制器:
public class HomeController : Controller
{
public ActionResult Login()
{
return View();
}
public ActionResult Home()
{
if (Session["UserID"] == null)
{
Response.Redirect(Url.Action("Login"));
}
return View();
}
public string doLogin(string Email, string Password)
{
Session.Add("UserID", 1);
return Url.Action("Home");
}
public void Logout()
{
Session.Remove("UserID");
Response.Redirect(Url.Action("Login"));
}
}
Home.cshtml:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
</head>
<body>
<div>
<a href="@Url.Action("Logout", "Home")">Logout</a>
</div>
</body>
</html>
Login.cshtml:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
@model LoginTest.Models.User
<script src="~/Scripts/jquery-3.3.1.min.js"></script>
<script>
function Login() {
var email = $("#Username").val();
var password = $("#Password").val();
$.ajax({
url: '@Url.Action("doLogin", "Home")',
type: 'GET',
data: { Email: email, Password: password },
dataType: "html",
success: function (data) {
window.location.replace(data);
},
Error: function (xhr, status, error) {
console.log(error);
}
});
}
</script>
</head>
<body>
<div>
@Html.LabelFor(m => m.Username)
@Html.TextBoxFor(m => m.Username)
</div>
<div>
@Html.LabelFor(m => m.Password)
@Html.TextBoxFor(m => m.Password)
</div>
<div>
<input type="button" id="btnLogin" onclick="Login()" value="Login" />
</div>
</body>
</html>
RouteConfig.cs
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Home", id = UrlParameter.Optional }
);
}
}
答案 0 :(得分:0)
在这里发现问题,IE正在缓存ajax调用。解决2个步骤,首先将cache:false添加到ajax参数。其次,您在jquery函数中拥有的所有console.logs都将其删除,因为它们仍然会缓存结果。