c # - Kontroller, om brugeren er medlem af en gruppe

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en kode for at kontrollere, om brugeren er medlem af en gruppe.
Jeg bruger dette ved mit login.


Bemærk venligst, at jeg har en domænebruger og lokal bruger f.eks. testdomainadministrator og administrator.


Dette er koden jeg bruger:


using (DirectoryEntry groupEntry = new DirectoryEntry("WinNT://./" + userGroupName + ",group"))
{
    foreach (object member in (IEnumerable)groupEntry.Invoke("Members"))
    {
        using (DirectoryEntry memberEntry = new DirectoryEntry(member))
        {
            string completeName = memberEntry.Name;
            DirectoryEntry domainValue = GUIUtility.FindDomain(memberEntry);
            if (domainValue != null)
            {
                completeName = domainValue.Name + "\" + memberEntry.Name;
            }
            Global.logger.Info("completeName from " + userGroupName + " = " + completeName);
            if (userName.Equals(completeName, StringComparison.InvariantCultureIgnoreCase))
            {
                Global.logger.Debug("IsUserPartOfWindowsGroup returned True with username =" + userName + " , UserGroupName = " + userGroupName);
                return true;
            }
        }
    }
    Global.logger.Debug("IsUserPartOfWindowsGroup returned false for username =" + userName + " , UserGroupName = " + userGroupName);
    return false;
}


Denne kode fungerer, men


DirectoryEntry domainValue = GUIUtility.FindDomain(memberEntry);


tager meget tid i profilerne, som jeg ser det. Er der en bedre/hurtigere måde at håndtere dette på?


public static DirectoryEntry FindDomain(DirectoryEntry memberEntry)
{
    if (memberEntry.Parent != null)
    {
        if (memberEntry.Parent.SchemaClassName.Equals("domain", StringComparison.InvariantCultureIgnoreCase))
        {
            return memberEntry.Parent;
        }
    }
    return null;
}


anden måde:


DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, userName, Password);
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.Filter = "(&(objectClass=user)(|(cn=" + userName + ")(sAMAccountName=" + userName + ")))";
SearchResult result = mySearcher.FindOne();

Global.logger.Info("result == " + result.Path);
foreach (string GroupPath in result.Properties["memberOf"])
{
    if (GroupPath.Contains(adminGroupName))
    {
        Global.logger.Info(compUsrNameForEncryption + "exists in " + adminGroupName);
    }
}

Bedste reference


Dette er temmelig tæt på det, jeg bruger:


public bool IsUserInGroup(string userName, string groupName)
{
    using (var context = new PrincipalContext(ContextType.Machine))
    {
        using (var searcher = new PrincipalSearcher(new UserPrincipal(context) { SamAccountName = userName }))
        {
            using (var user = searcher.FindOne() as UserPrincipal)
            {
                return user != null && user.IsMemberOf(context, IdentityType.SamAccountName, groupName);
            }
        }
    }
}


Jeg har ikke testet det for lokale brugere selv. Logikken fungerer på mit domæne, jeg har lige ændret PrincipalContext(ContextType.Machine), så det burde se på lokale brugere nu.


Glem ikke at tilføje en henvisning og bruge erklæring til System.DirectoryServices.AccountManagement

Andre referencer 1


Måske mangler jeg noget, men kan du ikke bare gøre:


if(Page.User.IsInRole("GROUP NAME"))
{
    // user is in group. do your thing
}
else
{
    // user isn't in group
}


Fungerer for mig, når jeg gør Active Directory-godkendelse på ASP.NET.


EDIT: Her er et link der beskriver Page.User.IsInRole (). Windows-godkendelse skal bruges, men hvis du ikke bruger Windows-godkendelse, vil den ikke fungere korrekt. [12]


EDIT2: Da der ikke bruges Windows-godkendelse, er det sådan, jeg ville gøre det:


DirectoryEntry de = new DirectoryEntry(LDAP Address,user,password);
DirectorySearcher searcher = new DirectorySearcher(de);
searcher.Filter = string.Format("(SAMAccountName={0})", user);
SearchResult result = searcher.FindOne();
bool isInGroup = false;
if (result != null)
{
    DirectoryEntry person = result.GetDirectoryEntry();
    PropertyValueCollection groups = person.Properties["memberOf"];
    foreach (string g in groups)
    {
        if(g.Equals(groupName))
        {
           isInGroup = true;
           break;
        }
    }
}
return isInGroup;