ASP.NET 应用程序 - 在用户登录网站之前不会加载 Webfonts

ASP.NET app - Webfonts not loading until user is logged in to the site

已编辑

又调试了一遍,终于明白问题所在了(虽然不是怎么解决的)。

当浏览器尝试加载相关页面的字体时,响应状态代码为 302 并且

Location: /Login.aspx?ReturnUrl=%2ffonts%2ffontawesome-webfont.woff2

我们的身份验证模式默认将所有请求重定向到登录页面,看起来也包括字体:

<authentication mode="Forms">
  <forms loginUrl="~/Login.aspx" defaultUrl="~/Login.aspx" slidingExpiration="true" protection="All" timeout="60" path="/" />
</authentication>
<authorization>
  <deny users="?" />
</authorization>

之前这不是问题,因为您已经登录甚至可以看到网站上的大部分页面,并且在您登录之后,字体加载正常。但是我正在处理的页面不需要登录(甚至不需要网站上的用户帐户),因此出现了问题。

更新后的问题是:如何使字体在没有身份验证的情况下加载,而不危及身份验证本身(安全风险等)?

原始post

我们有一个 ASP.NET Webforms 应用程序,已经有好几年了,我已经开始尝试向它添加 Bootstrap。到目前为止一切顺利,但我无法让字形图标工作 - 不断出现错误方块而不是图标。我们已经成功使用 Fonts Awesome 一段时间了,所以我尝试了他们的图标 - 不,相同的错误方块(同样,在页面 没有 Bootstrap Fonts Awesome 正常工作)。

Bootstrap 安装为 Nuget 包(最新版本,3.3.7)。 Font Awesome 是 4.4.0 并且是手动安装的。我们确实使用 Sass/Less.

我们通过捆绑添加 scripts/css:

        bundles.Add(new StyleBundle("~/css/styles").Include(
            "~/css/bootstrap.css",
            "~/css/font-awesome.min.css"));

这就是 web.config 现在的样子:

<staticContent>
  <mimeMap fileExtension="apk" mimeType="application/vnd.android.package-archive" />
  <remove fileExtension=".woff2" />
  <mimeMap fileExtension=".woff2" mimeType="font/woff2" />
  <remove fileExtension=".otf" />
  <mimeMap fileExtension=".otf" mimeType="font/otf" />
  <remove fileExtension=".woff" />
  <mimeMap fileExtension=".woff" mimeType="font/x-woff" />
  <remove fileExtension=".eot" />
  <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
  <remove fileExtension=".ttf" />
  <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" />
  <remove fileExtension=".svg" />
  <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
</staticContent>

现在好像很多人都有类似的问题。以下是我迄今为止尝试过的解决方案:

  1. 将 css 文件和字体放入默认文件夹(/css 和 /fonts 在同一级别,Bootstrap 期望看到它们;覆盖 @font-face 中的 url也不起作用)- 这种改进很重要,因为现在两种字体都可以在 Firefox(大部分时间)和 Chrome(一半时间)中使用,但不能在 Edge/IE 中使用。
  2. web.config 中 MimeType 的不同组合(没有任何区别)。
  3. 正在将 Font Awesome 更新到最新版本 - 也没有区别。
  4. Internet Explorer won't display Glyphicons or WebFonts - 考虑过,但如果是这样,为什么问题只在启用 Bootstrap 时出现?
  5. 正在清除浏览器缓存(重复)。
  6. IE 安全设​​置中的“不受信任的字体阻止”选项 - 默认情况下处于关闭状态,因此并非如此。
  7. 使用开发工具检查字体是否实际加载 - 现在这才是有趣的地方。

Chrome 给出 "Failed to decode downloaded font: (...) OTS parsing error: invalid version tag" 错误(当它出现时),Edge 给出 "CSS3114: @font-face unable to load invalid OpenType font"(reference 说它应该是 CSS3115,但是无论如何,"get permission or licenses" 没有多大帮助)。

对于这两种浏览器,网络选项卡显示加载的字体文件为 text/html 并找到 302(并且 page/console 仍然有错误)。对于 Chrome,如果我多次重新加载页面,最终字体文件加载状态会更改为 200 OK 并键入字体。这意味着 mimetypes 有问题,但为什么它在足够的重新加载后会自行修复?

同样,Font Awesome 可以在不使用 Bootstrap 的页面上运行,并且文件会按预期加载。

我在这里错过了什么?任何想法都会受到赞赏,因为我被卡住了。

最后,我将字体文件夹作为例外添加到 web.config,就是这样(是的,真的就是这么简单。叹气):

<location path="fonts">
  <system.web>
    <authorization>
      <allow users="*" />
    </authorization>
  </system.web>
</location>

将原始问题留在此处以提醒您,当您不太清楚自己在做什么时,您很容易误解事情并变得绝望:)