Asp.net mvc 仅允许来自同一Web服务器的请求的操作

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

我有一个MVC控制器,它公开了一个
初始化操作
。托管在同一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;
}