首页 > 解决方案 > HTTPS 安全性受到 ASP.NET Ajax 客户端框架的影响

问题描述

我的 aspx ASP.NET 网页中有一个 ScriptManager。

如果我使用以下

<asp:ScriptManager EnablePartialRendering="true" AsyncPostBackTimeOut="300"
        ID="ScriptManager1" runat="server" />

我在浏览器中看到以下错误

未捕获的错误:无法加载 ASP.NET Ajax 客户端框架。未捕获的 ReferenceError:未定义 Sys

当我添加时EnableCdn="true",我收到有关混合内容的警告

HTTPS 安全性受到http://ajax.aspnetcdn.com/ajax/4.6/1/WebForms.js ... 和http://ajax.aspnetcdn.com/ajax/4.6/1/MicrosoftAjax.debug.js的威胁

当然,如果我强制加载,它最终会起作用,但这远非理想。

我也不明白在从 Windows Server 2012 移植到具有 IIS 8 和 10 各自版本的 Windows Server 2016 时问题是如何出现的。显然,在原始服务器中,相同的代码可以正常工作 - 即使没有EnableCdn="true"- 以及所有这些请求似乎按预期在 https 中进行管理。

接受解决方案后

几乎一切顺利。我所做的是在里面添加以下几行Global.asax.cs

    protected void Application_Start(object sender, EventArgs e)
    {
        //....
        var defAjaxForms = new ScriptResourceDefinition();
        defAjaxForms.CdnPath = "https://ajax.aspnetcdn.com/ajax/4.6/1/MicrosoftAjaxWebForms.debug.js";
        defAjaxForms.CdnDebugPath = "https://ajax.aspnetcdn.com/ajax/4.6/1/MicrosoftAjaxWebForms.debug.js";
        defAjaxForms.CdnSupportsSecureConnection = true;
        defAjaxForms.Path = "~/Scripts/WebForms/MicrosoftAjaxWebForms.debug.js";//local resource
        defAjaxForms.DebugPath = "~/Scripts/WebForms/MicrosoftAjaxWebForms.debug.js";
        ScriptManager.ScriptResourceMapping.AddDefinition("MicrosoftAjaxWebForms.js", defAjaxForms);
        var defAjax = new ScriptResourceDefinition();
        defAjax.CdnPath = "https://ajax.aspnetcdn.com/ajax/4.6/1/MicrosoftAjax.js";
        defAjax.CdnDebugPath = "https://ajax.aspnetcdn.com/ajax/4.6/1/MicrosoftAjax.js";
        defAjax.CdnSupportsSecureConnection = true;
        defAjax.Path = "~/Scripts/WebForms/MicrosoftAjax.js";//local resource
        defAjax.DebugPath = "~/Scripts/WebForms/MicrosoftAjax.js";
        defAjax.LoadSuccessExpression = "window.Sys && Sys._Application && Sys.Observer";
        ScriptManager.ScriptResourceMapping.AddDefinition("MicrosoftAjax.js", defAjax);
        var defForms = new ScriptResourceDefinition();
        defForms.CdnPath = "https://ajax.aspnetcdn.com/ajax/4.6/1/WebForms.js";
        defForms.CdnDebugPath = "https://ajax.aspnetcdn.com/ajax/4.6/1/WebForms.js";
        defForms.CdnSupportsSecureConnection = true;
        defForms.Path = "~/Scripts/WebForms/WebForms.js";
        defForms.DebugPath = "~/Scripts/WebForms/WebForms.js";
        defForms.LoadSuccessExpression = "window.Sys && Sys._Application && Sys.Observer";
        ScriptManager.ScriptResourceMapping.AddDefinition("WebForms.js", defForms);
    }

唯一仍然是 KO 是WebForms.js:我仍然得到

...已通过 HTTPS 加载,但请求了不安全的脚本“ http://ajax.aspnetcdn.com/ajax/4.6/1/WebForms.js ”。此请求已被阻止;内容必须通过 HTTPS 提供。

最终解决方案

最后我应用了这个答案(注意他们定义ResourceNameandResourceAssembly而不是Pathand DebugPath全部http://替换为https://

标签: asp.netajaxiismixed-content

解决方案


ScriptManager您可以在 Code Behind中配置映射。像这样的东西。Page_PreRender是它的好地方。

Dim def As New ScriptResourceDefinition()
def.CdnPath = "https://ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js"
def.CdnDebugPath = "https://ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js"
def.CdnSupportsSecureConnection = True
def.Path = "~/js/lib/MicrosoftAjax.js" ''//local resource
def.DebugPath = "~/js/lib/MicrosoftAjax.js"
def.LoadSuccessExpression = "window.Sys && Sys._Application && Sys.Observer"
ScriptManager.ScriptResourceMapping.AddDefinition("MicrosoftAjax.js", def)

推荐阅读