所以继承我的问题。我有一个带有基于表单的身份验证的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
答案 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访问提供了更轻量级的方法。我可以为你提供你想要朝这个方向前进的样品。