2013-12-15 111 views
3

我有一個MVC控制器公開Initialise Action。託管在同一個IIS上的其他虛擬Web應用程序需要訪問此Action.asp.net mvc行動只允許來自同一個網絡服務器的請求

出於安全原因,只有來自相同Web服務器(託管MVC應用程序的請求)的請求才需要被授予對此Iniliase方法的訪問權限。

有人可以幫助如何做到這一點?我們無法使用localhost進行驗證,因爲此應用程序將託管在不支持locahost請求的Azure中。

+0

如何'Initialise'被稱爲?通過AJAX,通過服務器端調用還是通過其他方法? – SilverlightFox

+0

通過服務器感謝 –

回答

0

Access-Control-Allow-Origin告訴瀏覽器關於其對域的可訪問性。請嘗試指定:

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "yourdomain") 

我還沒有測試過,以確定它是否有效。

5

我的答案是關於限制服務器端的請求。

調用Initialise網站需要主動要求http://www.example.com/controller/Initialise而非http://localhost/controller/Initialise(更換www.example.comcontroller當然是有你的域控制器和名稱)。

HttpRequest.IsLocal應該在你的控制器動作進行檢查:

if (!Request.IsLocal) 
{ 
    thrown new SecurityException(); 
} 

這將拒絕不從本地主機來的任何請求。這種方法假設兩個呼叫站點和請求的站點共享相同的IP地址 - 該文件指出,這應該工作:

的IsLocal屬性返回true,如果請求發起方的IP地址爲127.0.0.1或如果請求的IP地址與服務器的IP地址相同。

限制客戶端請求Google「csrf mitigation」。

0

我認爲Request.IsLocal是去這裏的路。既然你使用MVC,你可以實現一個自定義屬性來爲你做這個。請參閱我的回答here以獲得一個工作示例

0

如果您的服務器有多個IP地址,則需要一些額外的代碼。下面處理多個IP地址,並處理CDN喜歡的CloudFlare這將在Request.UserHostAddress屬性錯誤的IP地址。

代碼:

private bool IsLocal() 
{ 
    if (Request.IsLocal) 
    { 
     return true; 
    } 
    string forwardIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
    foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces()) 
    { 
     IPInterfaceProperties ipProps = netInterface.GetIPProperties(); 
     foreach (UnicastIPAddressInformation addr in ipProps.UnicastAddresses) 
     { 
      string ipString = addr.Address.ToString(); 
      if (Request.UserHostAddress == ipString || forwardIP == ipString) 
      { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
+0

HTTP_X_FORWARDED_FOR可以,所以如果你不使用CDN它可能是更好完全刪除它被欺騙。 – jjxtra

相關問題