我继承了一个具有自己的用户数据库和登录认证方案的应用程序,这是无法替换的。
现在需要与Active Directory集成。
我已经实现了混合模式(表单和AD)身份验证,我遇到的问题是保持用户同步
我已在用户数据库中为活动目录帐户名添加了一列。管理员需要在AD中创建用户,在我们的应用程序中创建它,然后在我们的应用程序中,选择匹配的AD用户...
这感觉很肮脏和天真,有什么更好的方法可以做到这一点。
答案 0 :(得分:4)
我建议的一件事是不将帐户名存储在数据库中,而是存储AD用户帐户的guid。然后,如果某个管理员更改某些内容,即使用户名已更改,连接也会保留。
您可以使用CLR library within sql server和sql job定期同步AD与用户数据库之间的帐户。
您可以使用clr库可以查找的组,拉入所有成员,然后根据其对AD组的所有权自动同步 - 即update / create / deactive帐户。然后,您的管理员只需要在AD中创建用户,授予他们访问该组的权限,然后等待该作业开始。 (或者手动开始)
答案 1 :(得分:4)
我目前参与的项目在某些方面与您所描述的相似。我发现创建一个通过SQL CLR函数调用的托管程序集是与Active Directory集成的最佳方法。最后,我觉得SQL CLR解决方案优雅且易于管理,足以满足我未来的需求。
由于我的项目和解决方案与您的情况不完全相同,我没有完美的答案,但是如果您采用SQL CLR与Active Directory集成的路线,我确实有一些一般的建议。当然,您可能仍然希望将Active Directory作为链接服务器进行查询(正如DarrellNorton中answer所建议的那样)......这可能很适合您的需求。
如果您决定采用SQL CLR的路线,您可能会发现这些注释很有用......
使用SQL CLR与Active Directory集成的好处在于您将使用托管代码,并且您可以根据要实现的功能使用大部分.NET Framework。对我来说,不利的一面是你最终必须编写一个体面的库组件,它对异常具有相当的弹性,以防止任何理论上(或实际上)对数据库引擎的可靠性造成损害。
注册您的程序集&运用 的System.DirectoryServices 强>
第一个“陷阱”我遇到安装我的程序集到SQL Server是你必须在数据库中注册System.DirectoryServices程序集...默认情况下它没有启用。以下question和accepted answer详细介绍了该问题。希望这可以节省你一些事先了解陷阱的时间。
在.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也可以使用,但在某些情况下,我相信这可能会改变。
我会研究两种方法: