Asp.net mvc 仅允许来自同一Web服务器的请求的操作
我有一个MVC控制器,它公开了一个Asp.net mvc 仅允许来自同一Web服务器的请求的操作,asp.net-mvc,security,Asp.net Mvc,Security,我有一个MVC控制器,它公开了一个初始化操作。托管在同一IIS上的其他虚拟web应用程序将需要访问此操作。 出于安全原因,只有来自同一web服务器(MVC应用程序所在的服务器)的请求才需要被授予访问此Iniliase方法的权限 有人能帮我实现这个目标吗?我们无法使用localhost进行验证,因为此应用程序将托管在不支持LocahHost请求的Azure中。访问控制允许源站告知浏览器其对域的可访问性。请尝试指定: HttpContext.Current.Response.AddHeader("A
初始化操作
。托管在同一IIS上的其他虚拟web应用程序将需要访问此操作。
出于安全原因,只有来自同一web服务器(MVC应用程序所在的服务器)的请求才需要被授予访问此Iniliase方法的权限
有人能帮我实现这个目标吗?我们无法使用localhost进行验证,因为此应用程序将托管在不支持LocahHost请求的Azure中。
访问控制允许源站
告知浏览器其对域的可访问性。请尝试指定:
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
)
应在控制器操作中检查:
if (!Request.IsLocal)
{
throw new SecurityException();
}
这将拒绝任何不是来自本地主机的请求。此方法假设调用站点和请求站点共享相同的IP地址-文档中说明此方法应该可以:
如果请求发起人的IP地址为127.0.0.1,或者请求的IP地址与服务器的IP地址相同,则IsLocal属性返回true
为了限制客户端请求,谷歌“csrf缓解”。我认为
请求。IsLocal
是一种方法。因为您正在使用MVC,所以可以实现一个自定义属性来完成这项工作。请参阅我的答案以获得一个工作示例如果您的服务器有多个ip地址,则需要一些额外的代码。下面的代码处理多个ip地址,并处理类似于cloudflare的CDN,这将在Request.UserHostAddress属性中具有错误的ip地址
代码:
如何调用
初始化?通过AJAX、服务器端调用或其他方法(HTTP_X_FORWARDED_FOR)可能会被欺骗,因此如果您不使用CDN,最好将其完全删除。
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;
}