代码之家  ›  专栏  ›  技术社区  ›  bkaid

ASP.NET MVC 3 Beta 1阻止访问Razor视图

  •  9
  • bkaid  · 技术社区  · 14 年前

    有没有办法阻止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应用程序
    互联网应用(Razor)
    F5
    导航到/views/home/index.cshtml

    3 回复  |  直到 13 年前
        1
  •  9
  •   Eilon    14 年前

    我是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
  •  4
  •   gligoran zz-sergant    14 年前

    您可以在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>
    

    更新:对于马吕斯·舒尔茨来说,这是一个更为复杂的版本(他投了反对票,甚至连海道都投了404票)。这将采用类似 views/home/index.cshtml?key=value 并将其重定向到 home/index?key=value . 这是一个301重定向,但也可以是重写或其他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中)。据我所知,现在已经有办法了。为此,您必须编写一些自定义代码。看 this article 作者是PhilHaack和它的源代码。

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

        3
  •  3
  •   Antony    13 年前

    对于从mvc3 rc迁移到rtm的那些,请确保查看\views\web.config,并添加以下配置

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

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