Jeśli korzystasz z platformy .NET 3.5 lub System.DirectoryServices.AccountManagement
nowszej , możesz użyć nowej przestrzeni nazw (S.DS.AM), która znacznie ułatwia to niż dawniej.
Przeczytaj wszystko na ten temat tutaj: Managing Directory Security Principals w .NET Framework 3.5
Aktualizacja: starsze artykuły z magazynu MSDN nie są już dostępne online, niestety - musisz pobrać CHM dla magazynu MSDN ze stycznia 2008 od firmy Microsoft i przeczytać tam artykuł.
Zasadniczo musisz mieć „główny kontekst” (zwykle jest to Twoja domena), nazwę użytkownika, a wtedy możesz bardzo łatwo uzyskać jego grupy:
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;
}
i to wszystko! Masz teraz wynik (listę) grup autoryzacji, do których należy użytkownik - iteruj po nich, wydrukuj ich nazwy lub cokolwiek musisz zrobić.
Aktualizacja: Aby uzyskać dostęp do niektórych właściwości, które nie są widoczne na UserPrincipal
obiekcie, musisz zagłębić się w podłoże 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;
}
Aktualizacja nr 2: wydaje się, że nie powinno być zbyt trudno połączyć te dwa fragmenty kodu ... ale ok - gotowe:
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
- zobacz moją zaktualizowaną odpowiedź, aby dowiedzieć się, jak to zrobić.GetAuthorizationGroups()
nie znajduje zagnieżdżonych grup. Aby naprawdę uzyskać wszystkie grupy, których członkiem jest dany użytkownik (w tym grupy zagnieżdżone), spróbuj tego:Używam,
try/catch
ponieważ miałem kilka wyjątków z 2 z 200 grup w bardzo dużej reklamie, ponieważ niektóre identyfikatory SID nie były już dostępne. (Translate()
Wywołanie wykonuje konwersję SID -> Nazwa).źródło
Przede wszystkim GetAuthorizationGroups () to świetna funkcja, ale niestety ma 2 wady:
Dlatego napisałem małą funkcję, aby zastąpić GetAuthorizationGroups () lepszą wydajnością i bezpieczną dla błędów. Wykonuje tylko 1 wywołanie LDAP z zapytaniem przy użyciu indeksowanych pól. Można ją łatwo rozszerzyć, jeśli potrzebujesz więcej właściwości niż tylko nazwy grup (właściwość „cn”).
źródło
W usłudze AD każdy użytkownik ma właściwość
memberOf
. Zawiera listę wszystkich grup, do których należy.Oto mały przykład kodu:
źródło
W moim przypadku jedynym sposobem, w jaki mogłem nadal używać GetGroups () bez żadnych wyjaśnień, było dodanie użytkownika (USER_WITH_PERMISSION) do grupy, która ma uprawnienia do odczytu AD (Active Directory). Niezwykle istotne jest, aby skonstruować PrincipalContext przekazujący tego użytkownika i hasło.
Kroki, które możesz wykonać w usłudze Active Directory, aby to działało:
źródło
To działa dla mnie
źródło
Odpowiedź zależy od rodzaju grup, które chcesz odzyskać. Przestrzeń
System.DirectoryServices.AccountManagement
nazw udostępnia dwie metody pobierania grup:GetGroups
Pobiera więc wszystkie grupy, których użytkownik jest bezpośrednim członkiem, orazGetAuthorizationGroups
wszystkie grupy uprawnień , do których użytkownik jest bezpośredni lub pośredni członkiem.Pomimo sposobu, w jaki są nazywane, jeden nie jest podzbiorem drugiego. Mogą istnieć grupy zwrócone przez
GetGroups
nie zwrócone przezGetAuthorizationGroups
i odwrotnie.Oto przykład użycia:
źródło
Moje rozwiązanie:
źródło
W przypadku, gdy Tłumacz działa lokalnie, ale nie zdalnie ei group. Przetłumacz (typeof (NTAccount)
Jeśli chcesz, aby kod aplikacji był wykonywany przy użyciu tożsamości LOGGED IN USER, włącz personifikację. Personifikację można włączyć za pośrednictwem usług IIS lub przez dodanie następującego elementu w pliku web.config .
Jeśli personifikacja jest włączona, aplikacja jest wykonywana przy użyciu uprawnień znajdujących się na koncie użytkownika. Jeśli więc zalogowany użytkownik ma dostęp do określonego zasobu sieciowego, tylko wtedy będzie mógł uzyskać dostęp do tego zasobu za pośrednictwem aplikacji.
Podziękuj technikowi PRAGIM za te informacje z jego starannego filmu
Uwierzytelnianie systemu Windows w asp.net część 87:
https://www.youtube.com/watch?v=zftmaZ3ySMc
Jednak podszywanie się pod inne osoby wiąże się z dużym obciążeniem serwera
Najlepszym rozwiązaniem pozwalającym użytkownikom niektórych grup sieciowych jest odmowa anonimowości w konfiguracji sieciowej
<authorization><deny users="?"/><authentication mode="Windows"/>
aw swoim kodzie z tyłu, najlepiej w global.asax, użyj HttpContext.Current.User.IsInRole :
UWAGA: Grupa musi być zapisana z odwrotnym ukośnikiem \ tj. „TheDomain \ TheGroup”
źródło