1

我对 c# 和 LDAP 很陌生,我正在做这个项目,以便我可以通过更多的动手方法来了解它们。

我要创建的是一个登录表单,它有一个登录点击事件,在用户使用 LDAP 通过活动目录输入用户名和密码后,该事件将验证用户名和密码。

我已经阅读了 .NET Framework 3.5 中的管理目录安全主体,以便能够更好地理解这个主题,并且我在这里也经历了类似的主题,这个主题涉及验证本身(c# - Validate a username and password against Active Directory?)和这个验证用户名(c#针对通过LDAP的Active Directory

从第一个链接的主题中,我了解到以下代码应该可以解决用户名和密码的身份验证问题:

  using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "LDAP://example.string.com/OU=Users, Dc=example, Dc= string, DC=com"))
        {
            bool isValid = pc.ValidateCredentials(User, Password);
        }

因此,我将其合并到点击事件的方法如下:

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "LDAP://example.string.com/OU=Users, Dc=example, Dc= string, DC=com"))

            bool isValid = pc.ValidateCredentials(User, Password);

             if(isValid)
             {
                 Main m = new Main();
                 this.Close();
                 m.Show();
             }
             else
             {
                 MessageBox.Show("Invalid Username and/or Password","Error!");
                 textBox1.Clear();
                 textBox2.Clear();
                 textBox1.Focus();

             }

这给了我嵌入式语句的布尔错误。我尝试了从第二篇文章中读到的另一种方法,即使用仅验证用户名的代码:

         PrincipalContext pc = new PrincipalContext(ContextType.Domain, "LDAP://example.com/OU=Computers,OU=Users,dc=example,dc=com");

        UserPrincipal user = UserPrincipal.FindByIdentity(pc, "username");


        bool userExists = (user != null);

但我发现我无法使用此方法验证密码,因为UserPrincipal.FindByPassword不存在。

我也尝试过这种方式,但是.Password不存在:

 PrincipalContext pc = new PrincipalContext(ContextType.Domain,"LDAP://....");

        UserPrincipal qbeUser = new UserPrincipal(pc);
        qbeUser.EmployeeId = User;

        //.Password does not exist
        UserPrincipal qbePassword = new UserPrincipal(pc);
        qbePassword.Password = Password;

        // create your principal searcher passing in the QBE principal    
        PrincipalSearcher srchUser = new PrincipalSearcher(qbeUser);
         PrincipalSearcher srchPass = new PrincipalSearcher(qbePassword);
        // try to find that user and password
        UserPrincipal founduser = srchUser.FindOne() as UserPrincipal;
        UserPrincipal foundpass = srchPass.FindOne() as UserPrincipal;

        if (founduser != null)
        {
            if (foundpass != null)
            {
                Main m = new Main();
                this.Close();
                m.Show();
            }
            else
            {
                MessageBox.Show("Password Not Valid.");
                textBox2.Clear();
                textBox2.Focus();
            }
        }

        else
        {
            MessageBox.Show("Username Not Valid.");
            textBox1.Clear();
            textBox1.Focus();
        }

有人可以请指导我如何正确处理这个问题。

先感谢您。

4

1 回答 1

0

我已经这样做了,但没有使用 PrincipalContext。相反,我发现很多人都在努力使用该对象。

我的实现是一个 winforms 表单,提交按钮调用一个执行下面代码的 4 las 行的方法。

我针对这个宏伟的免费测试 LDAP 服务器进行了测试

var path = "LDAP://ldap.forumsys.com:389/dc=example,dc=com";
var user = $@"uid={username},dc=example,dc=com";
var pass = "password";

var directoryEntry = new DirectoryEntry(path, user, pass, AuthenticationTypes.None);

var searcher = new DirectorySearcher(directoryEntry);
searcher.PropertiesToLoad.Add("*");
var searchResult = searcher.FindOne();

我不完全理解所有这些行的作用。

重要提示

在路径上,“LDAP://”字符串应该在块 mayus 上。

在用户中,根据您使用“cn=username-admin”验证管理员的测试服务器,请务必将身份验证类型也设置为 ServerBind。

于 2018-10-30T19:47:01.247 回答