Asp.net mvc MVCSiteMapProvider:使用输出缓存的安全性微调返回空站点地图

Asp.net mvc MVCSiteMapProvider:使用输出缓存的安全性微调返回空站点地图,asp.net-mvc,caching,outputcache,mvcsitemapprovider,security-trimming,Asp.net Mvc,Caching,Outputcache,Mvcsitemapprovider,Security Trimming,我正在使用MvcSiteMapProvider Html帮助程序创建导航栏。导航栏的内容取决于访问者的权限,因此我使用安全微调仅显示授权人员的内容。为了提高性能,我尝试缓存这个导航栏 导航栏在局部视图中创建,包含以下内容: @Html.MvcSiteMap().Menu("MenuHelper", new { name = "MainMenu" }) 在布局文件中,由返回局部视图的操作方法调用: [System.Web.Mvc.OutputCache(Duration = 10, VaryBy

我正在使用MvcSiteMapProvider Html帮助程序创建导航栏。导航栏的内容取决于访问者的权限,因此我使用安全微调仅显示授权人员的内容。为了提高性能,我尝试缓存这个导航栏

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

@Html.MvcSiteMap().Menu("MenuHelper", new { name = "MainMenu" })
在布局文件中,由返回局部视图的操作方法调用:

[System.Web.Mvc.OutputCache(Duration = 10, VaryByCustom = "User")]
[ChildActionOnly]
public ActionResult MainMenu()
{
    return PartialView("MainMenu");
}
的缓存在站点地图的根页面上运行良好。但是,当缓存持续时间用完并且从更深层次调用操作方法时,不会返回任何站点地图。 当我禁用安全微调或输出缓存时,它在所有级别都能正常工作

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

如果您分析,您会注意到它不是为处理缓存输出的子操作而设计的(为了确保这一点,它们会花费大量时间)

当然,如果您有一个自定义的
AuthorizeAttribute
,它覆盖了不复制此重要逻辑的
OnAuthorization
,那么它也不会正常工作

但是,在使用安全性微调时,您可以做一些事情来提高性能:

  • 确保您的电脑,尤其是控制器上的电脑。如果您的构造函数中有大量的处理,它确实会减慢速度(有或没有
    mvcsitemprovider
    ,但安全性调整会使这一点更加明显)
  • 如果这还不够完善,并且您没有使用自定义的
    AuthorizeAttribute
    ,您可以使用
    角色
    属性/属性将您的角色逻辑复制到站点地图中,并从配置中删除
    AuthorizeAttribute模块

  • 有关更多详细信息,请参阅。

    当只有使用布局的操作使用
    AuthorizeAttribute而不是子操作时,这是否仍然适用?我从未尝试将
    mvcsitemprovider
    与输出缓存一起使用。我的猜测是这可能行不通。它是动态的,随着每个请求而变化。缓存输出意味着永远不会调用
    SiteMap
    对象,也不会运行每个请求都应该运行的逻辑—有效地绕过了安全微调和可见性提供程序。