Wenn Sie mit .NET 3.5 oder höher arbeiten, können Sie das neue verwenden System.DirectoryServices.AccountManagement
höher arbeiten Namespace (S.DS.AM) verwenden, was dies viel einfacher macht als früher.
Lesen Sie hier alles darüber: Verwalten von Verzeichnissicherheitsprinzipalen in .NET Framework 3.5
Update: Ältere Artikel des MSDN-Magazins sind leider nicht mehr online - das müssen Sie das CHM für das MSDN-Magazin vom Januar 2008 von Microsoft herunterladen und den Artikel dort lesen.
Grundsätzlich benötigen Sie einen "Hauptkontext" (normalerweise Ihre Domain), einen Benutzerprinzipal, und dann erhalten Sie seine Gruppen sehr einfach:
public List<GroupPrincipal> GetGroups(string userName)
{
List<GroupPrincipal> result = new List<GroupPrincipal>();
// establish domain context
PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain);
// find your user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName);
// if found - grab its groups
if(user != null)
{
PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups();
// iterate over all groups
foreach(Principal p in groups)
{
// make sure to add only group principals
if(p is GroupPrincipal)
{
result.Add((GroupPrincipal)p);
}
}
}
return result;
}
und das ist alles was es gibt! Sie haben jetzt ein Ergebnis (eine Liste) von Berechtigungsgruppen, zu denen der Benutzer gehört - iterieren Sie über sie, drucken Sie ihre Namen aus oder was auch immer Sie tun müssen.
Update: Um auf bestimmte Eigenschaften zuzugreifen, die auf dem UserPrincipal
Objekt nicht angezeigt werden, müssen Sie sich mit dem zugrunde liegenden Objekt befassen DirectoryEntry
:
public string GetDepartment(Principal principal)
{
string result = string.Empty;
DirectoryEntry de = (principal.GetUnderlyingObject() as DirectoryEntry);
if (de != null)
{
if (de.Properties.Contains("department"))
{
result = de.Properties["department"][0].ToString();
}
}
return result;
}
Update Nr. 2: Es sollte nicht allzu schwierig sein, diese beiden Codeausschnitte zusammenzufügen ... aber ok - hier ist es:
public string GetDepartment(string username)
{
string result = string.Empty;
// if you do repeated domain access, you might want to do this *once* outside this method,
// and pass it in as a second parameter!
PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain);
// find the user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, username);
// if user is found
if(user != null)
{
// get DirectoryEntry underlying it
DirectoryEntry de = (user.GetUnderlyingObject() as DirectoryEntry);
if (de != null)
{
if (de.Properties.Contains("department"))
{
result = de.Properties["department"][0].ToString();
}
}
}
return result;
}
UserPrincipal
- siehe meine aktualisierte Antwort, wie man darauf kommt.GetAuthorizationGroups()
findet keine verschachtelten Gruppen. Versuchen Sie Folgendes, um wirklich alle Gruppen zu erhalten, zu denen ein bestimmter Benutzer gehört (einschließlich verschachtelter Gruppen):Ich benutze,
try/catch
weil ich einige Ausnahmen mit 2 von 200 Gruppen in einer sehr großen AD hatte, weil einige SIDs nicht mehr verfügbar waren. (DerTranslate()
Aufruf führt eine SID -> Namenskonvertierung durch.)quelle
Erstens ist GetAuthorizationGroups () eine großartige Funktion, hat aber leider zwei Nachteile:
Daher habe ich eine kleine Funktion geschrieben, um GetAuthorizationGroups () durch bessere Leistung und Fehlersicherheit zu ersetzen. Es wird nur 1 LDAP-Aufruf mit einer Abfrage unter Verwendung indizierter Felder ausgeführt. Es kann leicht erweitert werden, wenn Sie mehr Eigenschaften als nur die Gruppennamen benötigen ("cn" -Eigenschaft).
quelle
Innerhalb des AD hat jeder Benutzer eine Eigenschaft
memberOf
. Diese enthält eine Liste aller Gruppen, denen er angehört.Hier ist ein kleines Codebeispiel:
quelle
In meinem Fall konnte ich GetGroups () nur dann ohne Erwartung verwenden, wenn ich den Benutzer (USER_WITH_PERMISSION) zu der Gruppe hinzufügte, die zum Lesen des AD (Active Directory) berechtigt ist. Es ist äußerst wichtig, den PrincipalContext zu erstellen, der diesen Benutzer und dieses Kennwort übergibt.
Schritte, die Sie in Active Directory ausführen können, damit es funktioniert:
quelle
Das funktioniert bei mir
quelle
Die Antwort hängt davon ab, welche Art von Gruppen Sie abrufen möchten. Der
System.DirectoryServices.AccountManagement
Namespace bietet zwei Methoden zum Abrufen von Gruppen:So
GetGroups
bekommt alle Gruppen, die der Benutzer ist ein direktes Mitglied undGetAuthorizationGroups
erhält alle Berechtigungsgruppen , von denen die Nutzer sind direkt oder indirekt Mitglied.Trotz der Art und Weise, wie sie benannt werden, ist eine keine Teilmenge der anderen. Es kann Gruppen geben, die von
GetGroups
nicht zurückgegeben werdenGetAuthorizationGroups
, und umgekehrt.Hier ist ein Anwendungsbeispiel:
quelle
Meine Lösung:
quelle
Falls Translate lokal funktioniert, aber nicht remote ei group. Übersetzen (typeof (NTAccount)
Wenn Sie möchten, dass der Anwendungscode mit der Identität LOGGED IN USER ausgeführt wird, aktivieren Sie den Identitätswechsel. Der Identitätswechsel kann über IIS oder durch Hinzufügen des folgenden Elements in der web.config aktiviert werden .
Wenn der Identitätswechsel aktiviert ist, wird die Anwendung mit den in Ihrem Benutzerkonto enthaltenen Berechtigungen ausgeführt. Wenn der angemeldete Benutzer Zugriff auf eine bestimmte Netzwerkressource hat, kann er nur dann über die Anwendung auf diese Ressource zugreifen.
Vielen Dank an PRAGIM Tech für diese Informationen aus seinem sorgfältigen Video
Windows-Authentifizierung in asp.net Teil 87:
https://www.youtube.com/watch?v=zftmaZ3ySMc
Der Identitätswechsel verursacht jedoch viel Overhead auf dem Server
Die beste Lösung, um Benutzern bestimmter Netzwerkgruppen zu erlauben, besteht darin, anonym in der Webkonfiguration zu verweigern
<authorization><deny users="?"/><authentication mode="Windows"/>
Verwenden Sie in Ihrem Code dahinter, vorzugsweise in der Datei global.asax, die Datei HttpContext.Current.User.IsInRole :
HINWEIS: Die Gruppe muss mit einem Backslash geschrieben werden, dh "TheDomain \ TheGroup".
quelle