我可以欺骗HttpRequest.Current.Request.IsLocal吗?

时间:2009-03-25 03:02:22

标签: asp.net httpcontext

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

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

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

4 个答案:

答案 0 :(得分:17)

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;
            } 

来源:已解压缩的源代码(Microsoft:referencesource.microsoft.com

希望这有帮助!

答案 1 :(得分:3)

这需要在对本地IIS实例的请求中欺骗非本地IP地址。我认为你制作一个演示版本可能花费的时间少于尝试使用它的时间。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分: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;
}