C# 在ASP.NET MVC 3中注销时清除浏览器缓存和cookie时出现问题

C# 在ASP.NET MVC 3中注销时清除浏览器缓存和cookie时出现问题,c#,asp.net-mvc,caching,asp.net-mvc-3,forms-authentication,C#,Asp.net Mvc,Caching,Asp.net Mvc 3,Forms Authentication,我认为这是一个很常见的话题,但我无法解决我的问题。在使用ASP.NET MVC 3构建的应用程序中,我使用表单身份验证和输出缓存: <authentication mode="Forms"> <forms loginUrl="~/Account/LogOn" name=".CMS" protection="All" timeout="43200" cookieless="UseCookies"/> </authentication> <cachin

我认为这是一个很常见的话题,但我无法解决我的问题。在使用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>
此操作使用简单的
注销方法:

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 是受保护的。在登录之前,我无法进入此页面。登录后,我有权浏览该页面。注销后,然后再次进入页面,不幸的是我仍然可以查看其内容

当缓存已启用且我以前访问过此类页面时,如何防止在注销后访问受保护的页面?我做错了什么?这些饼干应该用另一种方式清洗吗


问候

看看这篇文章。我认为它应该提供注销和清除缓存所需的代码片段。

您无法从服务器上清除浏览器缓存

在我看来,唯一正确的做法是在服务器端使cookie无效(即,即使有人知道cookie,他也不能再使用它),并可以选择删除客户端上的cookie


仅删除cookie是不够的。

您是否验证了浏览器是否确实向页面发出请求(即使用Fiddler)

如果页面是从浏览器的cahce提供的,则需要在该app/dynamic/page上设置缓存控制标头,以便浏览器被迫从服务器查询页面


如果从服务器检索页面,请查看cookie是否仍然存在(您的cookie代码看起来正常,但仍然可能有问题),或者服务器端缓存是否启动。

页面仍然被缓存。您需要添加以下响应标题:

cache-control : no-cache
这实际上并不能阻止缓存。
cache-control
响应头的
no-cache
指令表示浏览器

在未成功重新验证的情况下,不得使用响应来满足后续请求 使用源服务器

如果确实要阻止缓存,请指定
no store
指令。这会告诉浏览器

不能存储此响应或引发响应的请求的任何部分。这 指令同时适用于非共享缓存和共享缓存。在此上下文中“不得存储” 这意味着缓存不能有意将信息存储在非易失性存储中 必须尽最大努力从易失性存储中删除信息 转发后,请尽快储存


有关HTTP 1.1规范及其指令的详细信息,请参阅HTTP 1.1规范。

您好,我已尝试添加:HttpContext.Current.Response.CacheControl=“no cache”;或者HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache),但没有帮助。请安装Firefox(如果没有)。安装Firefox插件篡改数据()。开始篡改:篡改数据可以让你检查和调整HTTP[S]请求/响应流——你可以修改/注入/删除请求和响应头,等等。这是一个重要的web开发工具你好,我在VS debugger中观看了这个过程。登录后,当我第一次尝试访问页面时,服务器上的controler操作被调用。注销后,当我第二次尝试访问页面时,不会调用控制器操作。必须从浏览器缓存返回页面。您需要确保在动态/页面上正确设置了缓存控制标题。使用某种显示实际HTTP响应的工具是最简单的方法(如果您不喜欢Fiddler,有很多这样的工具)。请注意,您也可能正在访问服务器端缓存(在这种情况下,您的操作也不会被调用),但可能性较小。您好,谢谢,但不幸的是,您在给我看的帖子中勾选为答案的代码对我的情况没有帮助。您好,您能给我提供一个真正的代码示例来解决这个问题吗。我试着做不同的“黑客”,但仍然无法让它工作。你有什么好文章吗?我认为它应该很简单,但它是有线的。我试图使用@Austin M提供的帖子中的代码使cookie无效,但它不起作用。无效意味着过期还是其他什么?也许我在错误的地方做了这些?
cache-control : no-cache