ASP.NET Web.config授权设置在子文件夹中被忽略。

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>

这些文件之间的主要区别在于根web.config授权部分具有一定的影响(一般来说,它按计划工作-拒绝所有未经身份验证的用户访问整个网站)。但是子文件夹web.config授权部分根本没有任何影响。 我发现当以下代码添加到根配置文件时:
 <location path="Protected">
  <authorization>
    <deny users="UserName" />
   </authorization>
 </location>

这项工作的表现很好 - 它按计划拒绝了%UserName%访问%ApplicationRoot%/View/Protected Folder中的所有视图。
这种行为类似于Cassini和IIS,我都尝试过了。

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

P.S.我在子文件夹的web.config中尝试放置不正确的代码:

  <authorization>
    asdfg
   </authorization>

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

另外,在同一文件中,授权部分之外的不正确代码会导致错误。

1个回答

7

您的问题在于您的应用程序不是传统的ASP.NET Web Forms应用程序。您尝试的做法在Web Forms中可以完美地实现,但在MVC中不行。

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

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

[Authorize(Users="UserName")]
public ActionResult ShowRestrictedData()
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接