仅允许来自同一网络服务器的请求的操作

时间:2013-12-15 11:29:18

标签: asp.net-mvc security

我有一个公开Initialise Action的MVC控制器。托管在同一IIS上的其他虚拟Web应用程序将需要访问此Action.

出于安全原因,只需要授予来自同一Web服务器(托管MVC应用程序)的请求访问此Iniliase方法的权限。

有人可以帮助如何实现这一目标吗?我们无法使用localhost进行验证,因为此应用程序将托管在不支持locahost请求的Azure中。

5 个答案:

答案 0 :(得分:6)

我的回答是限制服务器端请求。

致电Initialise的网站需要向http://www.example.com/controller/Initialise而不是http://localhost/controller/Initialise发送请求(用您的域名和控制器名称替换www.example.comcontroller当然)。

应在控制器操作中检查

HttpRequest.IsLocal

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)

答案 4 :(得分:0)

我认为Request.IsLocal是前往此的方式。由于您正在使用MVC,因此您可以实现自定义属性来为您执行此操作。有关工作示例,请参阅我的回答here