2009-03-25 2 views
9

Я запускаю веб-приложение, которое отображает некоторое поведение отладки, если оно выполняется локально - кавычки вокруг строк ресурсов и т. Д. - и я хотел бы продемонстрировать приложение на своем ноутбуке на конференции, где у меня не будет доступа в Интернет , поэтому он должен быть локальным.Могу ли я обмануть HttpRequest.Current.Request.IsLocal?

Приложение использует HttpContext.Current.Request.IsLocal, чтобы определить, работает ли он локально - есть ли способ обмануть его? Я хотел бы обмануть его в возвращении «False», хотя я действительно работаю локально.

У меня есть доступ к исходному коду (и понимаю, что я мог бы просто продемонстрировать сборку, где проверяется проверка «IsLocal»), но скорее не будет делать особую сборку для этой демонстрации. Если понадобится, я сделаю это, но я предпочел бы использовать существующую кодовую базу без изменений.

+0

Развертывание на другой сервер в той же сети. –

+0

Я использую эту установку для не-сетевой демонстрации приложения, и у меня будет только мой ноутбук. Я играл с виртуальной машиной на своем ноутбуке, хотя, боюсь, скорость будет препятствовать моей демонстрации. – SqlRyan

ответ

3

Это потребует подмены нелокального IP-адреса в запросах вашего локального экземпляра IIS. Я думаю, вы, вероятно, потратили меньше времени на создание демо-версии, чем на попытку сделать эту работу.

+0

Вот чего я боялся, но я думал, что мне придется идти по этому маршруту. Я просто подумал, что может быть что-то быстрое, что я бы забыл. – SqlRyan

1

Я считаю, что это правда, но не могу подтвердить прямо сейчас.

IsLocal возвращает True, когда сайт привязан к адресу loopback 127.0.0.1.

Если вы убедитесь, что в IIS ваш сайт привязан к одному из адресов обратной петли вашего компьютера (т. Е. 192.168.1.100), то IsLocal должен возвращать False.

Cassini по определению всегда локален, так как он может привязываться только к кольцевому адресу.

+0

У меня был проблеск надежды, но это, похоже, не работает в моей среде - IIS6 или 7. Можете ли вы дать этот шанс, когда у вас есть шанс, и если вы сможете заставить его работать, я бы любить знать как. – SqlRyan

+0

Если его привязано к '192.168.1.100', то' remoteAddress == LocalAddress' (как удаленный будет также '192.168.1.100') проверка будет истинна, поэтому вернет' true'. – SilverlightFox

16

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

Если ваш сервер имеет несколько IP-адресов, вам понадобится дополнительный код. Следующее обрабатывает несколько IP-адресов и обрабатывает CDN, например cloudflare, который будет иметь неправильный IP-адрес в свойстве Request.UserHostAddress.

Код:

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

HTTP_X_FORWARDED_FOR может быть подделан, поэтому, если вы не используете CDN, вероятно, лучше удалить его полностью. – jjxtra

Смежные вопросы