4

创建与 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 查询组的任何想法?

4

0 回答 0