会话变量在IE重定向时丢失

时间:2019-02-15 10:00:32

标签: c# internet-explorer model-view-controller session-cookies

我有一个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 }
        );
    }
}

1 个答案:

答案 0 :(得分:0)

在这里发现问题,IE正在缓存ajax调用。解决2个步骤,首先将cache:false添加到ajax参数。其次,您在jquery函数中拥有的所有console.logs都将其删除,因为它们仍然会缓存结果。