使用CORS避免预检OPTIONS请求

ada*_*aam 17 asp.net http cors asp.net-web-api angularjs

我正在构建一个Angular应用程序,该应用程序与使用ASP.NET Web API 2构建的API交互.我使用基本身份验证通过向Authorization每个需要身份验证的请求发送标头:

Angular片段:

$http.defaults.headers.common['Authorization'] = authHeader;
Run Code Online (Sandbox Code Playgroud)

请求:

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
Run Code Online (Sandbox Code Playgroud)

这一切都可以,但OPTIONS每次GETPOST请求都会发送预检请求.这主要影响应用程序的感知速度.我已经对CORS"简单请求"进行了大量阅读,似乎为了避免可怕的预检OPTIONS请求是为了避免在我的请求中添加任何自定义标头.我试过许多像发送其他的东西Content-Typetext/plain,但似乎授权头是违反CORS"简单的要求"的要求的东西.

所以我似乎不得不将API移到使用基于令牌的身份验证/授权.为了避免预检请求,似乎我需要将令牌放在查询字符串中.这是可以的,因为它只是一个小的内部网络应用程序,无论如何只能由几个用户访问.我打算在控制器响应上实现缓存.由于每个对控制器操作的请求都会根据当前经过身份验证的用户在查询字符串中具有不同的标记,这会使缓存无效吗?

所以:

  1. 如何避免预检请求(如果可能的话,使用自定义授权标头)
  2. 如果1.)不可能,并且我转移到基于令牌的身份验证,我将无法缓存控制器操作的API响应
  3. 什么是最广泛使用的方法来避免预检请求,还安全地授权用户?

nb我知道SO上和网上其他地方还有其他几个关于此的线程,但是没有一个关于是否有可能在使用自定义授权头时避免对GETs和POSTs的预检请求提供明确的答案HTTP.

Ret*_*eto 10

我认为这篇文章(如何将CORS预检缓存应用于整个域)几乎都说明了这一点 - 你可以做的很少

一个简单的解决方案是向服务于您的角度应用程序(例如nginx)的代理/网络服务器添加反向代理,以通过相同的域路由您的RESTful呼叫,例如appdomain.com/api - > apidomain.com.