我有一个公开Initialise Action
的MVC控制器。托管在同一IIS上的其他虚拟Web应用程序将需要访问此Action.
出于安全原因,只需要授予来自同一Web服务器(托管MVC应用程序)的请求访问此Iniliase方法的权限。
有人可以帮助如何实现这一目标吗?我们无法使用localhost进行验证,因为此应用程序将托管在不支持locahost请求的Azure中。
答案 0 :(得分:6)
我的回答是限制服务器端请求。
致电Initialise
的网站需要向http://www.example.com/controller/Initialise
而不是http://localhost/controller/Initialise
发送请求(用您的域名和控制器名称替换www.example.com
和controller
当然)。
if (!Request.IsLocal)
{
thrown new SecurityException();
}
这将拒绝任何非来自本地主机的请求。此方法假定调用站点和请求的站点共享相同的IP地址 - 文档说明这应该有效:
如果请求发起方的IP地址是127.0.0.1,或者请求的IP地址与服务器的IP地址相同,则IsLocal属性返回true。
限制客户端请求Google“csrf缓解”。
答案 1 :(得分:1)
如果您的服务器有多个IP地址,则需要一些额外的代码。以下处理多个IP地址,并处理类似cloudflare的CDN,它将在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;
}
答案 2 :(得分:0)
Access-Control-Allow-Origin
告诉浏览器有关域名的可访问性。尝试指定:
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "yourdomain")
我没有对此进行测试,以确定是否有效。
答案 3 :(得分:0)
使用ASP.NET MVC提供的AntiForgeryToken。这是一篇关于此的文章。
答案 4 :(得分:0)
我认为Request.IsLocal
是前往此的方式。由于您正在使用MVC,因此您可以实现自定义属性来为您执行此操作。有关工作示例,请参阅我的回答here