Firefox 在 ASP.NET 身份更改/模拟上阻止简单的 CORS 请求



我正在和一些同事一起使用ASP MVC 5进行一个项目,我们正在使用许多来自公共CDN的常见Javascript库。我已经配置并启用了 CORS,除了这一种特定情况外,一切正常,我们在这一点上有些困惑。

应用使用 ASP.NET 标识 2,某些函数依赖于模拟功能。后端实现通常遵循此处的答案:如何使用 ASP.NET 标识 2.0 允许用户模拟其他用户?

前端使用带有防伪令牌的 AJAX 帖子到 WebAPI 端点(遵循以下特定实现:https://stackoverflow.com/a/24394578/5330050(。要使新标识生效,应用会执行window.location.reload(true);

正是在这一点上,Firefox 阻止了所有 CORS 请求(所有这些请求都是对托管在 CDN 上的库和框架的请求(。这是特定的错误(所有请求相同,不同的库,相同的域(:

跨源请求被阻止:同源策略不允许读取 位于的远程资源 https://cdnjs.cloudflare.com/{一些.js}。 (原因:CORS 请求未成功(

此问题只发生在火狐中。即使我尝试导航到应用程序中的其他页面,它也会继续阻止这些资源。 除非我清除缓存(但不是cookie,因此身份仍然存在(,否则一切又好了。

如何调用这些资源并没有什么特别之处。这不是开机自检请求。它就在<head>,例如:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>

可以解决它的事情(但就用户体验而言是不可接受的(

  1. 清除缓存(但不是 Cookie(

  2. 等待 5 分钟(让火狐忘记?会话设置为 12 小时 服务器(

我真的不知道原因可能是什么,我很感激任何帮助,以找到解决方法或线索,以便在哪里寻找解决方案。

这不是一个真正的答案,但我已经具体发现了上面我的情况。我有一个后续问题,但在此之前,我将分享我的发现:

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Requests_with_credentials

响应有凭据的请求时,服务器必须指定 在访问控制允许源标头的值中的 origin,而不是 指定"*"通配符。

因为上面示例中的请求标头包含一个 Cookie 标头,如果Access-Control-Allow-Origin"*"。但它并没有失败: 因为Access-Control-Allow-Origin标头的值是 "http://foo.example"(实际原点(而不是"*"通配符, 凭据识别内容返回到调用 Web 内容。

请注意,上面示例中的 Set-Cookie 响应标头也 设置另一个饼干。如果发生故障,则为例外 — 取决于 使用的 API - 已引发。

这正是正在发生的事情,因为在用户登录之前不会发生此问题。 cdnjs(或任何其他CDN(将发送通配符标头,因为这是完成方式的标准。

我仍然很困惑为什么它会发生在脚本标签上,所以我的后续问题就是这样。

最新更新