我想只登录一个特定的OU,但不能登录以前的OU。
我的父母职能是:
if (Autentificado("LDAP://localhost/DC=ic,DC=enterprise,DC=us", user, pass, "cn=SpecificPeople,ou=Users,ou=Aplications,dc=ic,dc=enterprise,dc=us") != "")
{
return "OK";
}
它包含服务器方向,包含path,user,pass和“memberof”过滤器的字符串:
public static string Autentificado(string ldap, string usr, string pwd,string member)
{
try
{
DirectoryEntry entry = new DirectoryEntry(ldap, usr, pwd);
DirectorySearcher search = new DirectorySearcher(entry)
{
Filter = "(&(objectCategory=person)(memberof=" + member + "))"
};
search.PropertiesToLoad.Add("sn");
SearchResult result = search.FindOne();
return result.Properties["sn"][0].ToString();
}
catch (DirectoryServicesCOMException cex)
{
Console.WriteLine(cex);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
return "";
}
它返回“OU = Users”的正确用户,但它返回其他OU或DC的用户。我希望人们只能登录“OU = Users”。
提前致谢。
更新1: 我认为问题在于我的LDAP结构和DirectorySearcher的过滤器:
DC=US
-DC=enterprise
-DC=ic
-OU=Apps
-OU=1
-OU=2
-OU=USERS
如果我使用: SearchScope.Subtree ,它会在所有目录中搜索。 SearchScope.OneLevel ,它会在DC = enterprise或所有OU = Apps中搜索(如果我没错。) SearchScope.Base ,它在DC = US中搜索。
我希望搜索只能在 OU = USERS 中进行,而不是在其他目录中进行(OU = 1,OU = 2)。
更新2
我的GETUSER功能是:
DirectoryEntry usercheck = GetUser(user, pass,"LDAP://someIP:389/CN=qualifiers,OU=USERS,OU=Aplications,DC=ic,DC=enterprise,DC=us");
在“DirectoryEntry searchRoot”中,我需要设置用户和密码才能输入LDAP。如果没有,它会带我错误:
using (DirectoryEntry searchRoot = new DirectoryEntry(rootWeAreLooking,"ic\\"+userName,pass, AuthenticationTypes.None))
我发现这可能有效,但它会搜索 OU = Aplications 的所有目录。
我认为我需要按 CN = qualifiers 过滤,但我不知道如何。
更新3
我需要正确尝试,但我认为我做了正确的过滤器:
searcher.Filter = String.Format("(&(objectCategory=person)(memberof=CN=qualifiers,OU=USERS,OU=Aplications,DC=ic,DC=enterprise,DC=us)(sAMAccountName={0}))", userName);
答案 0 :(得分:3)
所以我刚刚创建了这个代码来完成你想要的东西。我将代码拆分为多个方法,因此您可以使用其他单个函数,例如ValidateUser
其他。
如果一切顺利,用户就在OU=USER
(在您的情况下),密码也是正确的
private void TestTheMethods()
{
//Search for the user, in the ou "user"
DirectoryEntry user = GetUser("FirstName LastName","FullOrganisationUnitPath");
//Found user?
if (user == null) { return; }
//ValidateUser
if (!ValidateUser(user, "userPassword")) { return; }
}
public DirectoryEntry GetUser(string userName, string rootWeAreLooking = "")
{
DirectoryEntry user = null;
using(DirectoryEntry searchRoot = new DirectoryEntry(rootWeAreLooking))
using(DirectorySearcher searcher = new DirectorySearcher(searchRoot))
{
searcher.Filter = String.Format("(&(objectCategory=person)(cn={0}))",userName);
//searcher.SearchScope = SearchScope.Subtree;
//SearchScope.Subtree --> Search in all nested OUs
//SearchScope.OneLevel --> Search in the Ou underneath
//SearchScope.Base --> Search in the current OU
search.SearchScope = SearchScope.OneLevel;
SearchResult result = searcher.FindOne();
if (result == null) { return null; }
//Found user
return result.GetDirectoryEntry();
}
}
public Boolean ValidateUser(DirectoryEntry entry, string pwd)
{
Boolean isValid = false;
try
{
DirectoryEntry validatedUser = new DirectoryEntry(entry.Path, entry.Name.Remove(0,3), pwd);
//Check if we can access the Schema
var Name = validatedEntry.SchemaEntry;
//User exits, username is correct and password is accepted
isValid = true;
}
catch(DirectoryServicesCOMException ex)
{
isValid = false;
///User wrong? wrong password?
}
return isValid;
}
答案 1 :(得分:1)
最后,我做了这个过滤器,并为我工作:
searcher.Filter = String.Format("(&(objectCategory=person)(memberof=CN=qualifiers,OU=USERS,OU=Aplications,DC=ic,DC=enterprise,DC=us)(sAMAccountName={0}))", userName);
在我的LDAP路径中,我放了根路径目录
DC=ic,DC=enterprise,DC=us