.net 如何在System.DirectoryServices中跨调用保留连接凭据?
我正在尝试连接到其他林中的Active Directory域(W2K8R2 DC)。为此,我将凭据传递到以下DirectoryEntry构造函数:.net 如何在System.DirectoryServices中跨调用保留连接凭据?,.net,active-directory,directoryservices,.net,Active Directory,Directoryservices,我正在尝试连接到其他林中的Active Directory域(W2K8R2 DC)。为此,我将凭据传递到以下DirectoryEntry构造函数: DirectoryEntry(string path, string username, string password, AuthenticationTypes authenticationType) 这一切都很好。但我想做的是以某种方式保留连接,并在我对广告的所有调用中重用它,这样我就不需要重复传递凭据。这有可能吗 谢谢 如果您希望在连接级别使
DirectoryEntry(string path, string username, string password, AuthenticationTypes authenticationType)
这一切都很好。但我想做的是以某种方式保留连接,并在我对广告的所有调用中重用它,这样我就不需要重复传递凭据。这有可能吗
谢谢 如果您希望在连接级别使用该控件,我建议您使用。您可以重用LDAP连接来进行不同的LDAP查询。然而,编程范例与
DirectoryEntry
如果需要使用DirectoryEntry
,则必须将用户名和密码存储在某个位置,然后将它们传递给所有DirectoryEntry
对象。我要做的是编写一个方法GetDirectoryEntry(string dn)
,并让这个方法使用正确的用户名和密码为我创建DirectoryEntry
。这看起来不优雅,但它没有做错任何事。如果您希望密码以明文形式存储在内存中,请使用存储密码
这没有错,因为DirectoryEntry
正在维护自己的LDAP连接池。如果您有多个具有相同用户名和密码的DirectoryEntry
,它将足够智能,可以共享LDAP连接。这与保持单个LDAP连接并执行不同的LDAP查询基本相同。它不会为每个DirectoryEntry
对象重新向LDAP服务器进行身份验证
如果您不喜欢依赖DirectoryEntry
中的黑盒功能,以下建议的解决方法可能会让您感觉更好
static DirectoryEntry GetObject(DirectoryEntry root, string dn)
{
using (DirectorySearcher searcher = new DirectorySearcher(root))
{
searcher.Filter = "(distinguishedName=" + dn + ")";
searcher.SearchScope = SearchScope.Subtree;
SearchResult result = searcher.FindOne();
if (result == null) return null;
return result.GetDirectoryEntry();
}
}
您只需要使用用户名和密码绑定到根对象。然后,您可以将根对象保持为静态变量或任何您喜欢的内容。然后,通过将
SearchRoot
设置为根对象进行LDAP查询,您将获得另一个DirectoryEntry
对象。返回的DirectoryEntry
仍将使用root用户的用户名和密码。同样,这并没有比简单地将用户名和密码传递给DirectoryEntry
更好的方法。实际上,就性能而言,情况更糟,因为我们需要再执行一次LDAP查询来获取DirectoryEntry
如果您希望在连接级别使用该控件,我建议您使用。您可以重用LDAP连接来进行不同的LDAP查询。然而,编程范例与DirectoryEntry
如果需要使用DirectoryEntry
,则必须将用户名和密码存储在某个位置,然后将它们传递给所有DirectoryEntry
对象。我要做的是编写一个方法GetDirectoryEntry(string dn)
,并让这个方法使用正确的用户名和密码为我创建DirectoryEntry
。这看起来不优雅,但它没有做错任何事。如果您希望密码以明文形式存储在内存中,请使用存储密码
这没有错,因为DirectoryEntry
正在维护自己的LDAP连接池。如果您有多个具有相同用户名和密码的DirectoryEntry
,它将足够智能,可以共享LDAP连接。这与保持单个LDAP连接并执行不同的LDAP查询基本相同。它不会为每个DirectoryEntry
对象重新向LDAP服务器进行身份验证
如果您不喜欢依赖DirectoryEntry
中的黑盒功能,以下建议的解决方法可能会让您感觉更好
static DirectoryEntry GetObject(DirectoryEntry root, string dn)
{
using (DirectorySearcher searcher = new DirectorySearcher(root))
{
searcher.Filter = "(distinguishedName=" + dn + ")";
searcher.SearchScope = SearchScope.Subtree;
SearchResult result = searcher.FindOne();
if (result == null) return null;
return result.GetDirectoryEntry();
}
}
您只需要使用用户名和密码绑定到根对象。然后,您可以将根对象保持为静态变量或任何您喜欢的内容。然后,通过将
SearchRoot
设置为根对象进行LDAP查询,您将获得另一个DirectoryEntry
对象。返回的DirectoryEntry
仍将使用root用户的用户名和密码。同样,这并没有比简单地将用户名和密码传递给DirectoryEntry
更好的方法。事实上,就性能而言,情况更糟,因为我们需要再执行一次LDAP查询来获取DirectoryEntry
,我刚刚发现System.DirectoryServices.AccountManagement包含类似的功能;但这对我来说不起作用,因为我需要从Active Directory访问任意字段;但这对我来说不起作用,因为我需要从Active Directory访问任意字段;我想我会选择DirectorySearcher方法。非常感谢您的精彩和详细的回答!这真漂亮。我需要知道DirectoryEntry
是否真的在维护自己的LDAP连接池,以及我是否真的应该在每次我想查询广告而不是单例时创建一个新的DirectoryEntry
和关联的DirectorySearcher
。这有助于回答我的问题并重构我的代码,因为建立LDAP连接的开销只执行一次,而所有其他DirectoryEntry
实例化都使用连接池功能,并尽可能避免LDAP连接开销。谢谢很好-这看起来很可行;我想我会选择DirectorySearcher方法。非常感谢您的精彩和详细的回答!这真漂亮。我需要知道DirectoryEntry
是否真的在维护自己的LDAP连接池,以及我是否真的应该在每次我想查询广告而不是单例时创建一个新的DirectoryEntry
和关联的DirectorySearcher
。这个帮手