MVC 4 - проблема с кнопкой возврата после выхода из системы

Я прочитал множество сообщений, в которых у людей были похожие проблемы, но они не нашли рабочего решения. У меня есть сайт MVC 4, я не хочу удалять кеширование со всего сайта, так как я хочу кешировать страницы. Когда пользователь нажимает кнопку выхода, он успешно выходит из системы и перенаправляется на страницу входа, однако, когда пользователь нажимает кнопку «Назад», отображается ранее просмотренная «закрытая страница», которую вы должны увидеть только после входа в систему. Я понимаю, что это потому, что браузер кэшировал страницу на стороне клиента. Я пробовал несколько решений, и, как упоминалось ранее, ни одно из них не работает. В настоящее время мой выход из системы имеет следующий код:

    public ActionResult LogOff()
    {

        FormsAuthentication.SignOut();
        Session.Abandon();
        Session.Clear();

        // clear authentication cookie 
        HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, "");
        cookie1.Expires = DateTime.Now.AddYears(-1);
        Response.Cookies.Add(cookie1);

        // clear session cookie (not necessary for your current problem but i would recommend you do it anyway) 
        HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", "");
        cookie2.Expires = DateTime.Now.AddYears(-1);
        Response.Cookies.Add(cookie2); 

        // Invalidate the Cache on the Client Side 
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
        Response.Cache.SetNoStore();

        Response.AppendHeader("Pragma", "no-cache");

        // send an expired cookie back to the browser 
        var ticketExpiration = DateTime.Now.AddDays(-7);
        var ticket = new FormsAuthenticationTicket(
            1,
            // replace with username if this is the wrong cookie name 
            FormsAuthentication.FormsCookieName,
            DateTime.Now,
            ticketExpiration,
            false,
            String.Empty);
        var cookie = new System.Web.HttpCookie("user")
        {
            Expires = ticketExpiration,
            Value = FormsAuthentication.Encrypt(ticket),
            HttpOnly = true
        };

        Response.Cookies.Add(cookie); 

        return RedirectToAction("Login", "Account");
    }

person user329540    schedule 24.08.2012    source источник
comment
Я не знаю, как вы проходите аутентификацию. Но не следует ли каждому веб-сайту проверять вашу базу данных, чтобы убедиться, что пользователь имеет правильную аутентификацию, чтобы быть на сайте? А если нет, он должен перенаправить его на отображение чего-нибудь. Даже если ваши страницы кэшированы, ваш скрипт все равно будет работать, и сеанс вашего пользователя, хранящийся в базе данных, должен показывать, что он вышел из системы.   -  person AwDogsGo2Heaven    schedule 24.08.2012
comment
Конечно, это не сработает, ваш код срока действия влияет только на то, кэшируется ли текущий запрос. Текущий запрос - это ваш код выхода, поэтому не кэшируется только страница выхода. Вы не можете задним числом удалить кэшированные страницы после того, как они были кэшированы.   -  person Erik Funkenbusch    schedule 24.08.2012


Ответы (4)


Вы можете использовать событие изменения хэша в окне браузера, чтобы инициировать запрос ajax при обратной передаче, это, очевидно, не сработает, когда вы выйдете из системы. Оттуда вы можете запустить браузер, чтобы он делал все, что угодно.

person RubbleFord    schedule 24.08.2012

Если вы хотите применить поведение «Нет кеширования в браузере обратно» на всех страницах, вам следует поместить следующее в global.asax.

protected void Application_BeginRequest()
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
    Response.Cache.SetNoStore();
}

надеюсь, это кому-то поможет!

person AthibaN    schedule 26.08.2013

Добавьте следующие строки кода в файл Global.asax.cs.

protected void Application_BeginRequest()
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
    Response.Cache.SetNoStore();
}
person Arash Nabiniya    schedule 03.09.2017

person    schedule
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительной информации о почему и как работает, улучшает его долгосрочную ценность. - person Thomas Flinkow; 17.04.2018