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

Posted

技术标签:

【中文标题】Firefox 阻止对 ASP.NET 身份更改/模拟的简单 CORS 请求【英文标题】:Firefox blocking simple CORS request on ASP.NET Identity change/impersonate 【发布时间】:2019-03-18 09:48:11 【问题描述】:

我正在与一些使用 ASP MVC 5 的同事一起开展一个项目,我们正在使用来自公共 CDN 的许多常见 javascript 库。我已经配置并启用了 CORS,除了这个特殊情况外,一切正常,我们在这一点上有点难过。

该应用使用 ASP.NET Identity 2,并且某些功能依赖于模拟功能。后端实现一般遵循这里的答案:How do I use ASP.NET Identity 2.0 to allow a user to impersonate another user?

前端使用带有防伪令牌的 AJAX 发布到 WebAPI 端点(遵循此特定实现:https://***.com/a/24394578/5330050)。为了使新身份生效,应用程序执行window.location.reload(true);

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

跨域请求被阻止:同源策略不允许读取 远程资源在 https://cdnjs.cloudflare.com/some.js。 (原因:CORS 请求没有成功)

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

这些资源的调用方式没有什么特别之处。这不是 POST 请求。它就在<head> 中,例如:

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

可以解决问题的方法(但就用户体验而言是不可接受的)

    清除缓存(但不清除 cookie)

    等待 5 分钟(让 Firefox 忘记?会话设置为 12 小时 服务器)

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

【问题讨论】:

您是否尝试过其他 CDN?例如:https://code.jquery.com/jquery-3.3.1.min.js。只是为了确认该问题与cdnjs.cloudflare.com 无关。 我刚刚做了一堆测试,结果好坏参半。 code.jquery.com 有效,但 stackpath.bootstrapcdn.com 在相同场景下给我同样的错误。 如果删除integritycrossorigin 会怎样?如果你重新生成它会发生什么? 我删除了这些标签,但我仍然收到错误消息。你能澄清一下你所说的再生这个是什么意思吗? 您可以使用:srihash.org 重新生成完整性和跨域。我认为它不会解决问题,但只是为了确保这不会导致问题。我建议使用code.jquery.com CDN 或类似的解决方法(目前) 【参考方案1】:

这并不是一个真正的答案,但我已经特别了解了我上面的案例发生了什么。我有一个后续问题,但在此之前我将分享我的发现:

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

在响应凭据请求时,服务器必须指定一个 来源在 Access-Control-Allow-Origin 标头的值中,而不是 指定“*”通配符。

因为上例中的请求头包含一个 Cookie 标头,如果值为 Access-Control-Allow-Origin 标头为 "*"。但它不会失败: 因为Access-Control-Allow-Origin 标头的值是 “http://foo.example”(实际来源)而不是"*" 通配符, 凭证识别内容返回到调用网络 内容。

请注意,上面示例中的 Set-Cookie 响应标头也 设置另一个cookie。在失败的情况下,一个例外——取决于 使用的 API — 已引发。

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

我仍然很困惑为什么它会发生在脚本标签上,所以我的后续问题会沿着这些思路。

【讨论】:

以上是关于Firefox 阻止对 ASP.NET 身份更改/模拟的简单 CORS 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 asp.net 身份以从​​数据库中获取对声明的更改?

ASP.NET MVC 表单身份验证域属性在 Firefox 中中断登录

如何阻止 ASP.NET 更改 ID 以使用 jQuery

保存数据库控制器类 asp.net mvc5 身份中的更改

无法更改 Asp 身份表名称.....Asp .Net Core 2?

ASP.NET Core JWT 身份验证更改声明(子)