查看用户是否属于C#+ Asp.net中Active Directory组的一部分

我需要一种方法来查看用户是否来自我的.net 3.5 asp.net c#应用程序的活动目录组的一部分。

我正在使用msdn的标准ldap身份validation示例,但我真的不知道如何检查一个组。

与3.5和System.DirectoryServices.AccountManagement这是一个更清洁一点:

public List<string> GetGroupNames(string userName) { var pc = new PrincipalContext(ContextType.Domain); var src = UserPrincipal.FindByIdentity(pc, userName).GetGroups(pc); var result = new List<string>(); src.ToList().ForEach(sr => result.Add(sr.SamAccountName)); return result; } 

Nick Craver的解决scheme在.NET 4.0中不适用于我。 我得到一个关于卸载AppDomain的错误。 我用这个(我们只有一个域),而不是使用它。 这将检查组的群组以及直接的组成员资格。

 using System.DirectoryServices.AccountManagement; using System.Linq; ... using (var ctx = new PrincipalContext(ContextType.Domain, yourDomain)) { using (var grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, yourGroup)) { bool isInRole = grp != null && grp .GetMembers(true) .Any(m => m.SamAccountName == me.Identity.Name.Replace(yourDomain + "\\", "")); } } 

下面的代码将在.net 4.0中工作

 private static string[] GetGroupNames(string userName) { List<string> result = new List<string>(); using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "YOURDOMAIN")) { using (PrincipalSearchResult<Principal> src = UserPrincipal.FindByIdentity(pc, userName).GetGroups(pc)) { src.ToList().ForEach(sr => result.Add(sr.SamAccountName)); } } return result.ToArray(); } 

最简单的解决scheme

 PrincipalContext pc = new PrincipalContext((Environment.UserDomainName == Environment.MachineName ? ContextType.Machine : ContextType.Domain), Environment.UserDomainName); GroupPrincipal gp = GroupPrincipal.FindByIdentity(pc, "{GroupName}"); UserPrincipal up = UserPrincipal.FindByIdentity(pc, Environment.UserName); up.IsMemberOf(gp); 

如果您尝试确定Windows身份validation的当前用户是否处于特定angular色,则此方法可能会有所帮助。

 public static bool CurrentUserIsInRole(string role) { try { return System.Web.HttpContext.Current.Request .LogonUserIdentity .Groups .Any(x => x.Translate(typeof(NTAccount)).ToString() == role); } catch (Exception) { return false; } } 

这取决于用户是否在AD组中时的含义。 在AD中,组可以是安全组或分发组。 即使对于安全组,也取决于“域用户”或“用户”等组是否需要包含在成员资格检查中。

IsUserInSecurityGroup将仅检查安全组,并且将适用于“Domain Users”和“Users”等主要组types,而不适用于通讯组。 它也将解决与嵌套组的问题。 IsUserInAllGroup也将检查通讯组,但我不确定是否会遇到权限问题。 如果是这样,请使用WAAG中的服务帐户( 请参阅MSDN )

我不使用UserPrincipal.GetAuthorizedGroups()的原因是因为它有很多问题,例如要求呼叫帐户在WAAG中,并且要求SidHistory中没有条目( 请参阅David Thomas的评论 )

 public bool IsUserInSecurityGroup(string user, string group) { return IsUserInGroup(user, group, "tokenGroups"); } public bool IsUserInAllGroup(string user, string group) { return IsUserInGroup(user, group, "tokenGroupsGlobalAndUniversal"); } private bool IsUserInGroup(string user, string group, string groupType) { var userGroups = GetUserGroupIds(user, groupType); var groupTokens = ParseDomainQualifiedName(group, "group"); using (var groupContext = new PrincipalContext(ContextType.Domain, groupTokens[0])) { using (var identity = GroupPrincipal.FindByIdentity(groupContext, IdentityType.SamAccountName, groupTokens[1])) { if (identity == null) return false; return userGroups.Contains(identity.Sid); } } } private List<SecurityIdentifier> GetUserGroupIds(string user, string groupType) { var userTokens = ParseDomainQualifiedName(user, "user"); using (var userContext = new PrincipalContext(ContextType.Domain, userTokens[0])) { using (var identity = UserPrincipal.FindByIdentity(userContext, IdentityType.SamAccountName, userTokens[1])) { if (identity == null) return new List<SecurityIdentifier>(); var userEntry = identity.GetUnderlyingObject() as DirectoryEntry; userEntry.RefreshCache(new[] { groupType }); return (from byte[] sid in userEntry.Properties[groupType] select new SecurityIdentifier(sid, 0)).ToList(); } } } private static string[] ParseDomainQualifiedName(string name, string parameterName) { var groupTokens = name.Split(new[] {"\\"}, StringSplitOptions.RemoveEmptyEntries); if (groupTokens.Length < 2) throw new ArgumentException(Resources.Exception_NameNotDomainQualified + name, parameterName); return groupTokens; } 

