查看用户是否属于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(); 退货支票; }