将Active Directory与我的应用程序同步

时间:2010-12-15 14:09:45

标签: asp.net active-directory ldap

我继承了一个具有自己的用户数据库和登录认证方案的应用程序,这是无法替换的。

现在需要与Active Directory集成。

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

我已在用户数据库中为活动目录帐户名添加了一列。管理员需要在AD中创建用户,在我们的应用程序中创建它,然后在我们的应用程序中,选择匹配的AD用户...

这感觉很肮脏和天真,有什么更好的方法可以做到这一点。

5 个答案:

答案 0 :(得分:4)

我建议的一件事是不将帐户名存储在数据库中,而是存储AD用户帐户的guid。然后,如果某个管理员更改某些内容,即使用户名已更改,连接也会保留。

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

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

答案 1 :(得分:4)

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

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

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

使用SQL CLR与Active Directory集成:

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

  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)或其他东西写“更接近金属”会更好

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

我会研究两种方法:

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