【问题标题】:How do I configure ASP.Net OutputCache to vary by http vs https?如何将 ASP.Net OutputCache 配置为因 http 与 https 而异?
【发布时间】:2010-11-10 12:07:57
【问题描述】:

这是一个场景,用户在他们的浏览器中从我们的 WebApp 中打开非安全页面,我们称之为 PageA,然后单击其中的链接,将他们带到 PageB 的安全实例。一旦进入 PageB,用户随后可以单击一个链接,将他们带回到 PageA 的安全实例(他们已经查看并在 OutputCache 中)。我观察到,即使在访问 PageB(安全的)之后通过不同的 URL 访问 PageA,它实际上是在拉取先前缓存的副本,而不是制作一个新的副本。我在调试会话中验证了这种行为,并惊讶于 ASP.Net 使用相同的 OutputCache 项来获取页面的安全副本。

我的问题是为什么会这样?以及如何告诉 ASP.Net OutPutCache 将来自安全 URL 的访问视为与非安全等效项不同/唯一的项目?

[背景]

我们最近将我们的网站图像转换为对所有图像使用 Scene7/Akamai。因此,我们添加了代码以在通过安全连接查看给定页面时使用不同的 Scene7 url。此 OutputCache 问题不允许执行输出安全 url 的逻辑,并导致丑陋的浏览器警告。

【问题讨论】:

    标签: asp.net ssl outputcache scene7


    【解决方案1】:

    我认为您可以执行 VaryByCustom="scheme" 并将其添加到您的 Global.asax.cs 文件中(包括我使用的其他几个其他应用程序版本和用户):

        public override string GetVaryByCustomString(HttpContext context, string custom)
        {
            if (custom.Equals("version", StringComparison.CurrentCultureIgnoreCase))
            {
                Assembly asm = Assembly.GetExecutingAssembly();
                string[] parts = asm.FullName.Split(',');
                string version = parts[1].Trim().ToLower();
                return version;
            }
            else if (custom.Equals("user", StringComparison.CurrentCultureIgnoreCase))
            {
                var user = Membership.Users.CurrentUser;
                return null == user ? string.Empty : user.Id.ToString();
            }
            else if (custom.Equals("scheme", StringComparison.CurrentCultureIgnoreCase))
            {
                var scheme = context.Request.IsSecureConnection ? "https" : "http";
                return scheme;
            }
            else
                return base.GetVaryByCustomString(context, custom);
        }
    

    【讨论】:

    • +1。正是我需要的。在我的情况下,用户不应该为我的特定页面使用 HTTPS。但万一他们这样做,我有重定向代码将它们发送到 HTTP。但是,除非我按照您的示例更改“方案”,否则此重定向代码将不起作用。
    【解决方案2】:

    这并不能按措辞回答问题,但它可能会消除您因方案而异的需要。如果您对 Scene7 url 的“http://”进行硬编码,您可以将它们更改为相对于方案的 url。

    <img src="http://site.scene7.com/images/someimage.jpg" />
    =>
    <img src="//site.scene7.com/images/someimage.jpg" />
    

    这将导致浏览器自动请求与引用页面具有相同方案的资源。当然,这是假设您有一个适用于您的 scene7 域的 SSL 证书。

    【讨论】:

    【解决方案3】:

    我从未尝试过,但您或许可以使用 Outputcache VaryByHeader 属性和“host”标头,它指定所请求资源的 Internet 主机和端口号。

    我的问题是,您为什么要在从 PageB 之后安全地重定向到 PageA。如果它是一个非安全页面,你不能修复 PageB 重定向以始终重定向到非安全页面。

    【讨论】:

    • +1 感谢您的回复。我的例子比我的现实简单得多。事实上,我有很多 pageB 和很多 pageA。要将所有链接从 pageB 更改回 pageA,因为它是不安全的,工作量太大,我希望有一种更简单的方法。
    猜你喜欢
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2015-06-18
    • 2018-03-02
    相关资源
    最近更新 更多