创建与 Active Directory 对话以验证用户并确定他们属于哪些组的 Web 服务。
我从验证过程开始,并得到了这个工作:
public bool AuthenticateAdUser(string username, string password)
{
//in the real code, these come from config
string domain = "TestDomain";
string server = 666.666.666.666;
string authType = "Basic";
string useSsl = "false";
AuthType atype = (AuthType)Enum.Parse(typeof(AuthType), authType);
using (var ldapConnection = new LdapConnection(server))
{
var networkCredential = new NetworkCredential(username, password, domain);
ldapConnection.SessionOptions.SecureSocketLayer = Convert.ToBoolean(useSsl);
ldapConnection.AutoBind = false;
ldapConnection.AuthType = atype;
ldapConnection.Bind(networkCredential);
}
// If the bind succeeds, the credentials are valid
return true;
}
但是,我不清楚如何使用该 LdapConnection 对象来处理组。文档和示例建议您为此目的使用 PrinicpalContext。所以我尝试了这个。
string domain = "TestDomain";
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain))
{
using (PrincipalSearchResult<Principal> src = UserPrincipal.FindByIdentity(pc, username).GetGroups(pc))
{
src.ToList().ForEach(sr => result.Add(sr.SamAccountName));
}
}
这失败了,声称它无法联系 Active Directory 服务器。使用 DNS 样式名称(“TestDomain.local”)似乎没有帮助。
这至少启动了一个网络主体:
string server = "666.666.666.666";
using (PrincipalContext pc = new PrincipalContext(ContextType.Machine, server))
{
using (PrincipalSearchResult<Principal> src = UserPrincipal.FindByIdentity(pc, username).GetGroups(pc))
{
src.ToList().ForEach(sr => result.Add(sr.SamAccountName));
}
}
但是,当您尝试对其执行任何操作时,它会因“找不到网络路径”而失败。
关于 Principal 为什么不起作用,或者我如何使用 LdapConnection 查询组的任何想法?