7

我正在使用 asp.net mvc 2 和 vs 2008。

我正在尝试使用表单授权制作网站。当我试图限制对某些页面的访问时,我正在使用 asp.net 管理工具。例如,我创建规则以拒绝匿名用户访问整个网站。正如预期的那样,管理工具在根 web.config 文件中添加了以下部分:

 <authorization>
   <deny users="?" />
  </authorization>

当我在某个子文件夹中执行相同操作时,例如 %ApplicationRoot%/View/Protected,管理工具也如预期的那样在提到的子文件夹中添加 web.config 文件,代码如下:

 <configuration>
<system.web>      
    <authorization>
        <deny users="UserName" />
    </authorization>
</system.web>

这些文件之间的主要区别在于 root web.config 授权部分有一些效果(一般来说,它按计划工作 - 拒绝来自整个网站的所有未经身份验证的用户)。但是子文件夹 web.config 授权部分根本没有效果。我发现然后添加到根配置文件,下面的代码

 <location path="Protected">
  <authorization>
    <deny users="UserName" />
   </authorization>
 </location>

做得很好 - 它按计划拒绝 %UserName% 访问位于 %ApplicationRoot%/View/Protected 文件夹中的所有视图。
这种行为与 cassini 和 iis 相似,我都尝试过。

主要问题是我需要一种管理工具来完成这项工作,所以我寻求任何有关问题的帮助 - 为什么当 web.config 位于子文件夹中时授权部分不起作用?

PS 我试图在子文件夹的 web.config之间<authorization>和中放置不正确的代码:</authorization>

  <authorization>
    asdfg
   </authorization>

没有效果。由于某些问题,可能整个部分都被忽略了?

PPS 同一文件中授权部分的代码不正确会导致错误

4

1 回答 1

7

您的问题是您的应用程序不是经典的 ASP.NET Web 窗体应用程序。您正在尝试做的事情将在 Web 窗体中完美运行,但在 MVC 中却不行。

在 MVC 世界中,当浏览器请求页面 /People/SmartList 时,不一定会显示项目中的 /People/SmartList.cshtml。事实上,您的项目甚至根本没有 /People/ 文件夹。MVC 引擎将显示的视图(.cshtml 文件)由路由决定。当 MVC 路由引擎访问那些 .cshtml 文件时,它根本不会查看您的 web.config 文件。现在,您可以看到为什么您的 web.conig 文件被忽略了。

但是您仍然可以进行授权。而不是使用 web.config 文件,您应该使用该[Authorize]属性并将其应用于适当的控制器的操作方法,甚至应用于整个控制器类。

[Authorize(Users="UserName")]
public ActionResult ShowRestrictedData()
    ...
于 2012-11-09T14:19:15.143 回答