有没有办法阻止访问(404)MVC 3 beta 1中的Razor视图?当我创建一个全新的空白站点(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
答案 0 :(得分: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视图页面运行。
答案 1 :(得分: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,只是要求404s)。这会使用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中)。而据我所知,现在有可能。为此你必须编写一些自定义代码。请看Phil Haack的this article及其附带的源代码。
(请不要因为即使我回答别人的问题也不符合你的需要而投票。)
答案 2 :(得分:3)
对于从MVC3 RC迁移到RTM的用户,请务必查看\ views \ web.config,并添加以下配置
<appSettings>
<add key="webpages:Enabled" value="false" />
</appSettings>
这将确保所有视图文件(* .cshtml)都找不到404。