Jika Anda menggunakan .NET 3.5 atau lebih tinggi, Anda dapat menggunakan System.DirectoryServices.AccountManagement
namespace (S.DS.AM) baru yang membuat ini jauh lebih mudah daripada sebelumnya.
Baca semuanya di sini: Mengelola Prinsip Keamanan Direktori di .NET Framework 3.5
Pembaruan: Sayangnya, artikel majalah MSDN lama tidak lagi online - Anda harus mengunduh CHM untuk majalah MSDN Januari 2008 dari Microsoft dan membaca artikel di sana.
Pada dasarnya, Anda perlu memiliki "konteks utama" (biasanya domain Anda), prinsip pengguna, dan kemudian Anda mendapatkan grupnya dengan sangat mudah:
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;
}
dan hanya itu yang ada! Anda sekarang memiliki hasil (daftar) dari grup otorisasi milik pengguna - mengulanginya, mencetak nama mereka atau apa pun yang perlu Anda lakukan.
Pembaruan: Untuk mengakses properti tertentu, yang tidak muncul pada UserPrincipal
objek, Anda perlu menggali yang mendasarinya 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;
}
Pembaruan # 2: tampaknya seharusnya tidak terlalu sulit untuk menyatukan kedua cuplikan kode ini .... tapi ok - ini dia:
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
- lihat jawaban saya yang diperbarui untuk mengetahui cara mendapatkannya.GetAuthorizationGroups()
tidak menemukan grup bertingkat. Untuk benar-benar mendapatkan semua grup tempat pengguna tertentu adalah anggotanya (termasuk grup bertingkat), coba ini:Saya menggunakan
try/catch
karena saya memiliki beberapa pengecualian dengan 2 dari 200 grup di AD yang sangat besar karena beberapa SID tidak lagi tersedia. (Translate()
Panggilan melakukan SID -> Konversi nama.)sumber
Pertama-tama, GetAuthorizationGroups () adalah fungsi yang hebat tetapi sayangnya memiliki 2 kelemahan:
Oleh karena itu, saya telah menulis sebuah fungsi kecil untuk menggantikan GetAuthorizationGroups () dengan kinerja yang lebih baik dan aman dari kesalahan. Itu hanya melakukan 1 panggilan LDAP dengan kueri menggunakan bidang yang diindeks. Ini dapat dengan mudah diperpanjang jika Anda membutuhkan lebih banyak properti daripada hanya nama grup (properti "cn").
sumber
Dalam AD setiap pengguna memiliki properti
memberOf
. Ini berisi daftar semua grup yang dia ikuti.Berikut adalah contoh kode kecil:
sumber
Dalam kasus saya, satu-satunya cara agar saya dapat tetap menggunakan GetGroups () tanpa ekspresi apa pun adalah menambahkan pengguna (USER_WITH_PERMISSION) ke grup yang memiliki izin untuk membaca AD (Active Directory). Sangat penting untuk membangun PrincipalContext dengan meneruskan pengguna dan kata sandi ini.
Langkah-langkah yang dapat Anda ikuti di dalam Active Directory untuk membuatnya berfungsi:
sumber
Ini berhasil untuk saya
sumber
Jawabannya tergantung pada jenis grup yang ingin Anda ambil. The
System.DirectoryServices.AccountManagement
namespace menyediakan dua metode pengambilan kelompok:Jadi
GetGroups
dapatkan semua grup di mana pengguna adalah anggota langsung , danGetAuthorizationGroups
dapatkan semua grup otorisasi di mana pengguna adalah anggota langsung atau tidak langsung .Terlepas dari cara mereka diberi nama, yang satu bukanlah bagian dari yang lain. Mungkin ada rombongan yang dikembalikan oleh
GetGroups
tidak dikembalikan olehGetAuthorizationGroups
, begitu pula sebaliknya.Berikut contoh penggunaan:
sumber
Solusi saya:
sumber
Jika Terjemahan berfungsi secara lokal tetapi tidak secara remote grup.Terjemahan (typeof (NTAccount)
Jika Anda ingin kode aplikasi dijalankan menggunakan identitas LOGGED IN USER, aktifkan peniruan identitas. Peniruan identitas dapat diaktifkan melalui IIS atau dengan menambahkan elemen berikut di web.config .
Jika peniruan identitas diaktifkan, aplikasi dijalankan menggunakan izin yang ditemukan di akun pengguna Anda. Jadi jika pengguna yang masuk memiliki akses, ke sumber daya jaringan tertentu, hanya dengan demikian ia dapat mengakses sumber daya itu melalui aplikasi.
Terima kasih PRAGIM tech untuk informasi ini dari videonya yang rajin
Otentikasi Windows di asp.net Bagian 87:
https://www.youtube.com/watch?v=zftmaZ3ySMc
Tetapi peniruan identitas menciptakan banyak biaya tambahan di server
Solusi terbaik untuk memungkinkan pengguna grup jaringan tertentu adalah menolak anonim di konfigurasi web
<authorization><deny users="?"/><authentication mode="Windows"/>
dan di belakang kode Anda, sebaiknya di global.asax, gunakan HttpContext.Current.User.IsInRole :
CATATAN: Grup harus ditulis dengan garis miring terbalik \ ie "TheDomain \ TheGroup"
sumber