【问题标题】:Why can't I get font awesome to work in an ASP.NET Core MVC application?为什么我不能让字体真棒在 ASP.NET Core MVC 应用程序中工作?
【发布时间】:2017-11-01 08:54:07
【问题描述】:

在我的 ASP.NET Core MVC (ASP.NET Core 2) 应用程序中添加很棒的字体时遇到问题。我只是想将名为 font awesome 的 CSS 库添加到我的 MVC 项目中。我尝试了两种方法

1) 像这样添加字体 Awesome CDN

<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">

但是当我添加 CDN 时,我在 Chrome 中收到 CSP 错误

拒绝加载样式表 'http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css' 因为它违反了以下内容安全政策指令: “默认源代码‘自我’”。请注意,'style-src' 没有明确设置,所以 'default-src' 用作后备。

所以我尝试添加正确的元标记。我尝试了很多组合,但似乎没有任何效果。例如,

<meta http-equiv="Content-Security-Policy"
  content="script-src 'self' http://maxcdn.bootstrapcdn.com
  'unsafe-inline' 'unsafe-eval';
  style-src 'self' http://maxcdn.bootstrapcdn.com
  'unsafe-inline' 'unsafe-eval'; " />

我仍然收到与 Chrome 中的 CSP 相关的错误。

2) 我采用的第二种方法是在我的项目中添加字体真棒 CSS 文件。我这样做了,然后像这样添加了相应的参考:

<link rel="stylesheet" href="~/css/font-awesome.min.css">

执行此操作时,尽管文件位于正确的位置并被正确引用,但仍出现以下错误:

GET http://localhost:5000/fonts/fontawesome-webfont.woff2?v=4.7.0 net::ERR_ABORTED
GET http://localhost:5000/fonts/fontawesome-webfont.woff?v=4.7.0 net::ERR_ABORTED
GET http://localhost:5000/fonts/fontawesome-webfont.ttf?v=4.7.0 404 (Not Found)

我调查了这个问题,发现它可能与静态文件处理程序有关。然后我修改了app.UseStaticFiles() 以采用这样的选项参数:

StaticFileOptions staticFileOptions = new StaticFileOptions();
FileExtensionContentTypeProvider typeProvider = new FileExtensionContentTypeProvider();
if (!typeProvider.Mappings.ContainsKey(".woff2"))
{
    typeProvider.Mappings.Add(".woff2", "application/font-woff2");
}

if (!typeProvider.Mappings.ContainsKey(".woff"))
{
    typeProvider.Mappings.Add(".woff", "application/font-woff");
}

if (!typeProvider.Mappings.ContainsKey(".ttf"))
{
    typeProvider.Mappings.Add(".ttf", "application/font-ttf");
}
staticFileOptions.ContentTypeProvider = typeProvider;
app.UseStaticFiles(staticFileOptions);

但我还是得到了上面的错误。

有谁知道我做错了什么?如果需要,我可以通过其 CDN 添加 font awesome 或在我的应用程序中添加 font awesome CSS 文件。

【问题讨论】:

  • 您的文档使用 Content-Security-Policy HTTP 标头提供服务,该标头相对严格,因为它有 default-src 'self' 但根本没有 style-src。然后,您将使用文档本身中的 meta 元素指定不同的不太严格的策略。但是,当您指定多个策略时,CSP 的工作方式是,最严格的策略总是获胜。因此,您的浏览器基本上忽略了您的 meta 策略,而只使用 HTTP 标头中指定的策略。在这种情况下,唯一的解决方案是:更改服务器代码,使其为 Content-Security-Policy 标头发送不同的值
  • 您能详细说明一下吗?我指定 Content-Security-Policy 的唯一位置是在服务器端呈现的 HTML 页面的元数据标记中。还有什么可以修改标题?我确实尝试了第二种方法,但后来删除了代码。另外,如果您将此放在一个有效的答案中或导致有效的答案中,我会接受它。
  • 至于详细说明,我认为如果您查看文档的响应标头,您应该会找到 Content-Security-Policy 标头。要查看这些标头,请在浏览器 devtools 中打开“网络”窗格并重新加载文档并检查那里的响应——或者使用 Postman 或 curl 或其他一些命令行工具来检查响应的 HTTP 标头。因此,如果您确实在那里找到了 Content-Security-Policy 标头,但您无法在哪里/如何将服务器端代码添加到响应中,我认为您可能想发布一个新的单独问题以获得帮助.

标签: asp.net-core-mvc font-awesome content-security-policy


【解决方案1】:

问题的错误消息中引用的该政策具有default-src 'self',但您的meta 元素中显示的政策却没有。这似乎表明除了meta 中的策略之外,还使用Content-Security-Policy HTTP 标头中的策略为您的文档提供服务。

而其他政策相对严格,因为它有default-src 'self' 而没有style-src。因此,当您使用 meta 指定另一个不太严格的策略时,问题是当您指定多个策略时 CSP 的工作方式是,最严格的策略总是胜出。因此,您的浏览器基本上忽略了您的 meta 策略,而只使用 HTTP 标头中指定的策略。

解决方案是:在服务器代码中找到添加 Content-Security-Policy HTTP 标头的位置,然后更改它以使其具有您想要的确切策略,或者完全删除该部分服务器代码,而是只需使用 meta 元素设置策略即可。

【讨论】:

  • 我没有意识到这些标题是由我的后端手动设置的。一旦我删除它们,一切正常。
猜你喜欢
  • 2019-01-03
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多