我有一个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
通过服务器感谢 –