使用 CORS 避免預檢 OPTIONS 請求
我正在建構一個 Angular 應用程序,它與使用 ASP.NET Web API 2 建構的 API 進行互動。我正在使用基本身份驗證,方法是
Authorization在每個需要身份驗證的請求中發送一個標頭:角度片段:
$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請求,就是避免在我的請求中添加任何自定義標頭。我已經嘗試了很多其他的東西,比如發送 aContent-Typeoftext/plain,但似乎 Authorization 標頭是違反 CORS“簡單請求”要求的東西。所以看來我可能不得不移動 API 以使用基於令牌的身份驗證/授權。為了避免預檢請求,我似乎需要將令牌放在查詢字元串中。這沒關係,因為它只是一個小型內部網路應用程序,無論如何只能由幾個使用者訪問。我打算在控制器響應上實現記憶體。由於對控制器操作的每個請求都會根據目前經過身份驗證的使用者在查詢字元串中具有不同的令牌,這會使記憶體變得無用嗎?
所以:
- 如何避免預檢請求(盡可能使用自定義授權標頭)
- 如果
1.)不可能,並且我轉向基於令牌的身份驗證,我將無法記憶體控制器操作的 API 響應- 什麼是最廣泛使用的方法來避免預檢請求以及安全地驗證使用者?
nb 我知道在 SO 和網路上的其他地方還有其他幾個執行緒與此有關,但沒有一個傾向於提供關於在使用自定義授權標頭時是否可以避免對
GETs 和s 的預檢請求的明確答案。POST``HTTP
我認為這篇文章(如何將 CORS 預檢記憶體應用於整個域)幾乎說明了一切 - 您對此無能為力
一個簡單的解決方案是將反向代理添加到為您的 Angular 應用程序(例如 nginx)提供服務的代理/網路伺服器,以通過同一域(例如 appdomain.com/api –> apidomain.com)路由您的 RESTful 呼叫。