11

我正在运行一个 Web 应用程序,如果它在本地运行,它会显示一些调试行为 - 引用资源字符串等 - 我想在我无法访问互联网的会议上在我的笔记本电脑上演示该应用程序,所以它必须是本地的。

该应用程序使用 HttpContext.Current.Request.IsLocal 来确定它是否在本地运行 - 有什么办法可以欺骗它吗?即使我确实在本地运行,我也想欺骗它返回“False”。

我确实可以访问源代码(并意识到我可以演示一个“IsLocal”检查被注释掉的构建),但不想为这个演示制作一个特殊的构建。如果需要,我会这样做,但我宁愿使用现有的代码库。

4

4 回答 4

19

Request.IsLocal 属性实现以下代码:

public bool IsLocal { 
            get {
                String remoteAddress = UserHostAddress; 

                // if unknown, assume not local
                if (String.IsNullOrEmpty(remoteAddress))
                    return false; 

                // check if localhost 
                if (remoteAddress == "127.0.0.1" || remoteAddress == "::1") 
                    return true;
 
                // compare with local address
                if (remoteAddress == LocalAddress)
                    return true;
 
                return false;
            } 

来源:反编译的源代码(微软:referencesource.microsoft.com

希望这可以帮助 !

于 2012-03-14T17:21:06.833 回答
3

这将需要在对本地 IIS 实例的请求中欺骗非本地 IP 地址。我认为你可能会花费更少的时间来制作演示版本而不是尝试制作它。

于 2009-03-25T03:20:42.357 回答
1

我相信这是真的,但现在无法验证。

当站点绑定到环回地址 127.0.0.1 时,IsLocal 返回 True。

如果您确保在 IIS 中您的网站绑定到您机器的一个非环回地址(即 192.168.1.100),那么 IsLocal 应该返回 False。

根据定义,Cassini 始终是本地的,因为它只能绑定到环回地址。

于 2009-03-25T03:52:09.160 回答
1

如果您的服务器有多个 IP 地址,您将需要一些额外的代码。以下处理多个 ip 地址,并处理像 cloudflare 这样的 CDN,它将在 Request.UserHostAddress 属性中具有错误的 ip 地址。

代码:

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;
}
于 2015-12-17T04:42:45.637 回答