基于会话变量和自定义安全逻辑的MVC缓存

时间:2012-06-28 14:04:20

标签: asp.net-mvc model-view-controller caching

我有一个使用JQuery显示许多图表和表的应用程序。其中一些图表基于会话中保存的变量(例如,用户在另一页面中添加了一个值,在下一页中我生成了一个图表,因此用户请求不会发送任何参数)

我在网上四处寻找,大多数解决方案都基于

 [OutputCache(Duration=60, VaryByParam="someParm")]

问题是我的大多数请求都不发送参数,它们只使用会话中的值。

有没有办法为这类请求启用缓存?

编辑:我们有一个复杂的安全要求,我们无法使用MVC的默认授权属性。我们必须根据当前用户+发送到操作的参数来编写逻辑,因此操作中的方法决定继续执行请求或不返回任何内容。这使得缓存非常困难,因为在执行OutputCache时我们只有参数,但上下文中的身份对象是空的。因此,如果具有管理员权限的用户发送对a和b的请求,并且在他之后有最低权限的人发送对a和b的请求,则第二个人将看到结果,因为该操作未运行,但来自使用缓存!

为了解决这个问题,我使用了getvarybyCustome。所有这个功能都是返回用户的组名,这有助于创建更复杂的密钥。在最后一个示例中具有最小权限的人将具有与管理员的请求缓存密钥(a,b,group_admin)不同的缓存密钥(a,b,group_less)。但是,获取每个请求的组名也很昂贵,因此我使用Cache对象来缓存用户的组,因此在会话开始时,将从AD查询用户的组并将其保存到缓存中,因此对于他/她以后的请求,他的组名是从缓存中检索的。

2 个答案:

答案 0 :(得分:1)

如果您无法通过VaryByParam获得某些内容,则可以尝试VaryByCustom。查看示例here

答案 1 :(得分:1)

您可以对此请求进行重定向并将其发送到发送会话参数的新控制器方法,通过这种方式在未来的实现中,您可以使用查询字符串参数而不是会话,您的代码也可以使用。

您可以在所有控制器的基类上创建一个转换此会话参数的方法,以便将转换写一次。