【问题标题】:MVCSiteMapProvider: Using security trimming with ouput cache returns empty sitemapMVCSiteMapProvider:使用带有输出缓存的安全修整返回空站点地图
【发布时间】:2015-12-15 16:46:06
【问题描述】:

我正在使用 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");
}

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

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

【问题讨论】:

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


    【解决方案1】:

    如果您分析source for AuthorizeAttribute,您会注意到它并非设计用于处理输出缓存的子操作(它们竭尽全力确保child actions that are output cached will throw an exception)。

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

    但是,在使用 Security Trimming 时,您可以采取一些措施来提高性能:

    1. 确保您的injection constructors are simple,尤其是在您的控制器上。如果您在构造函数中进行繁重的处理,它确实会减慢速度(不管有没有MvcSiteMapProvider,但安全修剪让这一点更加明显)。
    2. 如果这还不足以改善事情并且您没有使用自定义AuthorizeAttribute,您可以使用roles 属性/属性将您的角色逻辑复制到站点地图中并从您的配置中删除AuthorizeAttributeAclModule (仅限外部 DI)。

    更多详情请见this discussion。

    【讨论】:

    • 当只有使用布局的动作使用AuthorizeAttribute而不是子动作时,这是否仍然适用?
    • 我从未尝试将MvcSiteMapProvider 与输出缓存一起使用。我的猜测是它可能行不通。它意味着是动态的并且随着每个请求而变化。缓存输出意味着SiteMap 对象永远不会被调用,并且不会运行任何应该在每个请求上运行的逻辑 - 有效地绕过安全修剪和可见性提供程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2010-10-19
    相关资源
    最近更新 更多