MVCSiteMapProvider:使用带有ouput缓存的安全修整返回空站点地图

时间:2015-12-15 16:46:07

标签: asp.net-mvc caching outputcache mvcsitemapprovider security-trimming

我正在使用MvcSiteMapProvider Html Helper来创建导航栏。导航栏的内容取决于访问者权限,因此我使用安全修整来仅显示该人员被授权的内容。为了提高性能,我试图缓存此导航栏。

导航栏在局部视图中创建,其中包含以下内容:

@Html.MvcSiteMap().Menu("MenuHelper", new { name = "MainMenu" })

在布局文件中,它由一个返回局部视图的动作方法调用:

[System.Web.Mvc.OutputCache(Duration = 10, VaryByCustom = "User")]
[ChildActionOnly]
public ActionResult MainMenu()
{
    return PartialView("MainMenu");
}

在站点地图的根页面上缓存工作正常。但是,当缓存持续时间用完并且从更深层次调用操作方法时,不会返回任何站点地图。 当我禁用安全修整或输出缓存时,它在所有级别都可以正常工作。

当授权数据不可用时,是否可能会调用返回导航栏的操作方法,从而返回损坏的站点地图?

1 个答案:

答案 0 :(得分:0)

如果您分析source for AuthorizeAttribute,您会注意到它不适用于输出缓存的子操作(它们会花很多时间来确保child actions that are output cached will throw an exception)。

当然,如果您的自定义AuthorizeAttribute覆盖OnAuthorization并且不会复制此重要逻辑,那么它也无法正常工作。

但是,使用安全修整时,您可以采取以下措施来提高性能:

  1. 确保您的injection constructors are simple,尤其是您的控制器上的this discussion。如果你的构造函数中有大量处理,它可能会减慢速度(有或没有MvcSiteMapProvider,但安全修整会使这一点变得更加明显)。
  2. 如果这不足以改善并且您没有使用自定义AuthorizeAttribute,则可以使用roles属性/属性将您的角色逻辑复制到SiteMap中并删除{ {1}}来自您的配置(仅限外部DI)。
  3. 有关详细信息,请参阅{{3}}。