Azure Api应用程序 - IP限制 - 无法获取正确的客户端IP地址和/或主机名

时间:2015-05-07 14:14:56

标签: c# azure asp.net-web-api

我构建了一个.NET Web API并将其作为API App部署到Azure。我试图通过IP地址或主机名实现对API的访问限制。我曾尝试过几种方式:

  1. 通过实施OwinMiddleware类并针对白名单检查RemoteIpAddress和Host请求。我通过

    获取这些值
    var ip = context.Request.RemoteIpAddress;
    var host = context.Request.Host.ToString();
    
  2. 其中context的类型为IOwinContext

    1. 通过检查以下内容在控制器中:

      var ipAddress = Request.GetOwinContext().Request.RemoteIpAddress;
      var host = Request.GetOwinContext().Request.Host;
      //Also tried 
      //var ipAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"] 
      
    2. 在web.config中指定允许的IP地址:

    3.     <system.webServer>
              <security>
                <ipSecurity allowUnlisted="false" denyAction="Forbidden">
                  <add allowed="true" ipAddress="xxx.xx.xx.xx" subnetMask="255.255.255.0"/>
                </ipSecurity>
              </security>
          </system.webServer>
      

      如果我没有将Web Apis自己的IP地址添加到允许的IP列表中,那么我会收到一个禁止的错误。当我将Web Apis IP地址添加到允许列表时,任何客户端都可以向api发送请求。

      然后,我使用Postman以及另一个Web项目的实例在本地调用我的web api,该项目托管在单独的Azure VM上。此VM与Web Api不在同一资源组中。

      奇怪的是,无论我尝试什么,请求主机和IP地址似乎总是Web Api自己的主机和IP地址。因此,似乎对web api的请求是内部的,并且不是来自外部源。因此,我从未在请求​​详细信息中获得本地计算机或Azure VM的IP /主机名。

      我真的不明白这是怎么发生的。我是否会以错误的方式获取客户端IP和主机名?或者Web Api中的内部路由是否发生了某些事情,这使我丢失了原始客户端请求信息?还是我在这里从根本上误解了什么?

      编辑:

      经过一些测试后,我发现如果我用了

      HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
      

      然后我会在IP地址列表中获得正确的原始客户端IP地址(通常是列表中的第一个IP地址)。但是我看不到获取正确客户端主机名的方法。

      但是,我仍然想知道为什么我无法使用例如Owin或web.config IP限制来获取正确的客户端信息?这是一个Azure / Web Api的东西吗?或者我是否需要从我的代理处设置更多请求标头,我将其称为web api?

1 个答案:

答案 0 :(得分:1)

经过一些测试后,我发现如果我用了

HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]

然后我会在IP地址列表中获得正确的原始客户端IP地址(通常是列表中的第一个IP地址)。但是我看不到获取正确客户端主机名的方法。