web-dev-qa-db-ja.com

IIS 7.5)のASP.NETフォーム認証で静的ファイルを保護するにはどうすればよいですか?

IIS 7.5サーバーでASP.NET 4.0を共有ホスト上で実行していますが、完全に信頼されています。).

このサイトは基本的な「ファイルブラウザー」で、訪問者はログインして、利用可能なファイルのリストを表示し、明らかにファイルをダウンロードすることができます。静的ファイル(主にpdfファイル)は、dataというサイト上のサブフォルダーにあります。 http://example.com/data/ ...

このサイトはASP.NETフォーム認証を使用しています。

私の質問は、ASP.NETエンジンにデータフォルダー内の静的ファイルの要求を処理させて、ファイルの要求がASP.NETによって認証され、ユーザーがファイルにディープリンクできないようにして、許可されていないファイルを取得しますか?

よろしく、エギル。

34
Egil Hansen

アプリケーションプールが統合モードで実行されている場合は、次の操作を実行できます。

以下を最上位のweb.configに追加します。

  <system.webServer>
    <modules>
      <add  name="FormsAuthenticationModule"  type="System.Web.Security.FormsAuthenticationModule" />
      <remove  name="UrlAuthorization" />
      <add  name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"  />
      <remove  name="DefaultAuthentication" />
      <add  name="DefaultAuthentication"  type="System.Web.Security.DefaultAuthenticationModule" />
    </modules>
  </system.webServer>

これで、web.configで標準のASP.NETアクセス許可を使用して、ディレクトリ内のすべてのファイルに対してフォーム認証を強制できます。

<system.web>
    <authorization>
        <deny users="?" />
    </authorization>
    <authentication mode="Forms" />
</system.web>
46
Joel Cunningham

認証する役割を取得することで同じ問題がありました。試行錯誤の末、@ Joel Cunninghamのコードを少し編集するだけで作業できるようになりました。

<modules runAllManagedModulesForAllRequests="true" >

私はこれらの2つのサイトを参照として使用しました: http://forums.iis.net/t/1177964.aspx および http://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis-integrated-pipeline /

13
Danielle

これは古いスレッドですが、偶然発生し、Egilと同じ問題が発生しました。次に、ロールを含むJoelの修正のバージョンを示します。

<modules runAllManagedModulesForAllRequests="false">
      <remove name="FormsAuthenticationModule" />
      <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" />
      <remove name="UrlAuthorization" />
      <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"  />
      <remove name="RoleManager" />
      <add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
      <remove name="DefaultAuthentication" />
      <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" />
</modules>
10
John

補遺:

@eychが指摘したように、受け入れられた回答は~/Contentフォルダー(またはCSSがある場所)や~/Scriptsなどへのアクセスもブロックします。

例外を許可する場合、つまり特定のファイル/フォルダーに認証されていないユーザーがアクセスできるようにする場合は、location要素を使用して許可できます。以下をweb.configに追加します。

  <location path="Content">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>

pdate:別の解決策は、デフォルトでアクセスをオンのままにすることです-これにより、CSS/JavaScript /などへのアクセスが許可されます-そして、「ロック」(のみ)をフォルダーに適用します静的コンテンツが保存されます:

<location path="data">
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</location>

警告:私たちのケース(MVCサイト)では、すべてのコントローラーアクション(ログインを除く)を[AuthorizeAttribute]で修飾する必要がありました。とにかくこれは良いアイデアですが、以前は必要ではありませんでした(以前はany無許可の要求がログインページにリダイレクトされていたため)。

8
David

統合パイプラインにデフォルトで追加されるモジュール(デフォルトのオプション付き)を再度追加する必要がある理由を知りたいので、少し深く掘り下げました。

デフォルトでは、モジュールはデフォルトのオプションでは追加されないため、モジュールを削除して再度追加する必要があります。これらには、登録済みのASP.NETハンドラー(.aspxページなど)によって処理されるコンテンツに対してのみ実行する下位互換性のための前提条件が追加されています。

デフォルトは次のようになります。

<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" 
         preCondition="managedHandler" />

モジュールを削除し、前提条件なしで再度追加することにより、それらの個々のモジュールは、すべてのリクエスト(静的コンテンツを含む)に対して実行されます。 runAllManagedModulesForAllRequestsを有効にするよりも詳細です。

IIS 7:で統合パイプラインが導入されたときからのいくつかの記事でそれについて読むことができます:

2番目の記事の誤植またはモジュール名(および@Johnの回答)がある時点でFormsAuthenticationModuleからFormsAuthenticationに変更されたことに注意してください。

IIS 7.5から8.5までの作業モジュールのセットは、私には次のようになります。

<system.webServer>
  <modules>
    <!-- Re-add auth modules (in their original order) to run for all static and dynamic requests -->
    <remove name="FormsAuthentication" />
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
    <remove name="DefaultAuthentication" />
    <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" />
    <remove name="RoleManager" />
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
    <remove name="UrlAuthorization" />
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
  </modules>
</system.webServer>
8
nekno

アプリケーションプールがクラシックモードで実行されている場合は、次の操作を実行できます。処理するファイル拡張子ごとにこれらの手順を繰り返す必要がありますが、ここでは.htmlを使用しています。

最初に、ページビルドプロバイダーをWeb.configに追加します。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web> 
    <compilation>
      <buildProviders>
        <add type="System.Web.Compilation.PageBuildProvider" extension=".html"/>
      </buildProviders>
    </compilation>
  </system.web> 
</configuration>

次に、ページハンドラファクトリを追加します。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web> 
    <httpHandlers>
      <add type="System.Web.UI.PageHandlerFactory" path="*.html" verb="*"/>
    </httpHandlers>
  </system.web> 
</configuration>

次に、ページハンドラーを追加します。

<?xml version="1.0" encoding="UTF-8"?>
<configuration> 
  <system.webServer>
    <handlers>
      <add scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness32" path="*.html" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" name="HtmlHandler-Classic-32" />
      <add scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness64" path="*.html" verb="GET,HEAD,POST,DEBUG" name="HtmlHandler-Classic-64"/>
    </handlers>
  </system.webServer>
</configuration>

これでうまくいきました。 (クレジット: http://www.ifinity.com.au/Blog/EntryId/66/How-To-301-Redirect-htm-or-html-pages-to-DotNetNuke-aspx-pages =。)

2
Jay Sullivan