我正在构建一个与使用ASP.NET Web API 2构建的API进行交互的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
这一切都可以正常工作,但是每个GET或POST请求都会发送一个预检OPTIONS请求.这主要影响了应用程序的感知速度.我在CORS“简单请求”上做了很多阅读,似乎为了避免可怕的预检OPTIONS请求是避免在我的请求中添加任何自定义标头.我尝试了许多其他的东西,例如发送文本/简单的Content-Type,但是似乎授权标题是违反CORS“简单请求”要求的事情.
所以似乎我可能需要将API移动到使用基于令牌的身份验证/授权.为了避免预检请求,似乎需要将令牌放在查询字符串中.这是可以的,因为它只是一个小的内部网络应用程序,只有几个用户无论如何访问.我打算在控制器响应上实现缓存.由于对控制器动作的每个请求都将在基于当前验证的用户的查询字符串中具有不同的令牌,这会使缓存无效吗?
所以:
>如何避免预检请求(如果可能,使用自定义授权标头)
>如果没有),我移动到基于令牌的auth,将无法缓存控制器操作的API响应
>什么是最广泛使用的方法来避免预检请求,但也安全地认证用户?
n.b我知道SO和其他网络上有其他一些线程关于这个,但是没有一个提供一个明确的答案,可以避免在使用自定义HTTP授权标头时避免GETs和POST的预检要求.
解决方法
我认为这个帖子(
How to apply CORS preflight cache to an entire domain)几乎说了这一切 – 你可以做的不多
一个简单的解决方案是向服务于角度应用程序(例如Nginx)的代理/网络服务器添加一个反向代理,以通过相同的域路由您的RESTful呼叫,例如appdomain.com/api – > apidomain.com.