我正在构建一个 Angular 应用程序,它与使用 ASP.NET Web API 2 构建的 API 进行交互。我正在使用基本身份验证,方法是在每个需要身份验证的请求中发送一个 Authorization
header :
Angular 片段:
$http.defaults.headers.common['Authorization'] = authHeader;
请求:
Accept:application/json, text/javascript
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Max-Age:1728000
Authorization:Basic [base64 encoded credential couplet here]
Connection:keep-alive
DNT:1
Host: blah.com
Origin:http://localhost:9000
Referer:http://localhost:9000/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/53
一切正常,但是预检 OPTIONS
请求随每个 GET
或 POST
请求一起发送。这主要影响应用程序的感知速度。我已经阅读了大量关于 CORS“简单请求”的文章,似乎为了避免可怕的预检 OPTIONS
请求,避免在我的请求中添加任何自定义 header 。我已经尝试了很多其他的东西,比如发送 text/plain
的 Content-Type
,但似乎 Authorization header 是违反 CORS“简单请求”要求。
所以看来我可能必须将 API 移到使用基于 token 的身份验证/授权。为了避免预检请求,我似乎需要将 token 放在查询字符串中。这没关系,因为它只是一个小型的内部网络应用程序,无论如何只能由几个用户访问。我打算在 Controller 响应上实现缓存。由于对 Controller 操作的每个请求都会根据当前经过身份验证的用户在查询字符串中具有不同的 token ,这会导致缓存无用吗?
所以:
- 如何避免预检请求(尽可能使用自定义授权 header )
- 如果
1.)
不可能,并且我转向基于 token 的身份验证,我是否无法缓存 Controller 操作的 API 响应 - 使用最广泛的方法有哪些,既可以避免预检请求又可以安全地对用户进行身份验证?
n.b 我知道 SO 和网络上的其他地方有几个其他线程与此有关,但没有一个倾向于提供关于是否可以避免 GET
预检请求的明确答案>s 和 POST
使用自定义 HTTP
授权 header 时。
最佳答案
我认为这篇文章 ( How to apply CORS preflight cache to an entire domain) 几乎已经说明了一切 - 您对此无能为力
一个简单的解决方案是向为您的 Angular 应用程序(例如 nginx)提供服务的代理/网络服务器添加一个反向代理,以通过相同的域路由您的 RESTful 调用,例如appdomain.com/api --> apidomain.com.
关于asp.net - 使用 CORS 避免预检 OPTIONS 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30403926/