0

我试图深入了解导致我看到的一个特别奇怪的错误的原因。我已将问题隔离如下:

使用两个基本控制器创建一个 ASP.Net MVC 应用程序。

public class HasLocationController : Controller
{
   public ActionResult Index()
   {
      return View();
   }
}

public class NoLocationController : Controller
{
   public ActionResult Index()
   {
      return View();
   }
}

将位置元素添加到路径“HasLocation”的 web.config

<location path="HasLocation">
   <system.web>
      <authorization>
         <allow users="*"/>
      </authorization>
   </system.web>
</location>

将站点发布到 IIS6 或 IIS7 (IISExpress 和 WebDevServer 不起作用),并尝试使用以下链接进行浏览:

http://[yourdomain]/NoLocation/%20~C:/blah.txt

http://[yourdomain]/HasLocation/%20~C:/blah.txt

对于没有配置相应位置元素的控制器,您会收到您期望的异常消息。


来自没有位置元素的控制器的异常


但是,如果你在控制器上尝试使用 location 元素做同样的事情,那么你会得到这个奇怪的错误:

注意:这只发生在前导波浪号 (~) 字符上。没有它,你会得到你所期望的正常错误。


使用位置元素时出错


我无法真正找到有关此错误的文档,但我很想了解为什么会发生这种情况以及如何防止它。

您可以就该问题提出的任何意见都会有所帮助。

4

2 回答 2

3

互联网上几乎有数百个关于此错误的答案。很可能它与您的控制器完全无关,但与:

~C:/blah.txt

特别是:它可能认为具有潜在危险的那个。看看HttpRuntimeSection.RequestPathInvalidCharacters

至于第二个错误。HasLocation没错,您的项目中不存在该目录。创建它时,您将收到第一个错误。当您删除:它时,它将尝试在HasLocation目录中加载您请求的任何文件。

注意:您不得使用 web.config 中的 location 元素来保护 MVC 应用程序控制器,您需要使用AuthorizeAttribute或其他类似的自定义属性。

这是一个参考,任何搜索 SO 或 Google 都会说同样的话:

您不能使用路由或 web.config 文件来保护您的 MVC 应用程序。保护 MVC 应用程序的唯一受支持的方法是使用具有 [Authorize] 属性的基类,然后让每个控制器类型子类化该基类型。

重述正在发生的事情:

第一个错误:由于HttpRuntimeSection.RequestPathInvalidCharacters ,您的 URL 引发错误。

第二个错误:是否有控制器都没有关系。默认的 ASP.Net Webforms 引擎正在尝试检测您在 url 中指定的目录是否存在(在您的情况下是名为HasDirectory的目录),因为它需要按照您在 web.config 中指定的方式授权 Webforms 引擎的目录访问位置元素。它甚至不担心文件。由于此目录不存在,因此您会得到与图像状态完全相同的错误(我以绿色突出显示):

突出显示的错误

如果创建目录,则会收到错误 #1。

整个 ASP.Net 运行时执行如下操作:

  1. 解析请求所需的路径。
  2. 如果目录存在于 web.config 位置元素中,则验证对目录的任何授权。
  3. 如果它具有访问权限,则获取文件并对其进行解析(aspx 等)
  4. 如果它没有访问权限并且文件存在,则抛出异常或按照配置重定向。
  5. 如果该文件不存在,则忽略 web.config 中的 location 元素并运行IIS catch all以确定是否有另一个请求路由
于 2012-06-08T21:14:11.387 回答
0

我相信 url 中的波浪号会诱使虚拟路径提供程序在物理磁盘上查找该控制器。

于 2012-06-09T01:34:56.803 回答