我正在与一些使用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?
前端对WebAPI端点使用带有防伪令牌的AJAX帖子(遵循此特定实现:https://stackoverflow.com/a/24394578/5330050)。为了使新身份生效,该应用会执行window.location.reload(true);
。
在这一点上,Firefox阻止了所有CORS请求(所有请求都是对CDN上托管的库和框架的请求)。这是特定的错误(所有请求相同,不同的lib,相同的域):
跨源请求被阻止:同源策略禁止阅读 位于的远程资源 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小时) 服务器)
我真的不知道可能是什么原因,对于在寻找解决方法或寻找解决方案的线索方面所提供的帮助,我深表感谢。
答案 0 :(得分:0)
这并不是一个真正的答案,但是我已经具体发现了我上面的情况。我有一个后续问题,但在此之前,我将分享我发现的内容:
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)将发送通配符标头,因为这是完成操作的标准。
尽管如此,我仍然感到困惑,为什么它会与script标签一起发生,所以我的后续问题将遵循这些思路。