这似乎更简单:

 public bool IsInRole(string groupname) { var myIdentity = WindowsIdentity.GetCurrent(); if (myIdentity == null) return false; var myPrincipal = new WindowsPrincipal(myIdentity); var result = myPrincipal.IsInRole(groupname); return result; } 

这个怎么样

如何编写LDAP查询来testing用户是否是组的成员?

这是我的2美分。

  static void CheckUserGroup(string userName, string userGroup) { var wi = new WindowsIdentity(userName); var wp = new WindowsPrincipal(wi); bool inRole = wp.IsInRole(userGroup); Console.WriteLine("User {0} {1} member of {2} AD group", userName, inRole ? "is" : "is not", userGroup); } 

布兰登·约翰逊,喜欢它,我用你所拥有的,但做了以下改变:

 private static string[] GetGroupNames(string domainName, string userName) { List<string> result = new List<string>(); using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, domainName)) { using (PrincipalSearchResult<Principal> src = UserPrincipal.FindByIdentity(principalContext, userName).GetGroups(principalContext)) { src.ToList().ForEach(sr => result.Add(sr.SamAccountName)); } } return result.ToArray(); } 

你可以尝试下面的代码:

 public bool Check_If_Member_Of_AD_Group(string username, string grouptoCheck, string domain, string ADlogin, string ADpassword) {   try {       string EntryString = null;    EntryString = "LDAP://" + domain;       DirectoryEntry myDE = default(DirectoryEntry);       grouptoCheck = grouptoCheck.ToLower();          myDE = new DirectoryEntry(EntryString, ADlogin, ADpassword);       DirectorySearcher myDirectorySearcher = new DirectorySearcher(myDE);       myDirectorySearcher.Filter = "sAMAccountName=" + username;       myDirectorySearcher.PropertiesToLoad.Add("MemberOf");       SearchResult myresult = myDirectorySearcher.FindOne();       int NumberOfGroups = 0;       NumberOfGroups = myresult.Properties["memberOf"].Count - 1;       string tempString = null;       while ((NumberOfGroups >= 0)) {           tempString = myresult.Properties["MemberOf"].Item[NumberOfGroups];      tempString = tempString.Substring(0, tempString.IndexOf(",", 0));           tempString = tempString.Replace("CN=", "");           tempString = tempString.ToLower();      tempString = tempString.Trim();           if ((grouptoCheck == tempString)) {                        return true;      }                  NumberOfGroups = NumberOfGroups - 1;    }            return false;  }  catch (Exception ex) {       System.Diagnostics.Debugger.Break();  }  //HttpContext.Current.Response.Write("Error: <br><br>" & ex.ToString) } 
 var context = new PrincipalContext(ContextType.Domain, {ADDomain}, {ADContainer}); var group = GroupPrincipal.FindByIdentity(context, IdentityType.Name, {AD_GROUP_NAME}); var user = UserPrincipal.FindByIdentity(context, {login}); bool result = user.IsMemberOf(group); 

如果要检查用户组成员资格(包括间接链接到用户父组的组嵌套组),可以尝试使用“tokenGroups”属性,如下所示:

使用System.DirectoryServices

 公共静态布尔IsMemberOfGroupsToCheck(stringDomainServer,stringLoginID,stringLoginPassword)
         {
            stringUserDN =“CN = John.Doe-A,OU =pipe理帐户,OU =用户目录,DC = ABC,DC = com”
            stringADGroupsDNToCheck =“CN = ADGroupTocheck,OU =pipe理组,OU =组目录,DC = ABC,DC = com”;

             byte [] sid,parentSID;
            布尔检查=假;
             DirectoryEntry parentEntry;
             DirectoryEntry baseChildEntry;
            stringoctetSID;

                 basechildEntry = new DirectoryEntry(“LDAP://”+ DomainServer +“/”+ UserDN,LoginID,LoginPassword);
                 basechildEntry.RefreshCache(new String [] {“tokenGroups”});

                 parentEntry = new DirectoryEntry(“LDAP://”+ DomainServer +“/”+ ADGroupsDNToCheck,LoginID,LoginPassword);
                 parentSID =(byte [])parentEntry.Properties [“objectSID”]。
                 octetSID = ConvertToOctetString(parentSID,false,false);

                 foreach(baseChildEntry.Properties [“tokenGroups”]中的Object GroupSid)
                 {
                     sid =(byte [])GroupSid;
                     if(ConvertToOctetString(sid,false,false)== octetSID)
                     {
                         check = true;
                        打破;
                     }
                 }

                 basechildEntry.Dispose();
                 parentEntry.Dispose();

                退货支票;
         }