如何在 C# .NET for ASP 中从 LDAP 活动目录中获取用户的用户组。在我的场景中,我想将用户名传递给从 LDAP 活动目录查询的方法,并告诉我我的用户是该用户组的成员。请帮助我
6 回答
如果您使用的是 .NET 3.5 或更高版本,您还可以使用新的System.DirectoryServices.AccountManagement
(S.DS.AM) 命名空间。
有了这个,您可以执行以下操作:
// create context for domain
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
// find the user
UserPrincipal up = UserPrincipal.FindByIdentity(ctx, "YourUserName");
if(up != null)
{
// get groups for that user
var authGroups = up.GetAuthorizationGroups();
}
阅读有关新的 S.DS.AM 命名空间的更多信息:
尝试这个...
public override string[] GetRolesForUser(string username)
{
var allRoles = new List<string>();
var root = new DirectoryEntry(WebConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString,
ConnectionUsername,
ConnectionPassword);
var searcher = new DirectorySearcher(root,
string.Format(CultureInfo.InvariantCulture, "(&(objectClass=user)({0}={1}))",
AttributeMapUsername,
username));
searcher.PropertiesToLoad.Add("memberOf");
SearchResult result = searcher.FindOne();
if (result != null && !string.IsNullOrEmpty(result.Path))
{
DirectoryEntry user = result.GetDirectoryEntry();
PropertyValueCollection groups = user.Properties["memberOf"];
foreach (string path in groups)
{
string[] parts = path.Split(',');
if (parts.Length > 0)
{
foreach (string part in parts)
{
string[] p = part.Split('=');
if (p[0].Equals("cn", StringComparison.OrdinalIgnoreCase))
{
allRoles.Add(p[1]);
}
}
}
}
}
return allRoles.ToArray();
}
研究使用System.DirectoryServices命名空间。您可以使用DirectorySearcher来查找用户。一旦您拥有该用户的DirectoryEntry对象,请执行以下操作:
public List<string> GetMemberOf(DirectoryEntry de)
{
List<string> memberof = new List<string>();
foreach (object oMember in de.Properties["memberOf"])
{
memberof.Add(oMember.ToString());
}
return memberof;
}
这将返回一个字符串列表,这些字符串是用户所属的组名。
当然,您可以进一步改进它以包含 DirectorySearcher 代码,这样您就可以将函数传递给 samAccountName。
我需要一种对用户进行身份验证的方法,并检查他们是否在特定的用户组中。我通过推送用户名和密码并将“memberOf”属性加载到“搜索”实例中来做到这一点。下面的示例将显示该特定用户名的所有组。'catch' 语句将捕获错误的用户名或密码。
DirectoryEntry entry = new DirectoryEntry("LDAP://xxxxxxxx/OU=xxxxxxx,DC=xxxxxx,DC=xxxxx,DC=xxxxxx", strLdapUserName, strLdapPassword);
try
{
//the object is needed to fire off the ldap connection
object obj = entry.NativeObject;
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + strLdapUserName + ")";
search.PropertiesToLoad.Add("memberOf");
SearchResult result = search.FindOne();
string filterAttribute = (String)result.Properties["cn"][0];
foreach(string groupMemberShipName in result.Properties["memberOf"])
{
Console.WriteLine("Member of - {0}", groupMemberShipName);
}
}
catch (Exception ex)
{
//failed to authenticate
throw new Exception(ex.ToString());
}
希望这可以帮助。(记得参考 System.DirectoryServices)
我认为上面列出的大多数方法都应该有效,但我建议添加代码以确保您的代码可以“检测嵌套组成员资格中的循环循环”,如果发现,打破您选择的脚本可能进入的任何无限循环。