Session 重定向时变量在 IE 中丢失

Session variable is lost in IE on redirect

我有一个 MVC 应用程序,我正在使用 session 变量来存储用于识别登录用户的变量。除了 IE,这在任何地方都可以正常工作。第一次登录会起作用,但如果我注销,删除 session 变量,然后重新登录,它不会再次设置 session 变量。注销后,我正在 Response.Redirect 返回登录页面。

我尝试了多种方法,包括更改为 Server.Transfer 请求和设置伪造的 P3P header,因为显然 IE 仍会读取它!该域没有下划线,这显然也是 IE 中的一个问题。如有任何帮助,我们将不胜感激!

Login:
Session.Add("UserID", extr_user.extr_id);

Logout:
Session.Remove("UserID");
Response.Redirect(Url.Action("Login", "Home"));

编辑

测试代码模拟丢失 session 变量的问题,这个问题在服务器和本地主机上都很明显 运行

下载代码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 }
        );
    }
}

在这里发现问题,IE 正在缓存 ajax 调用。两步解决,首先在 ajax 参数中添加 cache: false 。其次,将 jquery 函数中的任何 console.logs 删除,因为 ie 仍然会缓存结果。