mvc kendo from editable data javascript asp.net-mvc kendo-ui telerik content-security-policy

javascript - from - ¿Cómo puedo hacer que KendoUI MVC funcione con la Política de seguridad de contenido?



kendo ui grid from table (1)

Puede controlar dónde se renderizan los scripts en línea Kendo UI MVC en la página, pero no puede eliminarlos por completo. En realidad, puedes, pero luego los widgets no se inicializarán.

Considere usar los widgets UI Kendo que no sean MVC:

http://docs.telerik.com/kendo-ui/aspnet-mvc/kendo-ui-vs-mvc-wrappers

Los widgets Vanity HTML / JavaScript Kendo UI proporcionan un control total sobre la ubicación de los scripts de inicialización: los wrappers del servidor representan los scripts de inicialización de los widgets justo después del resultado HTML del widget. Incluso si usa la inicialización diferida , los guiones aún se conservan en la Vista. Al usar widgets de interfaz de usuario de Kendo simples (sin envoltorio), usted mismo escribe los scripts de inicialización y puede moverlos a archivos de script externos.

También tenga en cuenta que las plantillas de interfaz de usuario de Kendo se basan en eval , lo que también traerá problemas si CSP está habilitado.

¿Cómo evito que Telerik KendoUI cree scripts en línea cuando se utilizan los componentes de ASP.NET MVC Kendo?

La razón para evitar los scripts en línea es adherirse por el encabezado CSP

Content-Security-Policy: script-src ''self'' ''unsafe-eval'' https://kendo.cdn.telerik.com

Y no para obtener errores como

Se negó a ejecutar un script en línea porque viola la siguiente directiva de Política de seguridad de contenido: "script-src" self '''' unsafe-eval '' https://kendo.cdn.telerik.com ''.

¿Hay alguna manera de eliminar los scripts en línea generados por kendo o adjuntar la Política de seguridad de contenido nonce / sha256 a los scripts?

Ejemplo simple (Menú KendoUI)

cshtml

@(Html.Kendo().Menu() .Name("nav-menu") .Items(items => { items.Add().Text("Home").Action("Index", "Overview"); }) )

Navegador html

<ul class="k-widget k-reset k-header k-menu k-menu-horizontal" id="nav-menu" data-role="menu" tabindex="0" role="menubar" aria-activedescendant="nav-menu_mn_active"> <li class="k-item k-state-highlight k-state-default k-first" role="menuitem"> <a class="k-link" href="/">Home</a> </li> </ul> <script> jQuery(function(){jQuery("#nav-menu").kendoMenu({});}); </script>

Solución

Después de la respuesta de @dimodi terminé usando nonce en scripts de inicialización diferida de kendo.

Fuente: CSP Nonces en ASP.NET

cshtml

@(Html.Kendo().Menu() .Name("nav-menu") .Items(items => { items.Add().Text("Home").Action("Index", "Overview"); }) .Deferred() ) <script type="text/javascript" nonce="@Html.ScriptNonce()"> @Html.Kendo().DeferredScripts(false) </script>

Startup.cs

public partial class Startup { public void Configuration(IAppBuilder app) { app.Use((context, next) => { var rng = new RNGCryptoServiceProvider(); var nonceBytes = new byte[32]; rng.GetBytes(nonceBytes); var nonce = Convert.ToBase64String(nonceBytes); context.Set("ScriptNonce", nonce); context.Response.Headers.Add("Content-Security-Policy", new[] {$"script-src ''self'' ''unsafe-eval'' https://kendo.cdn.telerik.com ''nonce-{nonce}'';" }); return next(); }); } } public static class NonceHelper { public static IHtmlString ScriptNonce(this HtmlHelper helper) { var owinContext = helper.ViewContext.HttpContext.GetOwinContext(); return new HtmlString(owinContext.Get<string>("ScriptNonce")); } }