私はHttpRequest.Current.Request.IsLocalをだますことはできますか?
-
22-08-2019 - |
質問
私はそれがローカルで実行されていた場合、いくつかのデバッグ動作を表示するWebアプリケーションを実行していると私は私がインターネットを持っていません会議で私のラップトップ上のアプリケーションのデモをしたいのですがアクセスは、それをローカルにする必要があります。
アプリケーションは、ローカルで実行しているかどうかを判断するためにHttpContext.Current.Request.IsLocalを使用しています - それをだますする方法はありますか?私は私が実際にローカルで実行しているにもかかわらず、「偽」を返すにそれをトリックしたいと思います。
私は、ソースコードへのアクセス権を持っている(と私はちょうど「のisLocal」のチェックがコメントアウトされたビルドをデモ可能性が実現する)のではなく、このデモのために特別なビルドをすることはないだろうか。必要であれば、私はそれを行うだろうが、私はむしろ、手つかずの既存のコードベースを使用すると思います。
解決
これはIISのローカル・インスタンスへのリクエストで非ローカルIPアドレスを偽装必要となります。私はあなたがおそらくその仕事をしようとしてよりも、デモのビルドを作るより少ない時間を費やすと思う。
他のヒント
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 の)
この情報がお役に立てば幸い!
の私はこれが真実であると信じていますが、今は確認することはできません。の
サイトは、ループバックアドレス127.0.0.1にバインドされたときにのisLocalはTrueを返します。
あなたのウェブサイトがあなたのマシンの非ループバックアドレス(すなわち、192.168.1.100)のいずれかにバインドされていることをIISに確認してください場合は、、その後のisLocalはFalseを返す必要があります。
それが唯一のループバックアドレスにバインドすることができますので、カッシーニは、定義により、常にローカルです。
、あなたはいくつかの余分なコードが必要になります。以下は、複数のIPアドレスを処理し、Request.UserHostAddressプロパティに間違ったIPアドレスを持つことになりますCloudFlareのようにCDNを処理します。
コード:
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;
}