2013-12-15 113 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

相关问题