如果应用程序服务器位于Active Directory A中,如何查询Active Directory B.

时间:2017-03-28 04:05:11

标签: c# asp.net iis active-directory ldap

所以继承我的问题。我有一个带有基于表单的身份验证的Asp.net应用程序。我的数据库中有用户,但用户也必须在活动目录中。

以下代码供我查看用户是否在域A

            DirectoryEntry de = new DirectoryEntry();
            de.Path = "LDAP://domainA.com";
            de.AuthenticationType = AuthenticationTypes.None;
            DirectorySearcher search = new DirectorySearcher(de);
            search.Filter = "(SAMAccountName=" + account + ")";
            search.PropertiesToLoad.Add("displayName");

            SearchResult result = search.FindOne();

此代码工作正常。问题是客户端请求域B也应该能够连接到应用程序。因此创建了以下代码:

            DirectoryEntry de = new DirectoryEntry();
            de.Path = "LDAP://domainB.com";
            de.AuthenticationType = AuthenticationTypes.None;
            DirectorySearcher search = new DirectorySearcher(de);
            search.Filter = "(SAMAccountName=" + account + ")";
            search.PropertiesToLoad.Add("displayName");

            SearchResult result = search.FindOne();

由于我的服务器位于域A中,因此无效。知道服务器在domainA中,有没有办法让我查询domainB?我发现一篇文章说要为domainA和B设置信任,但这个域名不应该被链接。它仅适用于此应用程序,因此需要此功能。

P.S。我可能忘了解释一个重要的细节。 domainA和B不在同一网络上。但是domainA可以ping domainB

2 个答案:

答案 0 :(得分:1)

您需要提供有权在域B上查询AD的凭据。

var de = new DirectoryEntry("LDAP://domainB.com", "Username", "Password");
var search = new DirectorySearcher(de);

答案 1 :(得分:1)

在针对外域尝试示例时,我注意到外国DC正在提供错误消息"服务器不可用"使用错误的身份验证类型时。请尝试:

de.User = @"DOMAINB\user";
de.Password = "YourPassword";
de.AuthenticationType = AuthenticationTypes.None;

当然,这会导致不安全的BASIC简单绑定,从而删除ADSI可能提供的任何加密。如果这样做,您应该尝试服务器接受的更安全的身份验证类型。

替代方案可能是使用" System.DirectoryServices.Protocols" -namespace,它为AD访问提供了更轻量级的方法。我可以为你提供你想要朝这个方向前进的样品。