IIS 7.5サーバーでASP.NET 4.0を共有ホスト上で実行していますが、完全に信頼されています。).
このサイトは基本的な「ファイルブラウザー」で、訪問者はログインして、利用可能なファイルのリストを表示し、明らかにファイルをダウンロードすることができます。静的ファイル(主にpdfファイル)は、dataというサイト上のサブフォルダーにあります。 http://example.com/data/ ...
このサイトはASP.NETフォーム認証を使用しています。
私の質問は、ASP.NETエンジンにデータフォルダー内の静的ファイルの要求を処理させて、ファイルの要求がASP.NETによって認証され、ユーザーがファイルにディープリンクできないようにして、許可されていないファイルを取得しますか?
よろしく、エギル。
アプリケーションプールが統合モードで実行されている場合は、次の操作を実行できます。
以下を最上位の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>
認証する役割を取得することで同じ問題がありました。試行錯誤の末、@ 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 /
これは古いスレッドですが、偶然発生し、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>
補遺:
@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無許可の要求がログインページにリダイレクトされていたため)。
統合パイプラインにデフォルトで追加されるモジュール(デフォルトのオプション付き)を再度追加する必要がある理由を知りたいので、少し深く掘り下げました。
デフォルトでは、モジュールはデフォルトのオプションでは追加されないため、モジュールを削除して再度追加する必要があります。これらには、登録済みの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>
アプリケーションプールがクラシックモードで実行されている場合は、次の操作を実行できます。処理するファイル拡張子ごとにこれらの手順を繰り返す必要がありますが、ここでは.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 =。)