缓存MVC操作的输出,但仅对经过身份验证的用户使用缓存版本

时间:2013-03-19 12:35:24

标签: asp.net asp.net-mvc caching outputcache output-caching

我想缓存MVC操作的输出。但是:

1)如果我在全局范围内应用OutputCacheAttribute,那么它会冒险,因为它会为所有用户缓存所有内容。

2)如果我全局应用OutputCacheAttribute,然后对需要授权的操作应用Authorize属性,那仍然无法解决问题。无论用户是否已获得授权,所有输出仍会被缓存。

3)如果我仅对选择的操作应用OutputCacheAttribute(不是全局但是),并且对所有需要授权的操作都有AuthorizeAttribute,那么就没有安全威胁但是有性能成本。每个需要身份验证的页面都需要发出一个新的Http请求。

我想找到一个中间地点,以便在客户端缓存选定的页面和/或选定类型的请求(HTTP GET),但前提是用户已经过身份验证。如果用户注销并访问缓存页面/操作的URL,则他必须无法看到内容。

有没有办法实现这个?

1 个答案:

答案 0 :(得分:2)

VaryByCustom is what you want。把它放在你的Global.asax文件中:

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    // use this algorithm to determine cacheability for "IsAuthenticated"
    if ("IsAuthenticated".Equals(custom, StringComparison.OrdinalIgnoreCase))
    {
        // cache content when user is authenticated
        if (User.Identity.IsAuthenticated) return "true";

        // do not cache when user is not authenticated
        return null;
    }

    return base.GetVaryByCustomString(context, custom);
}

...然后在你想要缓存的动作方法上使用类似的东西:

[OutputCache(VaryByCustom = "IsAuthenticated", Duration = 1800,
    Location = OutputCacheLocation.Client)]
public virtual ActionResult Index()
{ ... }