16

本番環境にデプロイするときに glimpse.axd へのアクセスを制限するにはどうすればよいですか?

カスタムの RuntimePolicy を使用して、実稼働環境で glimpse が有効になっていないことを確認していますが、ユーザーが axd にもアクセスしないようにしたいと考えています。

asp.net からの承認を使用していた場合、web.config のロケーション パスを介して保護できることは理解していますが、このオプションは使用できません。

アイデア?

4

3 に答える 3

14

Glimpse は、セキュリティ構成のためのいくつかの異なるメカニズムを提供します。

1 つ目は、おっしゃったように、ASP.NET に組み込まれているセキュリティ機能を活用することです。これを行うには、次のように要素web.configを追加できます。<location>

<location path="glimpse.axd">
  <system.web>
    <authorization>
      <deny users="*"/>
      <allow roles="Admin"/>
    </authorization>
  </system.web>
</location>

これで、管理者ロールのユーザーのみがアクセスできるようになりますGlimpse.axd

偶然にも、パスは である必要はありません/Glimpse.axd。これは単なるデフォルト設定です。HttpHandler の場所を、あなたとあなたのチームだけが知っている URL に移動するには、次のようにいくつかの変更を加えますweb.config

<!-- configure system.webServer and/or system.web depending on your ISS configuration -->
<system.webServer>
  <handlers>
    <add name="Glimpse" path="unknownLocation.axd" ... />
  </handlers>
</system.webServer>
<system.web>
  <httpHandlers>
    <add path="unknownLocation.axd" ... />
  </httpHandlers>
</system.web>

<!-- then just configure Glimpse -->
<glimpse defaultRuntimePolicy="On" endpointBaseUri="~/unknownLocation.axd">

2 番目のアプローチは、IRuntimePolicy. ランタイム ポリシーは、プロパティからGlimpse.axd戻っている限り、リソース (を介して提供される) へのアクセスを保護できます。残念ながら、Glimpse は、デフォルト リソース(つまり)へのリクエストのを無視するように設計されています。幸いなことに、デフォルトのリソースは変更できます。方法は次のとおりです。RuntimeEvent.ExecuteResourceExecuteOnIRuntimePolicyGlimpse.axd

  1. を実装するようにクラスを作成または更新しますIServiceLocator
  2. web.configGlimpse がサービス ロケーターの実装を指すように更新します。

    <glimpse defaultRuntimePolicy="On" endpointBaseUri="~/Glimpse.axd" serviceLocatorType="YourNamespace.GlimpseLocator, YourAssembly">

  3. これで、Glimpse はロケーターを認識し、デフォルト リソースを含め、必要なタイプを要求します。

  4. を実装しIResourceます。ユーザーを通常の構成ページ (デフォルトのリソースではなくなります) にリダイレクトするだけのページを作成する方法の例を示しますが、好きなことを行うことができます。
  5. これで、 への直接呼び出しは、配置されているすべて/Glimpse.axd?n=glimpse_configのを尊重し、とにかくそこにリダイレクトする呼び出しを行います。 IRuntimePolicyGlimpse.axd

コードは次のとおりです。

// Create the ServiceLocator that is referenced in web.config
public class GlimpseLocator : IServiceLocator
{
    public T GetInstance<T>() where T : class
    {
        if (typeof(T) == typeof(IResource))
            return new SecurityResource() as T;

        return null;
    }

    public ICollection<T> GetAllInstances<T>() where T : class
    {
        return null;
    }
}

//Implementation of new default resource that just redirects
public class SecurityResource : IResource
{
    public string Name 
    {
        get { return "Security"; }
    }

    public IEnumerable<ResourceParameterMetadata> Parameters 
    {
        get { return Enumerable.Empty<ResourceParameterMetadata>(); }
    }

    public IResourceResult Execute(IResourceContext context)
    {
        return new RedirectResourceResult("/Glimpse.axd?n=glimpse_config");
    }
}

// Your custom runtime policy
public class CustomPolicy : IRuntimePolicy
{
    public RuntimeEvent ExecuteOn 
    {
        get { return RuntimeEvent.ExecuteResource; }
    }

    public RuntimePolicy Execute(IRuntimePolicyContext policyContext)
    {
        //Perform any logic you like and return RuntimePolicy.On or RuntimePolicy.Off
        return RuntimePolicy.Off;
    }
}

これで、ユーザーが にアクセスするGlimpse.axdと、リダイレクトされGlimpse.axd?n=glimpse_configて、標準の構成ページが表示されるか、または *Runtime policy does not allow execution of resource named 'glimpse_config'.* メッセージが表示されます - IRuntimePolicy.

前述したように、私たちが最適化したユース ケースは、ASP.NET の組み込みセキュリティ メカニズムを活用する最初のユース ケースです。ただし、Glimpse はそのモデルに関連付けられていません。ATM を構成するには、いくつかの手順を踏む必要があります。

関連して、現在進行中の Glimpse 2.0の構成ストーリーを大幅に改善する予定です。

于 2013-09-12T15:04:40.890 に答える
6

Glimpse 1.7.0 以降、Glimpse.axd を保護するためのより良い方法が追加されました。

http://blog.getglimpse.com/2013/12/09/protect-glimpse-axd-with-your-custom-runtime-policy/

  1. GlimpseSecurityPolicy.cs のコードのコメントを外します (nuget を実行するとプロジェクトに追加されます)。
  2. httpContext.User.IsInRole("Administrator")関連するロジックに変更します

NB RuntimeEvent.ExecuteResourceinExecuteOn()は、リクエスト時にこのロジックが確実に実行されるようにしますGlimpse.axd

于 2015-10-26T14:13:06.700 に答える
3

コメントするほどの評判はありませんが、 nikmd23 の徹底的な回答で次の間違いから誰かを救う必要があると思いました:

<location path="glimpse.axd">
  <system.web>
    <authorization>
      <deny users="*"/><------------
      <allow roles="Admin"/>
    </authorization>
  </system.web>
</location>

矢印は、承認が roles="admin" を許可する前に、deny * がすべてのユーザーに一致するという問題を示しています。目的の機能を実現するには、この順序を逆にします (以下を参照)。

参照: ASP.NET Forms Auth 他のすべてを拒否する必要がある場合に、サブディレクトリ内の特定のファイルへのアクセスを許可する

<location path="glimpse.axd">
  <system.web>
    <authorization>
      <allow roles="Admin"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>
于 2014-09-24T23:51:46.193 に答える