2017-03-06 95 views
0

我的登录窗口使用LDAP对用户进行身份验证。但是,在验证时,它总是返回false。wpf - 验证时LDAP始终返回false

下面是验证代码,我从CodeProject上了:

public bool fnValidateUser() 
    { 
     bool validation; 
     try 
     { 
      LdapConnection lcon = new LdapConnection 
        (new LdapDirectoryIdentifier((string)null, false, false)); 
      NetworkCredential nc = new NetworkCredential(Environment.UserName, 
            txtPassword.SecurePassword, Environment.UserDomainName); 
      lcon.Credential = nc; 
      lcon.AuthType = AuthType.Negotiate; 
      // user has authenticated at this point, 
      // as the credentials were used to login to the dc. 
      lcon.Bind(nc); 
      validation = true; 
     } 
     catch (LdapException) 
     { 
      validation = false; 
     } 
     return validation; 
    } 

txtPassword.SecurePassword是PasswordBox。当我输入我的密码/ PIN并点击登录时,只要验证为false,它就会显示MessageBox。

我在做什么错?

UPDATE:的异常指示“的LDAP服务器不可用”,在这条线lcon.Bind(nc);

+0

添加一个日志来捕捉异常,以及你作为异常得到了什么? – Dinesh

+0

@Dinesh我刚刚添加了它 – bruh1234

+0

根据此例外情况,您的LDAP服务器已关闭或根本没有连接。 – Dinesh

回答

0

我继续前进,发现了另一种方法,不使用LDAP。

PrincipalContext adContext = new PrincipalContext(ContextType.Machine); 
private async void btnLogin_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      using (adContext) 
      { 
       if (adContext.ValidateCredentials(txtUsername.Text, txtPassword.Password)) 
       { 
        MainWindow main = new MainWindow(); 

        main.Show(); 
        main.txtLoggedInUser.Text = UserPrincipal.Current.DisplayName; 

        this.Close(); 
       } 
       else 
       { 
        MessageBox.Show("Incorrect Username or Password!"); 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      var exceptionDialog = new MessageDialog 
      { 
       Message = { Text = ex.ToString() } 
      }; 

      await DialogHost.Show(exceptionDialog, "RootDialog"); 
     } 
    } 
0

你可以试试这个代码样片。

// the username and password to authenticate 
const string domain = "OU=Organization,DC=mydomain,DC=com"; 
string password = "mypass"; 
string userName = "myuser"; 

// define your connection 
LdapConnection ldapConnection = new LdapConnection("ldap.mydomain.com:389"); 

try 
{ 
    // authenticate the username and password 
    using (ldapConnection) 
    { 
     // pass in the network creds, and the domain. 
     var networkCredential = new NetworkCredential(username, password, domain); 

     // if we're using unsecured port 389, set to false. If using port 636, set this to true. 
     ldapConnection.SessionOptions.SecureSocketLayer = false; 

     // since this is an internal application, just accept the certificate either way 
     ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; }; 

     // to force NTLM\Kerberos use AuthType.Negotiate, for non-TLS and unsecured, just use AuthType.Basic 
     ldapConnection.AuthType = AuthType.Basic; 

     // authenticate the user 
     ldapConnection.Bind(networkCredential); 
    } 
    catch (LdapException ldapException) 
    { 
     //Authentication failed, exception will dictate why 
    } 
} 
+0

域和LdapConnection在用户PC上安装时需要动态。我应该用Environment.UserDomainName替换字符串吗? – bruh1234

+0

尝试硬编码值,并确保工作正常,然后您可以将其替换为动态值。 – Dinesh