Ingin menggunakan akun layanan untuk terhubung ke AD tempat aplikasi saya berjalan

Dalam aplikasi MVC-5 saya, saya menambahkan/mengedit pengguna di direktori aktif melalui aplikasi saya. Setiap kali saya membuat perubahan di AD, setiap kali saya harus meneruskan ldapUserName(Admin) dan ldapPassword(pass@123) untuk terhubung ke direktori aktif. Maka hanya saya yang dapat melakukan operasi di AD. Sebagai ganti meneruskan kredensial setiap kali saya ingin menggunakan akun Layanan (domain\service_account) tempat aplikasi saya berjalan untuk terhubung ke AD. Bagaimana cara mencapainya??


person Kapil Kumar    schedule 17.10.2016    source sumber
comment
Terima kasih sebelumnya !   -  person Kapil Kumar    schedule 17.10.2016
comment
bagaimana Anda terhubung ke AD   -  person lordkain    schedule 17.10.2016
comment
Sudahkah Anda mencoba mengatur akun kumpulan aplikasi sebagai akun Admin AD? Anda mungkin perlu memberikan izin folder tambahan agar akun ini dapat mengakses folder situs.   -  person Stinky Towel    schedule 17.10.2016
comment
coba { menggunakan (var DirectoryEntry = new DirectoryEntry(ldabPath, ldapUserName, ldapPassword)) { menggunakan (var newUser = DirectoryEntry.Children.Add(CN= + userViewModel.UserName, User)) { newUser.CommitChanges(); newUser.Invoke(setpassword, userViewModel.Password); newUser.Properties[userAccountControl].Nilai = 0x0200; pengguna baru.CommitChanges(); } }   -  person Kapil Kumar    schedule 17.10.2016
comment
kode di atas digunakan untuk menambahkan pengguna di AD. Daripada memberikan kredensial, saya ingin menggunakan akun layanan. Saya ingin akses tanpa batas ke AD menggunakan akun layanan.   -  person Kapil Kumar    schedule 17.10.2016
comment
Lihat ini juga: stackoverflow.com/a/37565248/2779990   -  person Stinky Towel    schedule 17.10.2016
comment
Saya memeriksanya, tetapi tidak dapat menemukan jawaban saya. Tanpa menggunakan kredensial, bagaimana Anda dapat terhubung ke AD.   -  person Kapil Kumar    schedule 18.10.2016


Jawaban (2)


Cukup membuat DirectoryEntry oleh new DirectoryEntry(ldabPath, null, null) akan menggunakan kredensial pengguna saat ini (akun layanan untuk layanan Windows). Kuncinya adalah meneruskan null ke nama pengguna dan kata sandi.

Itukah yang kamu inginkan?

Pastikan saja akun layanan memiliki izin yang cukup untuk menyetel kata sandi bagi semua pengguna yang terlibat.

person baldpate    schedule 18.10.2016

Anda dapat memilih salah satu dari 2 pilihan.

Opsi 1. Anda menjalankan aplikasi di komputer yang tergabung ke domain, tempat Anda menambahkan/menghapus pengguna. Dalam hal ini solusi paling sederhana adalah menjalankan aplikasi Anda (kumpulan aplikasi) di bawah akun domain dengan izin yang memadai (dengan cara sederhana dapat berupa akun milik grup Admin Domain. Juga akan menjadi admin di host, tempat aplikasi berjalan)

Opsi 2. Anda menjalankan aplikasi di komputer mandiri, yang tidak digabungkan ke domain. Dalam hal ini Anda dapat memilih salah satu dari berikut ini:

A. Meniru identitas thread Anda untuk bertindak sebagai akun domain saat melakukan semua koneksi jaringan. Anda perlu menggunakan LogonUser berfungsi dengan tanda LOGON32_LOGON_NEW_CREDENTIALS. Kelemahan dari metode ini adalah semua koneksi jaringan (misalnya Anda terhubung ke jaringan berbagi) akan dibuat menggunakan akun domain. Untuk detail selengkapnya tentang penerapan, lihat postingan ini.

B. Buat manajer koneksi yang akan membuat DirectoryEntry untuk Anda dengan kredensial yang diperlukan. Lihat kode di bawah ini:

public interface IDirectoryEntryManager
{
    DirectoryEntry GetDirectoryEntry(string domain, string baseDn);
}

public interface ICredentialProvider
{
    Credential GetCredential(string domain);
}

public class Credential
{
    public string UserName { get; set; }
    public string Password { get; set; }
}

public class DirectoryEntryManager : IDirectoryEntryManager, IDisposable
{
    private class DomainConnectionInfo
    {
        internal DomainConnectionInfo(string server, Credential credential)
        {
            Server = server;
            Credential = credential;
        }

        internal string Server { get; private set; }
        internal Credential Credential { get; private set; }
    }

    private bool disposed;
    ICredentialProvider _credentialProvider;
    Dictionary<string, DomainConnectionInfo> connectionsInfo = new Dictionary<string, DomainConnectionInfo>(StringComparer.OrdinalIgnoreCase);
    Dictionary<string, DirectoryEntry> connections = new Dictionary<string, DirectoryEntry>(StringComparer.OrdinalIgnoreCase);

    public DirectoryEntryManager(ICredentialProvider credentialProvider)
    {
        _credentialProvider = credentialProvider;
    }

    public DirectoryEntry GetDirectoryEntry(string domain, string baseDn)
    {
        if (disposed)
        {
            throw new ObjectDisposedException(this.GetType().Name);
        }

        return GetOrCreateConnection(domain, baseDn);
    }

    public void Dispose()
    {
        if (!disposed)
        {
            foreach (var connection in connections)
            {
                connection.Value.Dispose();
            }

            connections.Clear();
            disposed = true;
        }
    }

    private DirectoryEntry GetOrCreateConnection(string domain, string baseDn)
    {
        DomainConnectionInfo info;

        if (!connectionsInfo.TryGetValue(domain, out info))
        {
            var credential = _credentialProvider.GetCredential(domain);
            var dc = DomainController.FindOne(new DirectoryContext(DirectoryContextType.Domain, credential.UserName, credential.Password));
            info = new DomainConnectionInfo(dc.Name, credential);

            // maintaining a connection to rootDse object to make all LDAP queries use this single connection under the hood. Increasing performance
            var entry = new DirectoryEntry(string.Format("LDAP://{0}/RootDSE", dc.Name));
            entry.RefreshCache();

            connections.Add(domain, entry);
            connectionsInfo.Add(domain, info);
        }

        return new DirectoryEntry(string.Format("LDAP://{0}/{1}", info.Server, baseDn), info.Credential.UserName, info.Credential.Password);
    }
}

Tidak menguji kodenya. Gunakan pengikatan server daripada pengikatan tanpa server (misalnya LDAP://domain.com) lebih baik jika Anda membuat pengguna di satu bagian program dan mencoba mengaksesnya di bagian lain. Dengan menggunakan pengikatan tanpa server, Anda dapat terhubung ke DC yang berbeda, sehingga pengguna yang Anda coba akses mungkin tidak direplikasi ke DC ke-2.

Sadarilah bahwa pengontrol domain mungkin tidak tersedia, jadi Anda perlu menerapkan logika, untuk mencari DC lain dan menyegarkan cache koneksi Anda jika diperlukan.

Anda dapat menyimpan kredensial dalam file\LSA yang mungkin dienkripsi dan menjadikan kelas DirectoryEntryManager tunggal.

person oldovets    schedule 17.10.2016
comment
Bisakah Anda menjelaskan secara detail? - person Kapil Kumar; 18.10.2016
comment
@Kapil Kumar: membuat jawaban terperinci, sama-sama - person oldovets; 19.10.2016