Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测AWS服务器是否位于负载平衡器后面_C#_Asp.net_Amazon Web Services_Load Balancing - Fatal编程技术网

C# 检测AWS服务器是否位于负载平衡器后面

C# 检测AWS服务器是否位于负载平衡器后面,c#,asp.net,amazon-web-services,load-balancing,C#,Asp.net,Amazon Web Services,Load Balancing,目前,同一个网站在两种不同的服务器配置和两个不同的URL下运行 位于负载平衡器后面的IIS服务器群 具有弹性IP的单个IIS服务器 为了方便起见,最好在所有服务器上运行相同的代码,因为这样可以简化部署过程 我知道我可以做这样的事情: if(string.Equals(HttpContext.Current.Request.Headers[“X-Forwarded-Proto”],“https”)) 这将检查负载平衡器是否转发了“https”数据。然而,我想做的只是检测负载平衡器是否存在 我想

目前,同一个网站在两种不同的服务器配置和两个不同的URL下运行

  • 位于负载平衡器后面的IIS服务器群
  • 具有弹性IP的单个IIS服务器
为了方便起见,最好在所有服务器上运行相同的代码,因为这样可以简化部署过程

我知道我可以做这样的事情:

if(string.Equals(HttpContext.Current.Request.Headers[“X-Forwarded-Proto”],“https”))

这将检查负载平衡器是否转发了“https”数据。然而,我想做的只是检测负载平衡器是否存在

我想写的要点:
if(loadbalancer存在){do this stuff}


有人知道怎么做吗?

结果是,如果负载平衡器不存在,则请求.Headers[“X-Forwarded-Proto”]==null

如果确实存在请求.头文件[“X-Forwarded-Proto”]=“http”或“https”

快速解决方案:
if(Request.Headers[“X-Forwarded-Proto”]==null){do stuff}

更新的解决方案增加了安全性,因为可以伪造标头:

ClientIP = Request.UserHostAddress;
Subnet = <enter your aws CIDR subnet address>;    // e.g. 172.0.0.0
Mask = <enter your aws VPC address>;              // e.g. 255.255.0.0

// Verify header
if(Request.Headers["X-Forwarded-Proto"] == null) {
    // Verify that ClientIP i.e. the LoadBalancer's IP is inside of our subnet.
    if(IsAddressOnSubnet(ClientAddress, Subnet, Mask)) {
        // do some stuff
    }
}

protected bool IsAddressOnSubnet(IPAddress Address, IPAddress Subnet, IPAddress Mask)
{
    try
    {
        Byte[] addressOctets = Address.GetAddressBytes();
        Byte[] subnetOctets = Mask.GetAddressBytes();
        Byte[] networkOctets = Subnet.GetAddressBytes();

        return
            ((networkOctets[0] & subnetOctets[0]) == (addressOctets[0] & subnetOctets[0])) &&
            ((networkOctets[1] & subnetOctets[1]) == (addressOctets[1] & subnetOctets[1])) &&
            ((networkOctets[2] & subnetOctets[2]) == (addressOctets[2] & subnetOctets[2])) &&
            ((networkOctets[3] & subnetOctets[3]) == (addressOctets[3] & subnetOctets[3]));
    }
    catch (System.Exception ex)
    {
        return false;
    }
}
ClientIP=Request.UserHostAddress;
子网=;//e、 g.172.0.0.0
掩码=;//e、 g.255.255.0.0
//验证标题
if(Request.Headers[“X-Forwarded-Proto”]==null){
//验证ClientIP即负载平衡器的IP是否在我们的子网内。
if(IsAddressOnSubnet(客户端地址、子网、掩码)){
//做点什么
}
}
受保护的bool IsAddressOnSubnet(IPAddress地址、IPAddress子网、IPAddress掩码)
{
尝试
{
Byte[]addressOctets=Address.GetAddressBytes();
Byte[]subnetotets=Mask.GetAddressBytes();
Byte[]networkOctets=子网。GetAddressBytes();
返回
((网络八位组[0]和子八位组[0])==(地址八位组[0]和子八位组[0]))&&
((网络八位字节[1]和子八位字节[1])==(地址八位字节[1]和子八位字节[1]))&&
((网络八位组[2]和子八位组[2])==(地址八位组[2]和子八位组[2]))&&
((网络八位组[3]和子八位组[3])==(地址八位组[3]和子八位组[3]);
}
catch(System.Exception-ex)
{
返回false;
}
}
感谢Michael sqlbot指出了安全问题

这是有用的


由于СПаСабббб,用于检测子网中ip地址的参考!Прекрасное решение!.

在负载平衡器上添加规则以添加自定义http头?然后阅读。我如何添加自定义http头?有什么原因不能简单地将其作为配置设置并在部署脚本中设置吗?当前部署脚本不存在,因为我正在测试,也许这是更好的方法。在启动时,检索当前EC2实例的实例ID,然后进行API调用来描述ELB,然后查看您的实例ID是否已注册到ELB,一个潜在的更具确定性的测试是,是否存在报头以及连接的客户端IP是否在分配给ELB子网的专用IP地址范围内。如果两者都为真,则来自ELB,如果IP测试为假,则无论是否存在标头,都不是。@Michael sqlbot我如何
测试连接的客户端IP是否在分配给ELB子网的专用IP地址范围内
?C#不是我的专长。可能类似于
HttpContext.Current.Request.ServerVariables[“HTTP\u CLIENT\u IP”]
@Michael sqlbot这是一个外部站点,客户端IP可以是任何东西,或者我不明白客户端IP是什么意思。如果请求通过ELB,则客户端IP应该是来自ELB子网之一的私有IP,否则不会。