C# 使用ASP.NET MVC OutputCache,同时根据用户是否经过身份验证来更改视图内容

C# 使用ASP.NET MVC OutputCache,同时根据用户是否经过身份验证来更改视图内容,c#,asp.net,asp.net-mvc,caching,outputcache,C#,Asp.net,Asp.net Mvc,Caching,Outputcache,我正在构建一个ASP.NETMVC2站点,其中大量使用OutputCache参数。但是,我有一个顾虑:使用这种缓存可能会干扰身份验证 在我的所有页面上,我显示用户是否登录。此外,在我的一些视图中,我会根据用户角色进行过滤,以确定是否显示某些页面内容(例如,我的一个页面上的编辑链接仅显示给担任版主或管理员角色的用户) 使用OutputCache会干扰我的视图的动态更改吗?如果是这样,我如何在不消除缓存的情况下解决此问题?我相信您需要的是ASP.NET donunt缓存。请参阅以获得良好的解释。如果

我正在构建一个ASP.NETMVC2站点,其中大量使用OutputCache参数。但是,我有一个顾虑:使用这种缓存可能会干扰身份验证

在我的所有页面上,我显示用户是否登录。此外,在我的一些视图中,我会根据用户角色进行过滤,以确定是否显示某些页面内容(例如,我的一个页面上的编辑链接仅显示给担任版主或管理员角色的用户)


使用OutputCache会干扰我的视图的动态更改吗?如果是这样,我如何在不消除缓存的情况下解决此问题?

我相信您需要的是ASP.NET donunt缓存。请参阅以获得良好的解释。如果SO在顶部栏区域使用类似的内容,我也不会感到惊讶。

[OutputCache]和[Authorize]属性彼此配合得很好。AuthorizeAttribute.OnAuthorization()方法在输出缓存系统中设置一个钩子,强制授权过滤器在从缓存提供页面之前重新运行。如果授权筛选器逻辑失败,它将被视为缓存未命中。如果授权逻辑成功,页面将从缓存中提供。因此,如果您在某个操作上有[Authorize(Roles=“mediator,Administrator”)]和[OutputCache],则除非当前用户处于主持人或管理员角色,否则不会从缓存中提供页面

请注意,这并不因用户或角色而异;它实际上是在运行原始支票。假设用户A(作为版主)进来并导致页面被缓存。现在用户B(管理员)进入并点击缓存页面。[Authorize]检查将成功,因为管理员和版主都被允许,并且提供给用户B的响应将包含与提供给用户A的响应完全相同的内容


请注意,响应替换在MVC2中不起作用。如果您正在为潜在的敏感数据提供服务,最好的选择是不要缓存它。如果您确实需要缓存,您可以通过使用AJAX回调来模拟类似于响应替换的内容,以动态填充丢失的数据。

如果我有一个不需要授权的方法,但如果用户是版主,则在视图中添加一个编辑链接,该怎么办?在这种情况下,我试图完成一些类似于链接、标记、编辑和其他按钮在这里的问题或答案下的工作方式的事情-不也使用OutputCache吗?谢谢你的回答!我刚刚偶然发现(关于一个后来被修复的老问题),这给了我一个想法-如果OutputCache在这方面做得很糟糕,是否可以构建一个自定义缓存属性/过滤器,根据用户是否登录以及用户所处的角色创建不同的副本-或者更好的是,用户名是什么,我将把用户的名字写在页面的顶部,这有可能吗?一般来说,对每个用户进行缓存是个坏主意,因为缓存中会充斥着大量的条目。如果甜甜圈缓存对您的场景很重要,您还可以使用响应过滤器。在请求开始时,安装一个了解某种[!!替换数据!!]模式的筛选器,让WriteSubstitute()将此模式写入响应流,然后在请求结束时,筛选器将调用实际的响应。WriteSubstitution()方法。要回答您的问题,请回答:几乎任意变化(包括用户名),请参阅和。请记住,不建议这样做。根据Jeff Atwood的建议,我最终完全切断了身份验证用户的缓存,因为MVC 3!Woot!中再次提供了部分缓存!