简短形式:我是否应该使用一些众所周知的 uid 来验证 ldap 客户端,然后在该客户端中使用其他方法来验证用户输入的 uid 和 pw?
长格式:我们有一个基于 .net 的商业 Web 产品,在许多客户站点中实施,目前使用内部用户身份验证。
我正在研究使用 LDAP 对目录进行身份验证。由于我们的产品在各种环境中实施,我希望它能够在尽可能广泛的 LDAP 兼容目录服务和配置范围内兼容,包括但不限于 Active Directory。
除了身份验证之外,我还想使用用户的目录属性来确定他们是否有权使用该应用程序。我希望这将由用户在特定组中的成员身份来指示。该组的名称将成为应用程序的配置点。
目录服务仅用于确认用户标识、密码和组成员身份。在处理来自用户的后续请求时,应用程序不会假定用户的身份。所以,没有 FormsAuthenticationTicket。
我的第一个问题来自我审查过的身份验证示例,例如http://tldp.org/HOWTO/LDAP-HOWTO/authentication.html和http://msdn.microsoft.com/en-us/library /ff649227.aspx. 它们使用用户输入的 ID 和密码来验证 LDAP 客户端。我想这是合理的,但在我的例子中,客户端将继续进行其他 LDAP 搜索以确认组成员身份。我是否需要担心最终用户可能没有足够的目录权限来进行成员资格检查?在我看来,更好的做法是使用保留的凭据进行 ldap 客户端身份验证,然后通过其他方式确认用户输入的 uid/pw。或者,也许,绑定两次,一次使用用户凭据来验证它们,第二次使用内置凭据进行搜索。我应该这样做,还是我只是让事情变得比他们需要的更难?
最小特权原则适用于此。您用于绑定到 LDAP 并枚举用户、组和任何其他相关信息的帐户绝对应该是一个“服务帐户”,而不是一个实际的人的帐户。
与大多数人类用户相比,此帐户需要不同的权限。VP 的助手不需要能够枚举所有组并查看给定帐户是否存在,但是您用来绑定到 LDAP 的帐户确实需要这样做。
如果您使用系统帐户授予您的普通用户帐户没有的权限,您就获得了权限升级。(在您的示例中,您的应用程序的用户可以看到他们自己看不到的组成员资格。)没关系,但请注意任何权限升级都有可能被滥用。
就个人而言,我更愿意编写我的 ACL,以便用户帐户拥有他们需要的任何权限,并使用我的 LDAP 服务器(而不是我的下游应用程序)来管理访问。为什么您的用户帐户不能看到他们属于哪些组?
至于“最小权限”,这里指的是使用用户的凭据,因为他已经可以访问这些凭据。如果您使用共享系统帐户,那是——按照设计——普通用户没有的额外权限。