2017-03-09 128 views
3

我有一個Web服務器上的一個小的Web API應用程序,一個GET方法返回3條記錄,一個POST方法接受一個對象,然後分配它是一個ID並返回相同的對象。訪問控制允許的方法似乎並沒有工作

我正在從本地web應用程序進行ajax調用,並測試了我的CORS實現。到目前爲止,幾乎所有的東西都運行良好。如果我沒有指定Access-Control-Allow-Origin(現在只設置爲*),我的呼叫就不允許(我期望的),但我也試過指定Access-Control-Allow-Methods,而不是看起來像我的輸入限制了特定的來電。

例如,這是我的web.config包含:

<httpProtocol> 
    <customHeaders> 
    <clear /> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization, Accept, X-Requested-With " /> 
    <add name="Access-Control-Allow-Methods" value="OPTIONS, GET" /> 
    </customHeaders> 
</httpProtocol> 

我只有OPTIONSGET上市,但我仍然能夠作出POST請求。同樣,如果我將它設置爲"OPTIONS, POST",我仍然可以發出GET請求。

編輯

基於從@geekonaut答案下面我能夠看到的,我期望這個功能。我試圖嘗試一個PUT請求,而不是GET或,但後來發現有一個錯誤,即OPTIONS(印前檢查)請求不被允許。我首先需要在我的Global.asax.cs文件中添加一個部分來接受該方法,然後如果我在我的web.config的Access-Control-Allow-Methods值中添加/刪除PUT,我發現只有在列出該方法時才允許使用該方法。

protected void Application_OnBeginRequest() 
{ 
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
    { 
     HttpContext.Current.Response.StatusCode = 200; 
     HttpContext.Current.Response.End(); 
    } 
} 
+0

從任何請求之後預檢請求或報頭的任何有用的信息? –

+0

任何具體我應該找?我發現它正在嘗試一個POST請求,並且Access-Control-Allow-Methods的值是'OPTIONS,GET',所以似乎所有事情都是在飛行前正確設置的。 – Goose

+0

我沒有真正進入asp.net,但是你是否嘗試過類似**過濾器中的動詞**部分提到的配置[https://www.iis.net/learn/manage/configuring-security/use -request-filtering](https://www.iis.net/learn/manage/configuring-security/use-request-filtering),我開始認爲服務器可能只發送頭文件,而沒有真正的驗證的客戶端請求。 –

回答

3

CORS並不妨礙基於其方法簡單(或甚至預檢)POST請求。例如,

Access-Control-Allow-Methods只適用於不能用簡單的跨源表單創建的請求。

這意味着:GETPOST可以跳過Access-Control-Allow-Methodsthe spec描述:使用GET或POST或本說明書 外部產生

簡單跨域請求(如跨來源表單提交 源自腳本元素的交叉源GET請求)通常包含用戶憑證,所以符合此 規範的資源必須始終準備好期望簡單的交叉源 憑證憑證。

正因爲如此,資源,這簡單的要求具有重要意義 比檢索等必須通過要求的不可猜測令牌列入 請求的明確規定的內容保護自己不受跨站點請求 僞造(CSRF)的。

(重點煤礦)

+0

完美,這是有道理的,我之前從未在文檔中看到過那部分。我將在上面修改我的問題,以顯示我如何能夠像我所期望的那樣查看'Access-Control-Allow-Methods'屬性函數。 – Goose

相關問題