私は c# と LDAP にまったく慣れていません。このプロジェクトを行っているので、より実践的なアプローチでそれらについて学ぶことができます。
私が作成しようとしているのは、ユーザーが LDAP を使用して Active Directory から入力した後にユーザー名とパスワードを認証するログイン クリック イベントを持つログイン フォームです。
この主題をよりよく理解できるように、Managing Directory Security Principals in the .NET Framework 3.5を読んだことがあります。また、検証自体を扱う同様のトピックもここで確認しました ( c# - Validate a username and password against Active Directory? ) およびこれはユーザー名を認証します ( LDAP を介した Active Directory に対する c# )
最初にリンクされたトピックから、次のコードがユーザー名とパスワードを認証するトリックを実行する必要があることを学びました。
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();
}
埋め込みステートメントのブールエラーが発生しています。ユーザー名のみを認証するこのコードを使用するという 2 番目の投稿から読んだ別のアプローチを試しました。
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();
}
誰かがこれに正しくアプローチする方法を教えてください。
前もって感謝します。