我正在构建一个 ASP.NET MVC 2 站点,我在其中大量使用 OutputCache 参数。但是,我有一个担忧:使用这种缓存可能会干扰 authentication。
在我的所有页面上,我都会显示用户是否登录。此外,在我的一些视图中,我根据用户角色进行过滤以确定是否显示某些页面内容(例如,我的一个页面上的编辑链接仅显示给具有版主或管理员角色的用户) .
使用 OutputCache 会干扰我的视图的这种动态变化吗?如果是这样,我怎样才能在不消除缓存的情况下解决这个问题?
我正在构建一个 ASP.NET MVC 2 站点,我在其中大量使用 OutputCache 参数。但是,我有一个担忧:使用这种缓存可能会干扰 authentication。
在我的所有页面上,我都会显示用户是否登录。此外,在我的一些视图中,我根据用户角色进行过滤以确定是否显示某些页面内容(例如,我的一个页面上的编辑链接仅显示给具有版主或管理员角色的用户) .
使用 OutputCache 会干扰我的视图的这种动态变化吗?如果是这样,我怎样才能在不消除缓存的情况下解决这个问题?
[OutputCache] 和 [Authorize] 属性相互配合得很好。AuthorizeAttribute.OnAuthorization() 方法在输出缓存系统中设置了一个挂钩,该挂钩强制授权过滤器在缓存提供页面之前重新运行。如果授权过滤逻辑失败,将被视为缓存未命中。如果授权逻辑成功,将从缓存中提供页面。因此,如果您在某个操作上有 [Authorize(Roles = "Moderator, Administrator")] 和 [OutputCache],则不会从缓存中提供页面,除非当前用户处于 Moderator 或 Administrator 角色。
请注意,这不会因用户或角色而异;它实际上是在重新运行原始检查。想象一下,用户 A(他是主持人)进来并导致页面被缓存。现在用户 B(他是管理员)进来并点击缓存页面。[Authorize] 检查将成功,因为管理员和版主都被允许,并且提供给用户 B 的响应将包含与提供给用户 A 的响应完全相同的内容。
请注意,响应替换在 MVC 2 中不起作用。如果您正在提供潜在的敏感数据,最好不要缓存它。如果您绝对需要缓存,您可以通过使用 AJAX 回调来动态填充丢失的数据来模拟类似于响应替换的内容。
我相信您需要的是 ASP.NET donunt 缓存。请参阅此处以获得很好的解释。如果 SO 在顶部栏区域使用类似的东西,我不会感到惊讶。