【问题标题】:How to make IIS authorize requests based on Windows user name or group membership?如何使 IIS 根据 Windows 用户名或组成员身份授权请求?
【发布时间】:2021-01-28 02:21:03
【问题描述】:

我有一个由 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 之外完成的事情。

那么,我正在尝试做的事情是否可行?如果可以,怎么做?谢谢!

【问题讨论】:

  • 应用程序中需要限制在单独文件夹中的部分?例如&lt;project&gt;/&lt;secretfolder&gt; 包含需要限制的页面?
  • 是的,lsgprog是整个站点的根目录,对应你的例子中的project。 vfristen 是我要限制访问的子目录,对应于您的示例中的 secrefolder。该子目录中的所有文件都应被同等对待。
  • 检查答案,有 3 个选项可以解决这个问题,希望其中一个可以完成工作。

标签: asp.net iis authorization asp.net-authorization role-based-access-control


【解决方案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: Make application and directory-specific configuration settings in an ASP.NET application

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

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

<location path="lsgprog/vfristen">

应该改成(从路径中去掉项目的根文件夹):

<location path="vfristen">

最后,也可以工作的第三个选项是在上面文档中提到的Machine.config 级别覆盖它: Use the location element in the Machine.config file

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

Machine.config

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

【讨论】:

  • 好像我解释错了我的路径,也许以下更好:C:\inetpub\wwwroot\lsgprog\vfristen 最后一部分是需要限制访问的部分。除此之外,Machine.config 不是一个选项,我只想将所有内容存储在站点内。最后,您的示例与我已经在做的非常相似,即使在 vfristen 中有一个不同的 web.config 时也不起作用。
  • 我刚刚在 Windows Server 2012 机器上使用 IIS 8 中的默认网站尝试了此操作,添加了一个 Test 文件夹,其中包含一个新的 web.config 内部设置 &lt;deny users="*" /&gt; 并且它按预期工作- 您的服务器运行的是什么 IIS 版本?应用程序在哪个Application Pool 下运行? Application Pool 是否在.NET Framework version 设置下设置为No Managed Code?
  • 在文件夹 web.config 中尝试设置拒绝设置以包括角色,因为您使用的是基于角色的身份验证,例如&lt;deny users="*" roles="*" /&gt;
  • 另一个答案是有效的:stackoverflow.com/a/64348499/2055163 我只需要在 Windows 功能下安装 IIS URL 模块,这在我的情况下是缺失的。这样做之后,另一个答案的 XML 配置就起作用了。在您和我之前的示例中使用 allow 或 deny 会在查看身份验证策略时导致 IIS GUI 中出现错误消息。所以我将坚持另一个答案,这在逻辑上是相同的,只是语法不同。也许您可以将已安装的 IIS 功能添加到您的答案中以供参考和比较?无论如何感谢您的测试!
  • 该服务器没有启用URL Authorization 功能,但默认网站在配置为Application Pool 的Application Pool 下运行,那么您的应用程序的设置是什么?什么版本的 IIS? .NET Framework版本设置下Application Pool是否设置为No Managed Code?
【解决方案2】:

您可以尝试在您的网站 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 Authorization 才能使此规则生效。

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

【讨论】:

  • 不起作用,最好能解释一下 authorization 实际上是什么,为什么它使用与我已经不同的子节点,即使它们没有记录等。是是否有任何额外的模块或系统要求需要加载/配置/...?
  • 这确实有效,我知道我现在缺少什么:这是关于 IIS URL 授权与 APS.NET URL 授权。前者是我需要并且需要另外安装的:docs.microsoft.com/en-us/iis/manage/configuring-security/… 在你的答案中包含这些细节会很好。
  • 由于某种原因,像TSCHOENING-NB\tschoening 这样的用户可以工作,但我测试的所有角色都失败了:TSCHOENING-NB\Benutzer、TSCHOENING-NB\Users、TSCHOENING-NB\Jeder、TSCHOENING-NB\Everyone 等。这不应该与非-AD 组?
  • @ThorstenSchöning 我会添加这个细节。
  • @ThorstenSchöning 确保您在角色中传递了正确的凭据。您可以通过打开 lusrmgr.msc 来检查您的计算机上可用的角色和用户
猜你喜欢
  • 2018-09-02
  • 2019-03-04
  • 2020-02-05
  • 1970-01-01
  • 2011-05-28
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多