C# 如何强制ScriptManager通过SSL提供CDN脚本

C# 如何强制ScriptManager通过SSL提供CDN脚本,c#,asp.net,ssl,cdn,scriptmanager,C#,Asp.net,Ssl,Cdn,Scriptmanager,我们在一个web服务器场上提供了一个站点。该服务器场位于处理加密的SSL Accelerator后面。这意味着我们的IIS服务器将所有传入连接视为http,即使用户都通过https连接到站点 我们开始使用ScriptManager的EnableCDN=true属性。在没有SSL Accelerator的开发环境中,CDN上对js文件的引用是通过https呈现的,而在生产环境中,它们是通过http不安全地呈现的,这导致js被“仅显示安全内容”错误阻止 除了手动更新scriptmanager中的所有

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

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

除了手动更新scriptmanager中的所有脚本引用或通过模块重新编写HTML之外,有人知道强制scriptmanager通过https呈现其引用的方法吗

编辑:

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

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

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

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

例如,在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"

});

}
因此,正如您所看到的,您可以显式地设置CDN路径。此外,您还可以覆盖标准Ajax文件的脚本映射

更多信息可以在本文中找到:

使用这个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"

});

}

为了处理与您类似的情况,我将
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>


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

无论您使用的是
@Razor
it
ASPX
,我假定您在某个地方有
布局
/
母版页

CDNs“真正的力量在于让脚本从服务器以外的其他来源远程托管。这样做会提示更可能是用户的浏览器从其他位置拾取了它。CDN最适合核心库,如
AngularJS
jQuery
。您导入的脚本越不受欢迎,就越不推荐通过CDN为其提供服务

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

如果在本地压缩/缩小远程CDN,则无法达到此目的。最好使用
NuGet
Bower
来解决这些问题


检查

对于您描述的情况,我还没有尝试过,但是在HTML/JS中有一些地方可以省略协议,浏览器将使用与包含页面相同的协议请求URL。例如,“//cdn.mydomain.com/myfile.js”感谢您的提示,但在本例中,我不控制呈现的url——它是在框架DLL中注册的。我认为在呈现CDN引用时,没有办法告诉脚本管理器忽略协议。ScriptManager是一个控件,因此您应该能够构建一个覆盖路径生成逻辑的控件适配器,或者构建一个从原始控件继承的新控件,并使用标记映射在应用程序中动态替换它。感谢您的想法,但这对我们来说并不真正起作用,因为web服务器仍然可以通过设计在http中查看页面。我们使用SSL Accelerator移动IIS的加密负载。scriptmanager正在查看IIS提供的服务。您需要覆盖每个dll引用的每个js文件的每个CDN路径。这似乎不切实际。