我有一個MVC控制器公開Initialise Action
。託管在同一個IIS上的其他虛擬Web應用程序需要訪問此Action.
asp.net mvc行動只允許來自同一個網絡服務器的請求
出於安全原因,只有來自相同Web服務器(託管MVC應用程序的請求)的請求才需要被授予對此Iniliase方法的訪問權限。
有人可以幫助如何做到這一點?我們無法使用localhost進行驗證,因爲此應用程序將託管在不支持locahost請求的Azure中。
我有一個MVC控制器公開Initialise Action
。託管在同一個IIS上的其他虛擬Web應用程序需要訪問此Action.
asp.net mvc行動只允許來自同一個網絡服務器的請求
出於安全原因,只有來自相同Web服務器(託管MVC應用程序的請求)的請求才需要被授予對此Iniliase方法的訪問權限。
有人可以幫助如何做到這一點?我們無法使用localhost進行驗證,因爲此應用程序將託管在不支持locahost請求的Azure中。
Access-Control-Allow-Origin
告訴瀏覽器關於其對域的可訪問性。請嘗試指定:
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "yourdomain")
我還沒有測試過,以確定它是否有效。
使用ASP.NET MVC提供的AntiForgeryToken。這裏有一篇關於這方面的文章。
我的答案是關於限制服務器端的請求。
調用Initialise
網站需要主動要求http://www.example.com/controller/Initialise
而非http://localhost/controller/Initialise
(更換www.example.com
和controller
當然是有你的域控制器和名稱)。
HttpRequest.IsLocal應該在你的控制器動作進行檢查:
if (!Request.IsLocal)
{
thrown new SecurityException();
}
這將拒絕不從本地主機來的任何請求。這種方法假設兩個呼叫站點和請求的站點共享相同的IP地址 - 該文件指出,這應該工作:
的IsLocal屬性返回true,如果請求發起方的IP地址爲127.0.0.1或如果請求的IP地址與服務器的IP地址相同。
限制客戶端請求Google「csrf mitigation」。
我認爲Request.IsLocal
是去這裏的路。既然你使用MVC,你可以實現一個自定義屬性來爲你做這個。請參閱我的回答here以獲得一個工作示例
如果您的服務器有多個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;
}
HTTP_X_FORWARDED_FOR可以,所以如果你不使用CDN它可能是更好完全刪除它被欺騙。 – jjxtra
如何'Initialise'被稱爲?通過AJAX,通過服務器端調用還是通過其他方法? – SilverlightFox
通過服務器感謝 –