【问题标题】:ASP.NET MVC 3 Beta 1 Block Access to Razor viewsASP.NET MVC 3 Beta 1 阻止访问 Razor 视图
【发布时间】:2010-10-13 07:47:32
【问题描述】:

有没有办法阻止对 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

【问题讨论】:

  • 您能提供完整的堆栈跟踪吗?
  • 更新了完整的堆栈跟踪和重现步骤。
  • 谢谢,我可以确认这是一个有效的错误。
  • 如果忽略 global.asax 中的路由会发生什么? routes.IgnoreRoute("{resource}.cshtml/{*pathInfo}");
  • 我已经尝试过了,但没有任何改变。

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

我是 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 视图页面运行。

【讨论】:

    【解决方案2】:

    您可能会在 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)。这将采用views/home/index.cshtml?key=value 之类的 URL 并将其重定向到 home/index?key=value。这是一个 301 重定向,但也可以是 Rewrite 或其他一些 http 状态代码 - more here

    <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 的 this article 及其附带的源代码。

    (请不要仅仅因为它不符合您的需求而投反对票,即使我正在回答别人的问题。)

    【讨论】:

    • 这并不能解决问题——我不想忽略这些或显示 404 错误页面而是显示它们...
    • thekiado 的问题是关于 404s。所以你的反对票是不公平的。我将添加一个更复杂的版本,它实际上处理尝试获取控制器并从中查看。
    【解决方案3】:

    对于从 MVC3 RC 迁移到 RTM 的用户,请确保查看 \views\web.config,并添加以下配置

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

    这将确保所有视图文件 (*.cshtml) 返回 404 未找到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多