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

时间:2018-10-13 10:03:34

标签: javascript c# asp.net cors asp.net-identity

我正在与一些使用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>

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

  1. 清除缓存(但不清除cookie)

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

我真的不知道可能是什么原因,对于在寻找解决方法或寻找解决方案的线索方面所提供的帮助,我深表感谢。

1 个答案:

答案 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标签一起发生,所以我的后续问题将遵循这些思路。