[英]Web API CORS implementation
首先,我要了解CORS的概念以及它的主要工作原理,但是我對如何在Microsoft的Web API中實現有一個非常具體的問題。 我已經在Global.ascx.cs
文件中配置了CORS,如下所示:
var cors = new EnableCorsAttribute("https://example.com", "*", "*");
config.EnableCors(cors);
現在,當我在Web api中請求標有Origin: https://example.com
我得到一個包含標頭Access-Control-Allow-Origin: https://example.com
Origin: https://example.com
的響應。 。 但是,當我請求具有不同Origin
值或完全沒有該標頭的相同資源時,來自服務器的響應沒有Access-Control-Allow-Origin
標頭。
這是理想的結果嗎? 還是服務器應該始終使用Access-Control-Allow-Origin
標頭進行響應?
我問是因為我們已經讓Veracode掃描了我們的代碼庫,並且他們說響應應該始終包含標頭Access-Control-Allow-Origin: https://example.com
。 據我了解,瀏覽器仍然會No 'Access-Control-Allow-Origin' header is present on the requested resource
拋出No 'Access-Control-Allow-Origin' header is present on the requested resource
無論標頭存在於其他來源還是標頭根本不存在(我認為不公開允許的域將是首選解決方案)。
另外,我確實知道可以通過將其添加到web.config
來使標題始終顯示:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="https://example.com" />
</customHeaders>
</httpProtocol>
</system.webServer>
但是我真的只是想知道什么是正確的實現。
該行為是設計使然:
如果響應不包含Access-Control-Allow-Origin標頭,則AJAX請求失敗。 具體來說,瀏覽器不允許該請求。 即使服務器返回成功的響應,瀏覽器也不會將響應提供給客戶端應用程序。
鏈接的文章在CORS的工作方式部分中包含完整的說明。
它還提供了瀏覽器發送預檢請求時的信息,以及如何在預檢請求中啟用標頭Access-Control-Request-Method和Access-Control-Request-Header
規范還告訴您,響應中可能包含帶有適當值的標頭,以允許訪問資源,但是如果資源對於客戶端不可用,則不必包含此標頭
HTTP對CORS請求的響應可以包括以下標頭:
Access-Control-Allow-Origin
指示是否可以通過返回
Origin
請求標頭的文字值(可以為null
)或響應中的*
來共享響應。
編輯
從W3 Recomendation更明確地講,不允許從其他來源訪問的資源不應包含Access-Control-Allow-Origin標頭
對於其他來源的應用程序無用的資源(例如登錄頁面),不應返回Access-Control-Allow-Origin標頭。 資源仍然必須保護自己免受CSRF攻擊,例如要求在顯式提供的請求內容中包含不可猜測的令牌。 此類資源的安全屬性不受符合此規范的用戶代理的影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.