Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何让KendoUI MVC使用内容安全策略_Javascript_Asp.net Mvc_Kendo Ui_Telerik_Content Security Policy - Fatal编程技术网

Javascript 如何让KendoUI MVC使用内容安全策略

Javascript 如何让KendoUI MVC使用内容安全策略,javascript,asp.net-mvc,kendo-ui,telerik,content-security-policy,Javascript,Asp.net Mvc,Kendo Ui,Telerik,Content Security Policy,如何避免Telerik KendoUI在使用ASP.NET MVC剑道组件时创建内联脚本 避免内联脚本的原因是遵循CSP头 Content-Security-Policy: script-src 'self' 'unsafe-eval' https://kendo.cdn.telerik.com 而且不会出现像这样的错误 拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script src‘self’‘safe eval’” 有没有办法删除剑道生成的内联脚本或脚本 是否将内容安全策略no

如何避免Telerik KendoUI在使用ASP.NET MVC剑道组件时创建内联脚本

避免内联脚本的原因是遵循CSP头

Content-Security-Policy: script-src 'self' 'unsafe-eval' https://kendo.cdn.telerik.com
而且不会出现像这样的错误

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script src‘self’‘safe eval’”

有没有办法删除剑道生成的内联脚本或脚本 是否将内容安全策略nonce/sha256附加到脚本

简单示例(KendoUI菜单) cshtml 浏览器html
jQuery(function(){jQuery(#nav菜单”).kendoMenu({});});

解决方案 在@dimodi给出答案后,我在剑道延迟初始化脚本上使用了nonce

资料来源:

cshtml
@(Html.Kendo().Menu())
.Name(“导航菜单”)
.项目(项目=>
{
items.Add().Text(“主页”).Action(“索引”、“概述”);
})
.递延
)
@Html.Kendo().DeferredScripts(false)
Startup.cs
公共部分类启动
{
公共无效配置(IAppBuilder应用程序)
{
应用程序使用((上下文,下一步)=>
{
var rng=new RNGCryptoServiceProvider();
var nonceBytes=新字节[32];
rng.GetBytes(非字节);
var nonce=Convert.tobase64字符串(非字节);
Set(“ScriptNonce”,nonce);
context.Response.Headers.Add(“内容安全策略”,
新[]{$”脚本src'self''不安全评估'https://kendo.cdn.telerik.com 'nonce-{nonce}'
});
返回next();
});
}
}
公共静态类非帮助器
{
公共静态IHtmlString ScriptNonce(此HtmlHelper帮助程序)
{
var owinContext=helper.ViewContext.HttpContext.GetOwinContext();
返回新的HtmlString(owinContext.Get(“ScriptNonce”);
}
}

您可以控制Kendo UI MVC内联脚本在页面上的呈现位置,但不能完全删除它们。实际上,您可以,但是小部件将不会初始化

考虑使用非MVC剑道UI小部件:

Vanilla HTML/JavaScript Kendo UI小部件提供对初始化脚本放置的完全控制-服务器包装器在小部件的HTML输出之后立即呈现小部件的初始化脚本。即使使用,脚本仍保留在视图中。当使用普通(非包装器)剑道UI小部件时,您可以自己编写初始化脚本,并将它们移动到外部脚本文件中


还要记住,剑道UI模板依赖于
eval
,如果启用CSP,这也会带来问题。

您可以控制剑道UI MVC内联脚本在页面上的呈现位置,但无法完全删除它们。实际上,您可以,但是小部件将不会初始化

考虑使用非MVC剑道UI小部件:

Vanilla HTML/JavaScript Kendo UI小部件提供对初始化脚本放置的完全控制-服务器包装器在小部件的HTML输出之后立即呈现小部件的初始化脚本。即使使用,脚本仍保留在视图中。当使用普通(非包装器)剑道UI小部件时,您可以自己编写初始化脚本,并将它们移动到外部脚本文件中


还请记住,剑道UI模板依赖于
eval
,如果启用CSP,这也会带来麻烦。

我尝试使用Nuget(5.1.1)的NWebSec CSP包,但无法使其与NWebSec一起工作,剑道MVC(2018.1.322)现在可以工作

将NWebSec作为项目的一部分进行维护,并添加
@在视图中使用NWebsec.Mvc.HttpHeaders.Csp,并在脚本标记中应用HTMLHelper,我会自动为任何内联脚本生成一个nonce,我尝试使用Nuget(5.1.1)的NWebsec Csp包,但无法使其与NWebsec一起工作,Kendo Mvc(2018.1.322)现在可以工作

将NWebSec作为项目的一部分进行维护,并添加
@在视图中使用NWebsec.Mvc.HttpHeaders.Csp,并在脚本标记中应用HTMLHelper,我会自动为任何内联脚本生成一个nonce',对于2019年搜索该脚本的任何人,我们在Csp中使用Joonasw.AspNetCore.SecurityHeaders,kendo使用的是阻塞eval(),我们通过将其添加到启动中解决了这一问题

app.UseCsp(csp =>
            {
                 ...
                   csp.AllowScripts
                .FromSelf()
                .From("kendo.cdn.telerik.com")
                .AllowUnsafeInline()
                .AllowUnsafeEval();

                 ...
             }

对于2019年搜索这个的人,我们在Csp中使用Joonasw.AspNetCore.SecurityHeaders,kendo使用的是阻塞eval(),我们通过将它添加到我们的启动中解决了这个问题

app.UseCsp(csp =>
            {
                 ...
                   csp.AllowScripts
                .FromSelf()
                .From("kendo.cdn.telerik.com")
                .AllowUnsafeInline()
                .AllowUnsafeEval();

                 ...
             }

谢谢你的回复谢谢你的回复
@(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>
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"));
    }
}
app.UseCsp(csp =>
            {
                 ...
                   csp.AllowScripts
                .FromSelf()
                .From("kendo.cdn.telerik.com")
                .AllowUnsafeInline()
                .AllowUnsafeEval();

                 ...
             }