2016-12-14 124 views
0

我正在構建一個mvc應用程序,我正在製作一個api控制器以允許來自我的一些前端頁面的ajax請求。我想限制api控制器操作只允許來自我的服務器的請求(所以人們不能從他們自己的站點調用我的api)。mvc web api只允許來自同一服務器的請求

經過一番周圍搜索,我發現了許多解決方案提出了一個自定義的授權屬性,這是我做:

public class LocalRequestOnlyAttribute : AuthorizeAttribute 
    { 
    protected override bool AuthorizeCore(HttpContextBase context) 
      { 
       return context.Request.IsLocal; 
      } 
} 

,然後用[LocalRequestOnly]

它正常工作在本地主機上把它扔到了我的控制器動作,但我的AWS服務器上,這是行不通的,Ajax請求回來爲錯誤

編輯 - 詳細:

我正在使用具有相對路徑的主機名。所以我的ajax調用的網址是「/ api/getdata」。 我沒有設置任何ajax請求標頭。 我回來的錯誤是No 'Access-Control-Allow-Origin' header is present on the requested resource.

+0

你有更多的信息嗎?你使用IP或主機名連接? AJAX請求標頭是什麼樣的?返回的錯誤是什麼? – murtuza

+0

細節增加 – blubberbo

回答

0

爲了將api控制器操作限制爲僅允許來自服務器的請求,您應該什麼都不做。我相信Ajax請求中引發的錯誤是與瀏覽器拒絕跨源HTTP請求(來自其他服務器的請求)相關的錯誤。所以你所要做的就是添加一個錯誤處理程序(一個try塊),以便在創建一個跨源HTTP請求時存在Ajax邏輯。 閱讀此:https://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

+0

所以如果我什麼都不做,那麼來自其他服務器的HTTP請求將被阻止?但我可以通過郵遞員向我的服務器發送郵件,並返回數據。如果它只允許從我的網絡服務器,它應該拒絕郵遞員的請求,不是? – blubberbo

+0

以前從未使用posmtan。但是,如果posmtan和您的Web應用程序位於同一臺計算機上,則它是相同的域。 – Issac

+0

他們不是... – blubberbo

0

你不需要做任何事情。默認情況下,Web API只允許來自同一個域的請求,CORS不受支持。

+0

Hiw來郵遞員的作品呢? – blubberbo

+0

@blubberbo,我不知道郵差,從來沒有使用過它。你能簡單地用jQuery創建一個簡單的html頁面,試着用jQuery.ajax來調用你的web頁面中的api。我相信你不能訪問該API。 –

0

否「訪問控制允許來源」標題存在於所請求的資源

表示 1.你的服務器拒絕跨來源HTTP請求。這是你尋找的行爲,對吧? 2.您的服務器要求CORS允許從不同域訪問資源(您的API控制器),但沒有找到必要的Access-Control-Allow-Origin響應標頭,該標頭指示是否可以與資源共享響應在其他域名上的腳本)與給定的來源。

這個「錯誤」,在我看來,不是錯誤代碼的結果。同樣,你應該定義一個方法來處理這種失敗,當你對服務器進行Ajax調用時,它(這個方法)應該正常退出。

0

你不能阻止它,因爲Http是無狀態的,只有檢查該請求是來自服務器或站點的請求的方法 - 使用Http標頭,但這些標頭不可信,因爲它們可以通過服務器端編碼進行手動設置。

但是,通過禁用CORS並檢查這些Http頭像Referer(包含從哪裏發出Ajax請求的網頁的地址),User-Agent和X-Requested-With(設置爲XMLHttpRequest for ajax要求)。

相關問題