使用 Active Directory 在 IIS 上托管的基于 PHP 的网站的编程访问控制?

Programmatic Access Control on PHP based website hosted on IIS using Active Directory?

背景:

我在 IIS8 上有一个基于 PHP 的网站,集成了 Active Directory,我需要在其中提供不同级别的访问控制。例如:

Customer Service
- View Transactions
- View Customers
Finance
- Edit Transactions
- View Transactions
- View Customers

目前,我们正在使用 IIS 的 AD 集成来控制对站点安全部分的登录,但无法基于组隔离权限(例如:上面的示例)。

问题:

有没有一种方法(通过 PHP)使用 AD 不仅仅是简单的登录,我可以在其中确定一个人在哪个 AD 组中,这样我就可以以编程方式将我的页面创建基于他们的组?

视情况而定。您的站点使用 NTLM 或通过直接请求您的 AD 服务器来检查 AD 凭据? 在第一种情况下(NTLM)网站只收到一些关于帐户的数据(samaccountname,域),所以它对 AD 中可以包含权限数据的自定义字段一无所知,你需要控制你网站的访问权限,也许你可以编写一些同步工具,从 AD 导出访问权限并将其放入您站点的数据库。 在第二种情况下,您的站点具有用户对 AD 的访问权限,并且可能(取决于您的 AD 设置)可以读取 AD 中的一些访问特定字段。 我的回答基于我在 php 站点上编写 AD auth 在 nginx/linux 下工作的经验,在基于 IIS 的 php 环境中情况可能会有所不同。

结果满足了我对单一登录机制的需求,没有单独的查找帐户,不同的组权限等,这非常简单,根本不需要 LDAP。

  • 在 IIS 中为网站关闭 "anonymous authenticaion"。
  • 在 IIS 中为站点启用 Windows 身份验证。
  • 创建代表每个组的网站子文件夹。
  • 在每个文件夹中放置一个文件(空文件或一个字节)。
  • 删除所有 Windows AD 访问权限(您的 programmers/Admins 除外)。这包括 IUSR - 也将其删除 - 到子文件夹。
  • 按组添加对文件夹的访问权限。
  • 写一小段 PHP 检查“[GroupNameFolder]/PermFile.txt”(或任何你命名的)是否存在。

就是这样。没有 LDAP 库,没有 LDAP 调用。 IIS 会处理这一切。

如果文件存在,则它们在文件夹所代表的 AD 组中。如果没有,则他们不在该组中。然后,以编程方式,如果我在 "Finance" 上获得 "exists"(例如:我的问题示例),我允许他们 "Edit Transactions" 访问。

缺点:

这不是跨平台安全的(尽管这些方法可以很容易地适应其他平台)。