2011-11-22 4 views
11

Tenemos un sitio servido en una granja de servidores web. La granja está detrás de un Accellerator SSL que maneja el cifrado. Esto significa que nuestros servidores IIS ven todas las conexiones entrantes como http, aunque todos los usuarios se conectan al sitio a través de https.¿Cómo forzo a ScriptManager a servir scripts de CDN sobre SSL?

Estamos comenzando a utilizar la propiedad EnableCDN = true de ScriptManager. Mientras que en nuestros entornos de desarrollo donde no hay Accellerator SSL, las referencias a los archivos js en el CDN se representan con https, en el entorno de producción se procesan inseguramente sobre http, lo que hace que js se bloquee con "Solo se muestra contenido seguro" "errores"

A menos de actualizar manualmente todas las referencias de scripts en scriptmanager o volver a escribir el código HTML en el camino a través de un módulo, ¿alguien sabe de una manera de obligar al scriptmanager a presentar sus referencias a través de https?

EDIT:

Después de hacer algunas reflector opinión, no creo que esto es posible. He puesto el siguiente truco en su lugar, sin embargo, esto es obviamente frágil, ya que implica el acceso a un campo privado. Si alguien puede ver una mejor manera, me encantaría escucharla.

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

Yo no lo he probado para el caso que usted describe, pero hay unos pocos lugares en HTML/JS donde se puede omitir el protocolo y el navegador va a solicitar la URL utilizando el mismo protocolo que para la página que contiene Por ejemplo, "//cdn.mydomain.com/myfile.js" – RickNZ

+0

Gracias por la punta, pero en este caso no controlo la url rendido - que se ha registrado en los archivos DLL marco. No creo que haya que decirle al administrador de scripts que omita el protocolo al representar las referencias de CDN. –

+0

ScriptManager es un control, por lo que debe ser capaz de construir, ya sea un adaptador de control que anular la lógica de generación de ruta, o tal vez construir un nuevo control que hereda de la original, y utilizar la asignación de etiquetas para reemplazar dinámicamente en su aplicación. – RickNZ

Respuesta

0

Normalmente sus servidores de desarrollo y producción tendrán diferentes rangos de IP. Pídale al equipo de desarrollo que aplique un "interruptor de protocolo" basado en las direcciones IP en los marcos dlls.

+0

Gracias por la idea, pero eso realmente no funciona para nosotros, ya que los servidores web aún ven las páginas en http por diseño. Usamos el accellerator SSL para mover la carga de cifrado fuera de IIS. El administrador de scripts está mirando qué sirve IIS. –

1

Si utiliza ASP.NET 4.0 o superior, una de las soluciones es utilizar la función ScriptResourceMapping del control ScriptManager.

Por ejemplo, en GLOBAL.ASAX puede agregar el siguiente código:

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" 

}); 

} 

Por lo tanto, como se puede ver se puede establecer caminos de CDN de manera explícita. Además, puede anular la asignación de secuencias de comandos para archivos Ajax estándar.

Más información se puede encontrar en este artículo: http://weblogs.asp.net/infinitiesloop/archive/2009/11/23/asp-net-4-0-scriptmanager-improvements.aspx

-1

Utilice esta 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" 

}); 

} 
+0

Debería sobrescribir cada ruta CDN para cada archivo js al que hace referencia cada dll. Esto parece que sería poco práctico. –

1

para manejar una situación similar a la suya, que configuran el BundleCollection utilizar el CDN y dos versión diferente de la biblioteca para depuración y producción.

El resultado de estos ajustes es que se utilizará el no modificado durante la depuración y se utilizará el minificado de CDN en producción. El local minificado es ignorado.

[...] 
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); 

Tenga en cuenta que no he especificado el protocolo en la CdnPath, el navegador del cliente utilizará automáticamente el protocolo actual del cliente está conectado a, HTTP o HTTPS. navegador

del cliente recibirá la siguiente etiqueta en la producción: navegador

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

del desarrollador recibirá la siguiente etiqueta:

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

Ambos utilizarán el protocolo correcto en el navegador.

0

Si está usando @Razor es , supongo que tiene un Layout/MasterPage en alguna parte.

CDNs 'verdadero poder reside específicamente en tener el script alojado de forma remota desde otra fuente que no sea la de su servidor. Hacerlo indica que es más probable que el navegador del usuario lo haya recogido desde una ubicación diferente. Los CDN funcionan mejor para bibliotecas centrales, como AngularJS o jQuery. Cuanto menos popular es el script que está importando, menos recomendable es servirlo a través de CDN.

me resulta más adecuado para codificar-it en su diseño. Si utiliza sólo el // vez que especifica el protocolo con http:// o https:// que debe recoger el mismo protocolo de la página está siendo llamado.

<script type="text/javascript" src="//{yourCDNsource}"></script>

Si comprime/localmente Minify un CDN remota en contra del propósito. Mejor uso NuGet o Bower para ésos.

Comprobar Google CDNs

Cuestiones relacionadas