【问题标题】:How do I force ScriptManager to serve CDN scripts over SSL如何强制 ScriptManager 通过 SSL 提供 CDN 脚本
【发布时间】:2011-11-22 04:28:01
【问题描述】:

我们在网络场上提供了一个网站。该场位于处理加密的 SSL 加速器后面。这意味着我们的 IIS 服务器将所有传入连接视为 http,即使用户都通过 https 连接到该站点。

我们开始使用 ScriptManager 的 EnableCDN=true 属性。在我们没有 SSL 加速器的开发环境中,对 CDN 上 js 文件的引用使用 https 呈现,而在生产环境中,它们通过 http 呈现不安全,这导致 js 被“仅显示安全内容”阻止" 错误。

没有手动更新 scriptmanager 中的所有脚本引用或通过模块在输出时重写 HTML,有没有人知道强制脚本管理器通过 https 呈现其引用的方法?

编辑:

在做了一些反射器审查后,我认为这是不可能的。我已经实施了以下黑客攻击,但这显然很脆弱,因为它涉及访问私有字段。如果有人能看到更好的方式,我很想听听。

var secureConnectionField = ScriptManager.GetType().GetField("_isSecureConnection", BindingFlags.Instance | BindingFlags.NonPublic);
if (secureConnectionField != null)
    secureConnectionField.SetValue(ScriptManager, true);

【问题讨论】:

  • 你描述的情况我没试过,但是HTML/JS中有几个地方可以省略协议,浏览器会使用与for相同的协议来请求URL包含页面。例如,“//cdn.mydomain.com/myfile.js”
  • 感谢您的提示,但在这种情况下,我不控制呈现的 url - 它已在框架 dll 中注册。我不相信在渲染 CDN 引用时告诉脚本管理器省略协议。
  • ScriptManager 是一个控件,因此您应该能够构建一个将覆盖路径生成逻辑的控件适配器,或者构建一个从原始控件继承的新控件,并使用标签映射动态在您的应用中替换它。

标签: c# asp.net ssl cdn scriptmanager


【解决方案1】:

如果您使用 ASP.NET 4.0 或更高版本,那么解决方案之一是使用 ScriptManager 控件的 ScriptResourceMapping 功能。

例如在全局 asax 中可以添加以下代码:

void Application_Start(object sender, EventArgs e) {

// map a simple name to a path

ScriptManager.ScriptResourceMapping.AddDefinition("jQuery", new ScriptResourceDefinition {

    Path = "~/scripts/jquery-1.3.2.min.js",

    DebugPath = "~/scripts/jquery-1.3.2.js",

    CdnPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.min.js",

    CdnDebugPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.js"

});

}

因此,如您所见,您可以明确设置 CDN 路径。此外,您可以覆盖标准 Ajax 文件的脚本映射。

更多信息可以在这篇文章中找到:http://weblogs.asp.net/infinitiesloop/archive/2009/11/23/asp-net-4-0-scriptmanager-improvements.aspx

【讨论】:

    【解决方案2】:

    为了处理与您类似的情况,我将 BundleCollection 配置为使用 CDN 和两个不同版本的库进行调试和生产。

    这些设置的结果是调试时使用非缩小版,生产中使用来自 CDN 的缩小版。本地缩小的会被忽略。

    [...]  
    bundles.UseCdn = true;
    [...]
    var jQueryBundle = new ScriptBundle("~/bundles/jquery");
    jQueryBundle.CdnPath = "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js";
    jQueryBundle.Include("~/scripts/jquery-1.9.1.js");
    jQueryBundle.Include("~/scripts/jquery-1.9.1.min.js");
    bundles.Add(jQueryBundle);
    

    注意我没有在CdnPath中指定协议,客户端的浏览器会自动使用客户端当前连接的协议,http或者https。

    客户端的浏览器将在生产中收到以下标签:

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    

    开发者的浏览器会收到如下标签:

    <script src="/Scripts/jquery-1.9.1.js"></script>
    

    两者都将在浏览器上使用正确的协议。

    【讨论】:

      【解决方案3】:

      通常,您的开发和生产服务器会有不同的 IP 范围。要求开发团队根据框架 dll 中的 IP 地址应用“协议切换”。

      【讨论】:

      • 感谢您的想法,但这对我们来说并不适用,因为 Web 服务器仍然按照设计在 http 中查看页面。我们使用 SSL 加速器将加密负载移出 IIS。脚本管理器正在查看 IIS 提供的服务。
      【解决方案4】:

      无论你使用的是@Razor还是ASPX,我假设你在某个地方有一个Layout/MasterPage

      CDN 的真正威力在于专门从服务器以外的其他来源远程托管脚本。这样做会提示用户的浏览器更有可能从不同的位置获取它。 CDN 最适合核心库,例如 AngularJSjQuery。您导入的脚本越不受欢迎,越不推荐通过 CDN 提供。

      我发现它更适合在您的布局上进行硬编码。如果您只使用 // 而不是使用 http://https:// 指定协议,则它应该选择与调用页面相同的协议。

      &lt;script type="text/javascript" src="//{yourCDNsource}"&gt;&lt;/script&gt;

      如果您在本地压缩/缩小远程 CDN,则无法达到目的。最好使用NuGetBower

      查看Google CDNs

      【讨论】:

        【解决方案5】:

        使用这个 global.asax

        void Application_Start(object sender, EventArgs e) {
        
        // map a simple name to a path
        
        ScriptManager.ScriptResourceMapping.AddDefinition("jQuery", new ScriptResourceDefinition {
        
            Path = "~/scripts/jquery-1.3.2.min.js",
        
            DebugPath = "~/scripts/jquery-1.3.2.js",
        
            CdnPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.min.js",
        
            CdnDebugPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.js"
        
        });
        
        }
        

        【讨论】:

        • 您需要覆盖每个 dll 引用的每个 js 文件的每个 CDN 路径。这似乎是不切实际的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-22
        • 2011-06-29
        • 2014-05-05
        • 2014-04-20
        • 2014-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多