2016-02-06 4 views
10

ASP.NET Coreの場合リクエストがローカルかどうかを確認するにはどうすればよいですか?あなたは現在のリクエストがローカルホストからだったかどうかを判断するためにビューでこれを行うことができ、通常のASP.NETでは

HttpContext.Current.Request.IsLocal

しかし、私はASP.NET 6 /コアに似た何かを見つけることができません/それが呼び出されることを意図されているものであれ。

今事前

+2

'HttpContext.Connection.IsLocal'の使用には注意してください。 'HttpContext.Connection.RemoteIpAddress'の使用法は**より安全な方法**です。ローカルにASP.NET 5 RC1プロジェクトをテストするために接続すると、 'RemoteIpAddress'に' :: 1'がありますが、 'HttpContext.Connection.IsLocal'は' false'です。それは間違っています。 – Oleg

+0

乾杯Oleg、あなたが言ったことも私にとっては真実であることが判明しました。 –

+0

私も同じ動作をします。ローカルでは常に '' false'''です。 –

答えて

9

に本質的に利用可能である私は、要求がローカルであるかどうかを知るに解決策を探して、この出会いました。残念ながら、ASP.NETバージョン1.1.0には接続でIsLocalメソッドがありません。私はStrathwebと呼ばれるウェブサイト上の1つの解決策を見つけましたが、これも時代遅れです。

私は自分自身でIsLocalという拡張子を作成していますが、うまくいくようですが、すべての状況でそれをテストしたとは言えませんが、試してみてください。

public static class IsLocalExtension 
{ 
    private const string NullIpAddress = "::1"; 

    public static bool IsLocal(this HttpRequest req) 
    { 
     var connection = req.HttpContext.Connection; 
     if (connection.RemoteIpAddress.IsSet()) 
     { 
      //We have a remote address set up 
      return connection.LocalIpAddress.IsSet() 
        //Is local is same as remote, then we are local 
       ? connection.RemoteIpAddress.Equals(connection.LocalIpAddress) 
        //else we are remote if the remote IP address is not a loopback address 
       : IPAddress.IsLoopback(connection.RemoteIpAddress); 
     } 

     return true; 
    } 

    private static bool IsSet(this IPAddress address) 
    { 
     return address != null && address.ToString() != NullIpAddress; 
    } 
} 

あなたは、私はそれが誰かを役に立てば幸い

public IActionResult YourAction() 
{ 
    var isLocal = Request.IsLocal(); 
    //... your code here 
} 

すなわち

Requestプロパティを使用してからコントローラのアクションでそれを呼び出します。

+1

これは私を助けました。 [Here](https://gist.github.com/firelizzard18/74e7481fb97c16b90bfd801798f53319)は私のバージョンです。 –

5

のおかげでその

HttpContext.Connection.IsLocal 

、あなたは、コントローラの外をチェックする必要があるならば、あなたはそれへのアクセスを取得するためにIHttpContextAccessorへの依存を取ります。コメントをもとに

更新:

のHttpContextビュー

@if (Context.Connection.IsLocal) 
{ 

} 
+0

この '@inject IHttpContextAccessor Context;を実行することによって、ビュー内の依存関係を取ります。現在のところ、ローカルは常に偽です... –

+5

これはRC2で終了します。 Filipには別のアプローチがあります:http://www.strathweb.com/2016/04/request-islocal-in-asp-net-core/でも、他のミドルウェアや使用しているサーバに大きく依存しているようです。 – ssmith

0

現在、HttpContext.Connection.IsLocalが記述されている時点で、dotnetコアには存在しません。

他のワーキングソリューションでは、適切ではない最初のループバックアドレス(:: 1または127.0.0.1)のみがチェックされます。

私は役に立つ以下の解決策を見つける:

using Microsoft.AspNetCore.Http; 
using System.Net; 

namespace ApiHelpers.Filters 
{ 
    public static class HttpContextFilters 
    { 
     public static bool IsLocalRequest(HttpContext context) 
     { 
      if (context.Connection.RemoteIpAddress.Equals(context.Connection.LocalIpAddress)) 
      { 
       return true; 
      } 
      if (IPAddress.IsLoopback(context.Connection.RemoteIpAddress)) 
      { 
       return true; 
      } 
      return false; 
     } 
    } 
} 

そして例のユースケース:

app.UseWhen(HttpContextFilters.IsLocalRequest, configuration => configuration.UseElmPage()); 
0

私もあなたの最後に以下の句を追加することが有用であることは言うだろうカスタムIsLocal()チェック

if (connection.RemoteIpAddress == null && connection.LocalIpAddress == null) 
{ 
    return true; 
} 

これは、サイトがMicrosoft.AspNetCore.TestHostを使用して実行されており、そのサイトは実際にTCP/IP接続なしで完全にローカルに実行されています。

関連する問題