如何为我的 Web 应用程序构建 LDAP 集成?
Posted
技术标签:
【中文标题】如何为我的 Web 应用程序构建 LDAP 集成?【英文标题】:How to build LDAP integration for my web app? 【发布时间】:2010-10-20 04:53:54 【问题描述】:我的公司开发和销售一个拥有数百名客户的 SaaS 应用程序。我们的一些客户要求我们支持 LDAP 集成,以便针对他们现有的系统验证用户帐户,而不必为他们的每个员工创建另一个登录帐户。似乎这在许多地方被称为单点登录 (SSO)?自然,我们的系统已经有一种机制来维护用户帐户配置文件并从我们的登录页面验证这些用户帐户。
我们对 LDAP 有点无知,并且对一些事情感到困惑。请原谅可能使用了错误的术语(请记住,我们对此有点无知)。
我们认为我们了解这可能如何工作的基础知识:
我们的客户将其帐户配置为“打开”其帐户的“远程身份验证”功能。他们提供将对其用户进行身份验证的远程 URL。 用户来到我们的登录页面并尝试使用他们公司的 LDAP 系统提供的用户名和密码登录。 我们的登录页面会将登录凭据(可能以某种约定的格式加密和散列)安全地转发到我们客户提供的“远程身份验证”URL。 客户的脚本将对用户进行身份验证,然后使用“身份验证状态”将他们重定向回我们的网站。 我们的页面将分析“身份验证状态”并接受用户是否已登录。假设上述信息甚至是半正确的,我们仍然需要每个用户在我们的系统中都有一个帐户。难道我们不需要某种方法来将我们的用户帐户配置文件与 LDAP 目录中的用户配置文件同步吗?这只是一个引用 LDAP 系统中用户 ID 的“外部 ID”吗?那么是否需要客户的“远程身份验证”脚本必须向我们的系统提供该 ID,以便我们知道系统中的哪个用户帐户与登录相关联?
我们缺少什么?
顺便说一句,我们的平台是 IIS、ASP.Net 2.0 和 SQL Server 2005。
【问题讨论】:
【参考方案1】:您需要确定计划如何将 LDAP 用户链接到应用程序中的帐户。
例如,您可以要求 LDAP 系统中的用户名与您的应用程序中的用户名匹配,或者您可以要求某人在您应用程序的每个用户帐户中明确指定一个 LDAP 用户名。
找到该链接后,您可以简单地执行 LDAP 绑定来测试用户凭据。
【讨论】:
【参考方案2】:始终记得验证身份验证测试以确保发送的密码不为空。
根据标准,具有用户名且没有密码的绑定被视为匿名绑定,并且看起来已经成功!事实上,它真的没有。
这是应用程序要处理的问题,因为 LDAP 服务器只是遵循标准,这是一个令人讨厌的标准,但仍然是一个标准。
【讨论】:
【参考方案3】:有多种选择。如果您真的指的是 LDAP,而不仅仅是 Active Directory,我可能会考虑使用 System.DirectoryServices.Protocols 通过安全通道使用提供的凭据执行 LDAP 绑定。
严格来说,这不是单点登录。 SSO 意味着您只需在首次登录时提交一次您的凭据。这只是通过仅使用一个 ID 来降低用户的复杂性。通常,对于混合平台和技术的企业环境中的 Windows 客户端,SSO 是通过添加到桌面的客户端来实现的,该客户端管理对各种系统的身份验证。在仅 MS 的环境中,如果您的所有 Web 应用程序都在 IIS 上,您可能会实现 SSO,您使用 IE 并使用集成 Windows 身份验证、模拟和所有这些东西。
您可以考虑将经过身份验证的用户自动注册到您的系统中,除非您需要预先配置个人资料类型的数据。如果您确实需要预先配置用户,您可以考虑定期从 LDAP 目录导入(所有或过滤的子集)用户,并将它们置于未配置状态,以便管理员从现有的未配置列表中选择- 配置用户而不是输入 ID。否则,您的管理员可能会输入错误的用户 ID 并出现不匹配的情况。
您可以提供一种 API,以便身份和访问管理解决方案(鉴于您的 Microsoft 倾向,请参阅 ILM2 007 为例)可以与您的系统集成并为您执行所有用户帐户管理。
【讨论】:
【参考方案4】:也许考虑认证与授权
身份验证 - 这是哪个用户? 授权 - 谁应该能够使用应用程序、指定的用户、组?
目前您通过身份验证暗示授权,因为只有那些注册到您的应用程序的人才能使用它。
如果您使用目录而不是自定义数据存储,那么
使用目录连接方式对用户进行身份验证 您(可能)免费获得身份验证 - 用户是 windows 已知的,windows 可以识别 iis 和 sqlserver,也许不需要询问用户他们是谁。 您知道的用户数量超过了拥有权限的用户,因此需要应用限制 - 将连接限制到特定组。 可以将用户数据存储在目录中,而不是与您的应用数据一起存储在 sql server 中。如果您的用户真的想要通用 LDAP,那么您想查看 (C)ldap_connect, ldap_bind_s
(C#) LDAPConnection System.DirectoryServices.Protocols
或者再次回到 AD 这个Demystified .Net App single sign on 可能会有所帮助
【讨论】:
【参考方案5】:这在我们系统中的工作方式:
当用户导航到 Web 应用程序时,REMOTE_USER 服务器变量被假定为用户令牌 登录代码使用搜索专用帐户连接到 ldap 目录 登录代码查找“匹配”REMOTE_USER 的 ldap 帐户 然后登录代码会尝试将该帐户与我们系统中的帐户进行匹配 如果一直可以匹配,假设用户登录为匹配的账号,继续正常这样,用户可以在我们的应用程序中重复使用他们的 Windows 域身份验证。
【讨论】:
【参考方案6】:这是一个有用的软件,它允许使用 JSON-RPC 通过 Web 访问 LDAP 目录:Json2Ldap
【讨论】:
以上是关于如何为我的 Web 应用程序构建 LDAP 集成?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Windows Azure Web 角色上的 PHP 项目配置 TFS 构建定义以实现持续集成?
如何为 DASH Plotly 应用程序实现 LDAP 身份验证?