9

有没有办法阻止对 MVC 3 beta 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 应用程序
Internet 应用程序 (Razor)
F5
导航到 /views/home/index.cshtml

4

3 回答 3

9

我是 ASP.NET 团队的开发主管,负责 ASP.NET MVC 3 和 ASP.NET 网页和 Razor。

这在 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 的一个更复杂的版本(他否决了这个甚至强硬的 thekaido wasa 只要求 404)。这将采用 URL likeviews/home/index.cshtml?key=value并将其重定向到home/index?key=value. 这是一个 301 重定向,但它也可以是重写或其他一些 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) 返回 404 未找到。

于 2011-07-04T06:17:21.640 回答