【问题标题】:Syncing Active Directory with my Application将 Active Directory 与我的应用程序同步
【发布时间】:2010-12-15 14:09:44
【问题描述】:

我继承了一个应用程序,它有自己的用户数据库和无法替换的登录身份验证方案。

现在需要与 Active Directory 集成。

我已经实现了混合模式(表单和 AD)身份验证,我遇到的问题是让用户保持同步

我在我们的用户数据库中添加了一个用于 Active Directory 帐户名称的列。管理员需要在 AD 中创建一个用户,在我们的应用程序中创建它,然后在我们的应用程序中,选择匹配的 AD 用户...

这感觉又脏又幼稚,有什么更好的方法可以做到这一点。

【问题讨论】:

    标签: asp.net active-directory ldap


    【解决方案1】:

    我建议不要将帐户名存储在数据库中,而是将 AD 用户帐户的 guid 存储在数据库中。然后,如果某些管理员更改了某些内容,即使用户名已更改,连接仍然存在。

    您可以使用CLR library within sql serversql job 在 AD 和用户数据库之间定期同步帐户。

    您可以使用 clr 库可以查找的组,拉入所有成员,然后自动同步 - 即根据帐户对 AD 组的所有权更新/创建/停用帐户。然后您的管理员只需要在 AD 中创建用户,授予他们对组的访问权限,然后等待工作开始。 (或手动启动)

    【讨论】:

    【解决方案2】:

    我目前参与的项目在某些方面与您所描述的相似。我发现创建一个通过 SQL CLR 函数调用的托管程序集是与 Active Directory 集成的最佳方式。最后,我确实觉得 SQL CLR 解决方案足够优雅且易于管理,足以支持我未来的需求。

    由于我的项目和解决方案与您的情况不完全相同,因此我没有完美的答案,但是如果您采用 SQL CLR 与 Active Directory 集成的路线,我确实有一些一般性建议。当然,您可能仍想考虑将 Active Directory 查询为链接服务器(正如 DarrellNorton 在他的 answer 中所建议的那样)......这可能适合您的需求。

    如果您决定走 SQL CLR 的路线,您可能会发现这些注释很有帮助...

    使用 SQL CLR 与 Active Directory 集成:

    使用 SQL CLR 与 Active Directory 集成的好处在于,您将使用托管代码,并且您可以使用大部分 .NET 框架来决定要实现的功能。对我来说不利的是,您最终必须编写一个体面的库程序集,该程序集对异常具有相当的弹性,以防止对您的数据库引擎的可靠性造成任何理论上的(或实际的!)损害。

    1. 注册您的程序集并使用 System.DirectoryServices

      我在将程序集安装到 SQL Server 时遇到的第一个“问题”是您必须在数据库中注册 System.DirectoryServices 程序集...默认情况下它未启用。以下questionaccepted answer 详细介绍了该问题。希望这可以节省您提前了解问题的时间。

    2. 在 .NET 中使用 Active Directory

      我要指出的另一件主要事情是我用来构建自定义库的资源。我在 Code Project 上找到了一篇很棒的(虽然有点旧)How-To 文章,它几乎是我整个实现的主要参考来源:

      (Almost) Everything In Active Directory via C# 在代码项目中

      您会发现本文涵盖了从创建和管理用户到使用域和信任的所有内容。

      我对这个资源的唯一问题是它不涵盖System.DirectoryServices 下的子命名空间(例如 AccountManagement、Protocols、ActiveDirectory)。根据我的阅读,有多种方法可以在 .NET 中与 LDAP 进行交互。我的预感是,在正确了解所有这些命名空间的情况下,可能会创建一个更好/更快的实现。这并不是说我当前的实现速度不足以满足我的需求......我只是想知道如果我通过原始 LDAP 协议(​​System.DirectoryServices.Protocols)或其他东西写“更接近金属”会不会更好.

    【讨论】:

    • 宝贵的现实世界视角!谢谢!
    【解决方案3】:

    我想最好的解决方法是使用 Forefront Identity Manager -> http://www.microsoft.com/forefront/identitymanager/en/us/default.aspx

    就像身份管理世界中的 BizTalk,您可以将信息同步到不同的异构基础设施,包括目录、数据库和业务线应用程序

    【讨论】:

      【解决方案4】:

      您可以在 SQL Server 中将 Active Directory 作为链接服务器进行查询。您可以编写存储过程来尝试查询 SQL Server 表或 Active Directory 并返回正确的登录信息。不会复制或同步数据。

      以下是如何将 AD 添加为链接服务器并对其进行查询(不过,您必须使用 LDAP 字符串,希望您了解 AD 的基础知识):http://www.kodyaz.com/articles/active-directory-services-queries-using-openquery.aspx

      【讨论】:

      • 请注意,使用 AD 作为链接服务器时存在行数限制。我相信它只会返回 1000 行。
      • 正式注明。如果@Overflow 只是出于身份验证目的而考虑撤回单个用户,那应该没问题。
      • 我有一个导入实用程序,最初是为了同步而编写的,所以这是为了进行管理。
      • @Overflow:您似乎在寻找更好的方法,更好的方法不是同步事物,而是以联合的方式实时访问它们。我看到你已经接受了一个答案,祝你好运。
      • 为混淆道歉“同步”是一个错误的词选择,“链接”会更好。使用您的方法,我仍然需要存储在我的数据库中的一些链接(例如 SID)来将应用程序特定的用户数据映射到 AD 用户。您的答案有优点(没有引入 sql clr 层),但是虽然没有什么能阻止我使用您的方法(甚至动态创建 nessecery 应用程序用户数据),但接受的答案实际上回答了我的部分问题(创建用户的建议使用工作),并且也是第一个回答。
      【解决方案5】:

      正如其他人所提到的,有一件事是不要将名称用作数据库中的键。使用 AD 中的用户 SID 作为数据库中的键,因为它在 AD 中是持久的并且不会更改。也可以使用 GUID,但在某些情况下,我相信这可能会改变。

      我会研究两种方法:

      1. 在将用户添加到数据库之前,让您的应用程序在 AD 中“查找”用户。因此,您的应用程序“创建用户”屏幕实际上将允许管理员在 AD 中搜索适当的用户,然后他们会选择该用户。然后,您将拥有有关 AD 帐户的所有信息,并可以在创建用户时将其添加到您的数据库中。该关联将永远存在。
      2. 将所有用户创建过程移至您的应用程序中。管理员会来到您的系统创建用户,您可以在 AD 中包装创建它们,并在单个事务中将它们与 AD 信息一起添加到数据库中。请注意,这很有可能在许多组织中是不允许的,因为 AD 中可能会发生其他事情并且需要设置。但它可能对你有用。

      【讨论】:

      • 在我们的客户网站中,有很多应用程序使用 AD,所以我们当然不能将用户创建转移到我们的应用程序!第 1 点基本上是我们已经在做的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多