9

MVC 3 ベータ 1 で Razor ビューへのアクセス (404) をブロックする方法はありますか? まったく新しい空のサイト (IIS7) を作成し、ブラウザーから /views/home/index.cshtml にアクセスすると、404 の代わりにこれが表示されます

    [InvalidCastException: Unable to cast object of type 'ASP.Index_cshtml' to type 'System.Web.IHttpHandler'.]
   System.Web.WebPages.WebPageHttpHandler.CreateFromVirtualPath(String virtualPath, VirtualPathFactoryManager virtualPathFactoryManager) +56
   System.Web.WebPages.WebPageRoute.DoPostResolveRequestCache(HttpContextBase context) +253
   System.Web.WebPages.WebPageHttpModule.OnApplicationPostResolveRequestCache(Object sender, EventArgs e) +89
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

デフォルトでは、views フォルダーの web.config ファイルはすべてのファイル要求をブロックするように設定されていますが、明らかにこの要求はまだ通過しています。

再現手順:
ファイル -> 新しいプロジェクト
ASP.NET MVC 3 Web アプリケーション
インターネット アプリケーション (Razor)
F5
/views/home/index.cshtml に移動

4

3 に答える 3

9

私は、ASP.NET MVC 3 と ASP.NET Web ページ、および Razor の両方に取り組んでいる ASP.NET チームの開発リーダーです。

これは、ASP.NET MVC 3 RC では完全には修正されていませんが、ASP.NET MVC 3 RTM では完全に修正される予定です。

ASP.NET MVC 3 RC 以前で発生する「ひどく悪い」ことは何もありません。発生する可能性のある最悪の事態は、アプリにビューが存在するかどうかを誰かが検出できることですが、それを実行することはできません (奇妙な例外が原因で) )。これは、情報漏えいの形態であるという点で、セキュリティ上のわずかな問題ですが、それほど重大な問題ではありません。

ASP.NET MVC 3 RTM では、~/Views/... 内のすべての Razor ビューと、MVC 領域内のすべての Razor ビューが 100% ブロックされ、ブラウザーから直接実行することはできません。これらは、MVC ビュー ページとしてのみ実行可能です。

于 2010-12-02T01:56:09.483 に答える
4

おそらく、web.config である種の書き換えルールを使用して、ユーザーを直接リンクされた .cshtml から実際のアクションにリダイレクトするか、404 ページにリダイレクト/書き換えることができます。

<system.webServer>
    <rewrite>
        <rules>
            <rule name="rule1" patternSyntax="Wildcard" stopProcessing="true">
                <match url="*.cshtml" />
                <action type="Redirect" url="http://www.example.com/some404.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

更新: Marius Schulz のためのより複雑なバージョン (彼は 404 だけを要求する厳しい thekaido wasa に反対票を投じました)。これは のような URL を受け取り、views/home/index.cshtml?key=valueにリダイレクトしhome/index?key=valueます。これは 301 リダイレクトですが、Rewrite またはその他の http ステータス コードの場合もあります -詳細はこちら

<rule name="cshtml" stopProcessing="true">
    <match url="^views/([^/]+)/([^.]+)\.(?:cshtml|aspx)" />
    <action type="Redirect" url="{R:1}/{R:2}" />
</rule>

もちろん、これはクエリ文字列 (その?key=value部分) がなくても機能します。これの唯一の欠点は、web.config が登録済みルート (通常は Global.asax.cs 内) を認識しないことです。そして、私の知る限り、今ではそれができる方法があります。そのためには、いくつかのカスタム コードを記述する必要があります。Phil Haack によるこの記事とそれに付随するソース コードを見てください。

(そして、私が他の人の質問に答えているとしても、あなたのニーズに合わないという理由だけで反対票を投じないでください。)

于 2010-11-19T16:58:08.520 に答える
3

MVC3 RCからRTMに移行した場合は、必ず\ views \ web.configを調べて、次の構成を追加してください。

  <appSettings>
    <add key="webpages:Enabled" value="false" />
  </appSettings>

これにより、すべてのビューファイル(* .cshtml)が404notfoundを返すようになります。

于 2011-07-04T06:17:21.640 に答える