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
在相同场景下给我同样的错误。
如果删除integrity
和crossorigin
会怎样?如果你重新生成它会发生什么?
我删除了这些标签,但我仍然收到错误消息。你能澄清一下你所说的再生这个是什么意思吗?
您可以使用: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 中中断登录