如何在azure api管理策略中提取IP地址?

时间:2016-07-10 03:45:44

标签: policy azure-api-management

  1. 是否有开箱即用的政策来提取传入的IP地址?我找不到一个。
  2. 我是否需要编写代码来执行此操作?如果是这样,我该怎么做呢?还有什么其他选择?

2 个答案:

答案 0 :(得分:1)

您可以使用政策expressions在任何政策中提取IP地址。表达式将是context.Request.IpAddress

答案 1 :(得分:0)

您绝对可以使用策略表达式。

但是更简单的方法可能是:

如果您的目标是捕获后端的原始IP地址(而不是Azure的IP地址)(用于日志记录等),则:

每当Azure API Management Studio将请求转发到您的后端时,它就会包含标题 X-Forwarded-For

例如 {[X-Forwarded-For,123.45.67.891,13.75.131.25:1795]}

第一个IP地址是您想要的IP地址。 第二个IP地址实际上是Azure的。

例如首先,一个移动应用向Azure API Mgmt发送请求-> 第二,Azure API Mgmt将请求转发到您的后端-> 最后,您从X-Forwarded-For捕获了客户端的IP(即移动设备的IP)。

如何从后端标头捕获IP取决于您以及所使用的技术(例如ASP.net core,node.js等)。

这是我捕获IP的一小段代码

private LogMetadata BuildRequestMetadata(HttpRequestMessage request, Task<string> requestBody)
{    
    var headers = request.Headers.ToDictionary(d => d.Key, d => d.Value.Join(", "));

    // If header X-Forwarded-For is included, 
    // it means the request is coming from Azure API MGMT studio. 
    // Example header value: {[X-Forwarded-For, 123.45.67.891 (Mobile Device), 13.75.131.25:1795 (Azure API Mgmt)]}
    var clientIp = 
        headers.ContainsKey("X-Forwarded-For") 
            ? headers["X-Forwarded-For"].Split(',')[0] 
            : request.GetOwinContext().Request.RemoteIpAddress;  
}