2014-03-06 59 views
0

考慮到這一點之後跨域請求(在Safari 5.0.2,任何操作系統複製f.ex.):傳遞自定義頁眉在跨域Ajax請求一些老的瀏覽器

請求

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'http://myhost.tld/odata/Account(518059)', false); 
xhr.setRequestHeader('Authorization','Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJsb2phYWxpLXdlYmFwaS5jbG91ZGFwcC5uZXQiLCJleHAiOjEzOTQxMjM2MzcsImlzcyI6IldlYkFwaSIsImNhbXBJZCI6MjksInBvcnRhbElkIjozMiwidXNlcklkIjo1MTgwNTl9.c8223aYpb4X7kwYLSmSSQr4wGytxcYtOzTlQuHa9mYU'); 
xhr.send(); 
xhr.responseText; 

響應

Error: NETWORK_ERR: XMLHttpRequest Exception 101 

接頭

OPTIONS /odata/Account(518059) HTTP/1.1 
Host: myhost.tld 
Accept: */* 
Accept-Language: en-US 
Access-Control-Request-Method: GET 
Origin: http://myclient.tld 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.2; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 
Accept-Encoding: gzip, deflate 
Access-Control-Request-Headers: Authorization 
Content-Length: 0 
Connection: keep-alive 
Connection: keep-alive 

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Expires: -1 
Server: Microsoft-IIS/8.5 
Access-Control-Allow-Origin: http://myclient.tld 
Access-Control-Allow-Methods: GET 
Access-Control-Allow-Headers: Authorization 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Thu, 06 Mar 2014 16:37:26 GMT 
Content-Length: 0 

我驗證了網頁API正確處理該請求,並用確實HTTP 200返回數據。然而,請求似乎未能對一些舊的瀏覽器。所以,我繼續和硬編碼授權令牌在服務器端,並從公式離開它和:

請求

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'http://myhost.tld/odata/Account(518059)', false); 
xhr.send(); 
xhr.responseText; 

響應

{ 
    'odata.metadata': 'http://myhost.tld/odata/$metadata#Account/@Element', 
    'Id': 518059, 
    'userName': '643033849' 
} 

瞧,它突然開始工作。所以,我下載整個互聯網到我的硬盤驅動器並閱讀它,但無法找到f.ex的驗證。較舊的Safaris不支持包含跨域請求的自定義標頭,我也無法找到可能的解決方案,無需進入明顯的Http Handler或JSONP路由。

因此,除了上述「修復」之外,我還有什麼可以將此令牌從我的客戶端安全地傳輸到服務器,從而避免了自定義標頭。或者,有沒有辦法讓他們工作?

Cookie?

請不要這樣建議。除非用戶訪問了跨域請求的目標站點,否則一些Safari版本(包括5.0.2)會阻止跨域Cookie。

回答

0

最終,我發現沒有辦法真正解決這個問題。就像一些老版本的瀏覽器根本不支持在CORS請求中傳遞自定義標頭。而且由於我們在身份驗證中使用Json Web Tokens,所以我真的需要這樣做。

所以,我發現這個Application Request Routing (ARR)模塊在IIS,它使用URL Rewrite引擎創建一個reverse proxy。更具體地說,將^/odata(.*)$下的所有請求映射到我的後端web api主機。

這裏的高級步驟來配置一個反向代理

  1. 打開IIS管理器
  2. 打開網站
  3. 在功能視圖,選擇URL重寫(只要它已經安裝)
  4. 選擇添加規則
  5. 在入站和出站規則中,選擇反向代理
  6. 如果您尚未安裝應用程序請求路由(ARR)有別,它會提示你做到這一點,接受
  7. 創建規則的路徑映射到後端服務器
  8. 保存之後,這些規則將被寫入對Web.config

    <rewrite> 
        <rules> 
        <rule name="ODataApiReverseProxy" stopProcessing="true"> 
         <match url="^odata(.*)$" /> 
         <action type="Rewrite" url="http://webapi.host.tld/{R:0}" /> 
        </rule> 
        </rules> 
        <outboundRules> 
        <rule name="ODataRewriteJson" preCondition="ResponseIsJson" patternSyntax="ExactMatch"> 
         <match filterByTags="None" pattern="webapi.host.tld" /> 
         <action type="Rewrite" value="client.host.tld" /> 
        </rule> 
        <preConditions> 
         <preCondition name="ResponseIsJson"> 
         <add input="{RESPONSE_CONTENT_TYPE}" pattern="^application/json" /> 
         </preCondition> 
        </preConditions> 
        </outboundRules> 
    </rewrite> 
    

現在,客戶端將完全跳過CORS預檢,因爲它連接到同一個主機。此外,在配置,緩存,負載平衡,監控和管理等方面,ARR允許更多。