c# - 使用 ASP.NET MVC OutputCache,同时根据用户是否经过身份验证改变 View 内容

标签 c# asp.net asp.net-mvc caching outputcache

我正在构建一个 ASP.NET MVC 2 站点,我在其中大量使用了 OutputCache 参数。但是,我担心:使用这样的缓存可能会干扰身份验证

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

使用 OutputCache 是否会干扰我的 View 的这种动态变化?如果是这样,我如何在不消除缓存的情况下解决这个问题?

最佳答案

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

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

请注意,响应替换在 MVC 2 中不起作用。如果您正在提供可能敏感的数据,最好不要缓存它。如果您绝对需要缓存,您可以通过使用 AJAX 回调动态填充缺失数据来模拟类似于响应替换的东西。

关于c# - 使用 ASP.NET MVC OutputCache,同时根据用户是否经过身份验证改变 View 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3444245/

相关文章:

c# - 按 NextObjectId 对对象列表进行排序

c# - 消除 RESTful 服务的歧义

c# - 一个应用程序使用不同的语言

c# - 在 Azure 上部署的 .net Web 应用程序中存储和执行二进制文件的最佳方式

jquery - 如何从 HTML 中分离 jQuery

c# - 如何获取 TFS 集合中所有项目的名称?

c# - 如何初始化一个事件

.net - 使用asp.net mvc作为基于REST的终结点

asp.net - Paypal 处理 - 需要抓取 TransactionId、CorrelationId 和 TimeStamp

asp.net-mvc - 对 View 进行单元测试?