OU内使用LDAP的用户认证

本文关键字:用户 认证 LDAP OU | 更新日期: 2023-09-27 18:11:13

我正在尝试使用LDAP认证用户

我正在使用这个代码:

public bool IsAuthenticated(string domain, string username, string pwd)
{
DirectoryEntry nRoot = new DirectoryEntry("LDAP://192.134.1.142/dc=testDomain,dc=com");
nRoot.AuthenticationType = AuthenticationTypes.None;
nRoot.Username = "uid=username,dc=testDomain,DC=com";  //full dn
nRoot.Password = "pwd";
try
{ 
//Bind to the native AdsObject to force authentication.
Object obj = nRoot.NativeObject;
DirectorySearcher search = new DirectorySearcher(nRoot);
search.SearchScope = SearchScope.Subtree;
search.Filter = "uid=username";               
search.PropertiesToLoad.Add("uid");
SearchResult sr = search.FindOne();
if(null == sr )
{
  return false;
}
// Update the new path to the user in the directory
_path = sr.Path;
_filterAttribute = (String)result.Properties["uid"][0];
  }
 catch (Exception ex)
 {
 throw new Exception("Error authenticating user. " + ex.Message);
 }
 return true;
 }

这里,如果用户不是任何OU的一部分,代码运行正常,但如果它是OU的一部分,它将无法工作,并且会得到一个错误

System.Runtime.InteropServices.COMException在
//绑定本地AdsObject强制认证。Object Object = nRoot.NativeObject;

如何获得属于OU或任何其他组的用户验证??

我尝试硬编码OU,它工作,但我不能要求用户输入他的OU

 nRoot.Username = "uid=username,ou=test,dc=testDomain,DC=com";  //full dn

OU内使用LDAP的用户认证

string ldapsrv = "mydomain.com:389";
string dc_oq = "OU=domain_app_auth,DC=domain,DC=uk,DC=com";//,
user_nme = "username";
pws = "password";
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, ldapsrv, dc_oq, ContextOptions.Negotiate | ContextOptions.Negotiate))
{
    isValid = pc.ValidateCredentials(user_nme, pws);
}

您需要获取用户名,找到uid=username的对象,然后读取disishedname属性或返回对象的名称(这将是完整DN),并使用发现的完整DN登录。