【发布时间】:2015-05-07 14:14:56
【问题描述】:
我已经构建了一个 .NET Web API 并将其作为 API 应用程序部署到 Azure。我试图通过 IP 地址或主机名来实现对 API 的访问限制。我尝试了以下几种方式:
-
通过实现 OwinMiddleware 类并根据白名单检查请求 RemoteIpAddress 和 Host。我通过
获取的这些值var ip = context.Request.RemoteIpAddress; var host = context.Request.Host.ToString();
上下文的类型为 IOwinContext
-
在控制器中通过检查以下内容:
var ipAddress = Request.GetOwinContext().Request.RemoteIpAddress; var host = Request.GetOwinContext().Request.Host; //Also tried //var ipAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"] 在 web.config 中通过指定允许的 IP 地址:
<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 API 自己的 IP 地址添加到允许的 IP 列表中,则会收到禁止错误。当我将 Web API 的 IP 地址添加到允许列表时,任何客户端都可以向该 API 发送请求。
然后,我使用 Postman 以及从托管在单独的 Azure VM 上的另一个 Web 项目的实例在本地调用我的 Web api。此 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 的代理设置更多请求标头?
【问题讨论】:
标签: c# azure asp.net-web-api