2009-03-25 9 views
9

Estoy ejecutando una aplicación web que muestra algún comportamiento de depuración si se está ejecutando localmente - citas sobre cadenas de recursos, etc. - y me gustaría probar la aplicación en mi computadora portátil en una conferencia donde no tendré acceso a Internet , entonces tiene que ser local.¿Puedo engañar a HttpRequest.Current.Request.IsLocal?

La aplicación utiliza HttpContext.Current.Request.IsLocal para determinar si se ejecuta localmente, ¿hay alguna manera de engañar? Me gustaría engañarlo para que devuelva "False" a pesar de que de hecho estoy corriendo localmente.

Tengo acceso al código fuente (y me doy cuenta de que solo pude hacer una demostración en la que el comentario "IsLocal" está comentado), pero preferiría no hacer una compilación especial para esta demostración. Si es necesario, lo haré, pero preferiría no tocar la base de código existente.

+0

desplegarlo en otro servidor en la misma red. –

+0

Estoy usando esta instalación para una demostración no conectada a la red de la aplicación, y solo tendré mi laptop allí. Jugué con una máquina virtual en mi computadora portátil, aunque me temo que la velocidad obstaculizaría mi demostración. – SqlRyan

Respuesta

3

Eso requeriría falsificar una dirección IP no local en las solicitudes a su instancia local de IIS. Creo que probablemente perderás menos tiempo haciendo una demostración que tratando de hacer que funcione.

+0

Eso es lo que tenía miedo, pero estaba pensando que tendría que seguir ese camino. Solo pensé que podría haber algo rápido que había pasado por alto. – SqlRyan

1

Creo que esto es cierto, pero no puedo verificar en este momento.

IsLocal devuelve True cuando el sitio está vinculado a la dirección de bucle invertido 127.0.0.1.

Si se asegura en IIS de que su sitio web está vinculado a una de las direcciones que no son de bucle de su máquina (es decir, 192.168.1.100), entonces IsLocal debería devolver False.

Cassini, por definición, siempre es local, ya que solo se puede vincular a la dirección de bucle invertido.

+0

Tuve un atisbo de esperanza, pero parece que no funciona en mi entorno, ya sea IIS6 o 7. ¿Puede dar esta oportunidad cuando tenga oportunidad, y si puede hacer que funcione, lo haría me encanta saber cómo. – SqlRyan

+0

Si está obligado a '192.168.1.100', entonces' remoteAddress == LocalAddress' (como remoto también será '192.168.1.100'), la comprobación será verdadera, por lo que devolverá' true'. – SilverlightFox

16

propiedad Request.IsLocal implementa el siguiente código:

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

Fuente: decompilados código fuente (Microsoft: referencesource.microsoft.com)

Espero que esto ayude!

1

Si su servidor tiene varias direcciones IP, necesitará un código adicional. El siguiente maneja múltiples direcciones IP, y maneja CDN como cloudflare que tendrá la dirección IP incorrecta en la propiedad Request.UserHostAddress.

Código:

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 puede ser falso, por lo que si no está utilizando un CDN, probablemente sea mejor eliminarlo por completo. – jjxtra

Cuestiones relacionadas