Переменная сеанса теряется в IE при перенаправлении - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть приложение 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"));

РЕДАКТИРОВАТЬ

Тестовый код для имитации проблемы с потерянной переменной сеанса, проблема очевидна при запуске как на сервере, так и на локальном хосте

Скачать код здесь

Контроллер дома:

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 голосов
/ 15 февраля 2019

Нашел проблему здесь, IE кэшировал вызов ajax.2 шага для разрешения, сначала добавьте кеш: false к аргументам ajax.Во-вторых, любые console.logs, которые есть у вас в функции jquery, удалите их как ie, тогда они все равно будут кешировать результаты.

...