1

我有一个 asp.net(动态数据)网站设置为另一个网站的子目录中的应用程序。此站点需要与顶级站点不同的安全设置。就像是:

    <authorization>
       <allow roles="ADMIN"/>
       <deny users="*"/>
    </authorization>

这些设置在子站点中被忽略。但是,它们在顶级站点上工作,但即使在顶级站点上设置,它们也不会被子站点继承,并且可以自由访问。什么可能导致这些设置被忽略?我试过添加:

<location path="." inheritInChildApplications="false">  

到顶级web.config,然后在子站点中设置上述授权规则,甚至尝试拒绝所有用户。访问该站点时,它看起来像:http://mysite/mybrokensite

我正在使用 Windows 身份验证。

4

3 回答 3

2

我认为关键是这个

网站设置为另一个网站的子目录中的应用程序

如果它是 IIS 中的一个单独的应用程序,它应该有它自己的 web.config 文件,并且可以从那里设置安全设置。因此,您将拥有一个用于主站点的 web.config 和一个用于子站点的 web.config。它们实际上是两个应用程序。

如果它只是您网站下的子文件夹,那么这不适用。这取决于您如何在 IIS 下设置它。如果它是一个单独的应用程序,那么该图标将是一个世界/卷心菜类型的图标。如果它是一个子文件夹,它们的图标将是......以及一个文件夹。

于 2009-03-27T22:48:26.980 回答
0

我输入了一个摘要,因为许多人在子文件夹身份验证方面面临同样的情况。

子文件夹授权

  • ASP.NET 只能为一个应用程序提供一种身份验证模式。
  • 不同的应用程序不能在它们之间共享资源。

设想

假设主页不应提示登录对话框。它应该让用户在没有任何登录的情况下通过。但是,在同一个应用程序中,可能在不同的文件夹中,另一个页面需要使用用户网络登录 ID 来检查用户对数据库表的权限。默认情况下,IE 将所有只有主机名的网站视为 Intranet。根据其默认的 Intranet 设置,如果使用 Windows 身份验证,它将不会提示登录对话框并将用户登录名和密码传递给应用程序。然而,棘手的是,如果应用程序有一个实际的域,IE 会认为它是一个 Internet 站点,如果使用 Windows 身份验证,它会提示登录名和密码。


不使用 Windows 身份验证提示 Internet 站点登录对话框的唯一方法是在 IIS 中也打开匿名身份验证。但是,您将无法捕获登录信息,因为匿名优先于 Windows 身份验证。好消息是有办法解决这个问题。如果应用程序子文件夹需要捕获登录信息,则需要覆盖 web.config 中 Location 元素中的父授权。

1 在 IIS 中,按如下方式配置身份验证:

  1. 启用匿名身份验证,
  2. 启用 Windows 身份验证

2 在 Web.Config 中添加以下内容。

<authentication mode="Windows" />
  <authorization>
   <allow users="*" />
</authorization>

<!-- secured is the relative subfolder name. deny anonymous user, so only the authenticated login will pass through -->
<location path="secured" allowOverride="true">
  <system.web>
    <authorization>        
        <deny users="?" />
    </authorization>
  </system.web>
</location>
于 2011-03-23T03:24:57.830 回答
0

要详细说明蒂姆的答案,请确保在 IIS 中将其设置为虚拟目录。在 IIS 管理、目录(或主目录)选项卡中查看该目录的属性页。如果应用程序标签显示为灰色,请点击创建按钮。现在 IIS 将从该目录加载 web.config。

于 2009-03-27T23:19:41.163 回答