Проблема с очисткой кэша браузера и файлов cookie при выходе из системы в ASP.NET MVC 3 - PullRequest
2 голосов
/ 17 февраля 2011

Думаю, это довольно распространенная тема, но я не могу решить свою проблему.В моей сборке приложения с ASP.NET MVC 3 я использую аутентификацию формы вместе с кэшированием вывода:

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" name=".CMS" protection="All" timeout="43200" cookieless="UseCookies"/>
</authentication>

<caching>
  <outputCacheSettings>
    <outputCacheProfiles>
      <add name="Dynamic" duration="3600" location="Client" varyByParam="id" />
    </outputCacheProfiles>
  </outputCacheSettings>
</caching>

My LogOff действие выглядит следующим образом:

public ActionResult LogOff()
{
    _formsService.SignOut();
    return RedirectToAction("Index", "Dynamic");
}

это действиеиспользует простой SignOut метод:

public void SignOut()
{                        
    FormsAuthentication.SignOut();

    HttpContext.Current.Session.Abandon();

    // clean auth cookie
    HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, string.Empty);
    authCookie.Expires = DateTime.Now.AddDays(-1);
    HttpContext.Current.Response.Cookies.Add(authCookie);

    // clean session cookie    
    HttpCookie sessionCookie = new HttpCookie("ASP.NET_SessionId", string.Empty);
    sessionCookie.Expires = DateTime.Now.AddDays(-1);
    HttpContext.Current.Response.Cookies.Add(sessionCookie);
}

Но проблема заключается в следующем :

страница http://localhost/app/dynamic/page защищена.Я не могу войти на эту страницу, пока не войду.После входа у меня есть доступ для просмотра такой страницы.После выхода из системы и повторного входа на страницу, к сожалению, я все еще могу просмотреть ее содержимое.

Как запретить доступ к защищенным страницам после выхода из системы, когда включено кэширование и я ранее посещал такие страницы?Что я делаю не так?Куки должны быть очищены другим способом?

С уважением

Ответы [ 4 ]

3 голосов
/ 17 февраля 2011

Страница все еще кэшируется.Вам нужно добавить следующий заголовок ответа:

cache-control : no-cache

, который на самом деле не мешает кешированию.Директива no-cache заголовка ответа cache-control означает, что браузер

НЕ ДОЛЖЕН использовать ответ для удовлетворения последующего запроса без успешной повторной проверки с сервером происхождения.

Если вы действительно хотите запретить кэширование, укажите директиву no-store.Это говорит браузеру, что он

НЕ ДОЛЖЕН хранить какую-либо часть этого ответа или запроса, который его вызвал.Эта директива применяется как к не совместно используемым, так и совместно используемым кэшам.«НЕ ДОЛЖЕН хранить» в этом контексте означает, что кэш НЕ ДОЛЖЕН преднамеренно хранить информацию в энергонезависимом хранилище и ДОЛЖЕН приложить максимальные усилия для удаления информации из энергозависимого хранилища как можно быстрее после ее пересылки.

Подробнее о cache-control и его директивах см. В спецификации HTTP 1.1.

0 голосов
/ 17 февраля 2011

Вы не можете очистить кеш браузера с сервера.

ИМО, единственное, что нужно сделать, это сделать файл cookie недействительным на стороне сервера (т. Е. Даже если кто-то узнает, что cookie он не можетиспользовать его больше) и, при желании, удалить cookie на клиенте.

Просто удалить cookie недостаточно для IMO.

0 голосов
/ 17 февраля 2011

Подтвердили ли вы, что браузер на самом деле отправляет запрос на страницу http://localhost/app/dynamic/page (то есть, используя Fiddler)?

Если страница подается из браузера, вам нужно установить заголовок управления кэшем для этого приложения /dynamic / page, поэтому браузер вынужден запрашивать страницу с сервера.

Если страница получена с сервера, проверьте, все ли еще есть файлы cookie (ваш код cookie выглядит нормально, но что-то может быть не так) ИЛИ если сервербоковое кэширование включается.

0 голосов
/ 17 февраля 2011

Взгляните на этот пост Asp.Net Mvc не может выйти . Я считаю, что он должен предоставить фрагмент кода, необходимый для выхода из системы и очистки кэша.

...