0

我有一个由 IIS 使用 PHP 托管的旧版 Web 应用程序。web.config使用根目录中的以下配置来限制对该应用程序的某些目录的访问。这使得 Windows 用户名可用作REMOTE_USER,以便应用程序可以将该用户名映射到单个数据库以检查授权。这有效,不得更改。

<location path="lsgprog/bibliothek/adm">
    <system.webServer>
        <security>
            <authentication>
                <anonymousAuthentication    enabled="false" />
                <windowsAuthentication      enabled="true"  />
            </authentication>
        </security>
    </system.webServer>
</location>

对其他一些目录的访问也受到限制,并且使用 Windows 提供的凭据也受到限制。因此,那些其他目录也已anonymousAuthentication禁用和windowsAuthentication启用。不同之处在于 1. 这些设置是在 IIS 的 GUI 中进行的,以及 2. 授权实际上是针对文件系统进行检查的。这意味着目录仅对某些特殊的用户组具有读取权限,这些组和用户由某些 Active Directory 维护,并且由于该应用程序使用 Windows 身份验证,因此一切正常。用户在他们的 Windows 上进行身份验证,打开 Internet Explorer,请求站点的受限部分,IIS 获取用户名、组成员资格等,检查对文件系统中受限目录的访问并授予或拒绝它。

所有这些都是使用 IIS 的 GUI 手动配置的,我想将其迁移到web.config. 上面已经记录了为某些目录启用 Windows 身份验证,我缺少的是如何允许/拒绝对用户和组的访问,这是文件系统部分。我已经找到了元素authorization,它看起来很像我想要的,但无论我尝试什么都行不通。

<location path="lsgprog/vfristen">
    <system.webServer>
        <security>
            <authentication>
                <anonymousAuthentication    enabled="false" />
                <windowsAuthentication      enabled="true"  />
            </authentication>
        </security>
    </system.webServer>

    <system.web>
        <authorization>
            <deny   users="*"
                    roles="*"
                    verbs="GET,HEAD,POST" />
        </authorization>
    </system.web>
</location>

我的期望是以上内容足以拒绝所有用户的访问,但这不起作用,任何基于 ALLOW 的方法也不起作用。我希望users并且roles可以简单地映射到当前请求用户的用户名和组名。我不想要的是基于表单的授权或将目录转换为“应用程序”或任何需要在web.config.

那么,我正在尝试做的事情有可能吗?如果可以,怎么做?谢谢!

4

2 回答 2

1

在这种情况下,有多个选项,首先 - 尝试将web.config文件添加到需要拥有自己权限的文件夹中,例如在 下,将拒绝所有用户访问lsgprog/vfristen的最小示例:web.config

<?xml version="1.0"?>
<configuration>
    <system.web>
      <authorization>
        <deny users="*" />
      </authorization>
    </system.web>
</configuration>

为什么会起作用 - IIS 查看文件的每个文件夹结构web.config,在这种情况下,子级将覆盖父级,但仅覆盖子级内部的节点 - 这意味着它将保留父级(根)web.config 中的所有其他设置在 ASP.NET 应用程序中进行应用程序和目录特定的配置设置

尽管上面的文档是针对 ASP.NET 的,但它也适用于 IIS 级别。

尝试的第二个选项 - 因为问题提到了项目的根源,所以lsgprog这个设置是web.config

<location path="lsgprog/vfristen">

应改为(从路径中删除项目的根文件夹):

<location path="vfristen">

最后,也可以工作的第三个选项是Machine.config在上面文档中提到的级别覆盖它: 使用 Machine.config 文件中的位置元素

当 allowOverride 属性为 false 时,Web 应用程序目录中的 Web.config 文件无法覆盖您在元素中指定的设置。在您必须限制应用程序开发人员如何配置 Web 应用程序的环境中,这是一个有用的设置。以下示例显示了 Machine.config 文件的一部分,该文件需要身份验证才能访问默认网站上的 MyApp 应用程序,并且不能被 Web.config 文件中的设置覆盖:

机器配置

<configuration>
    <location path="Default Web Site/MyApp" allowOverride="false">
        <system.web>
            <authorization>
                <allow users="?" />
            </authorization>
        </system.web>
    </location>
</configuration>

于 2020-10-14T14:31:44.710 回答
0

您可以尝试在您的站点 web.config 文件中添加以下代码:

    <location path="foldername">
        <system.webServer>
            <security>
                <authentication>
                    <anonymousAuthentication enabled="false" />
                    <windowsAuthentication enabled="true" />
                </authentication>
            </security>
        </system.webServer>
    </location>
<location path="foldername/page1.php">
        <system.webServer>
            <security>
                <authorization>
                    <remove users="*" roles="" verbs="" />
                    <add accessType="Allow" roles="DOMAIN\ADGROUP" />
                    <add accessType="Deny" users="*" />
                </authorization>
            </security>
        </system.webServer>
    </location>

编辑:需要在 iis 中安装 URL 授权才能使此规则生效。

https://docs.microsoft.com/en-us/iis/manage/configuring-security/understanding-iis-url-authorization

于 2020-10-14T07:26:36.700 回答