Rekan saya telah bekerja pada sebuah web bagian dalam lingkungan FBA. Antara lain, bagian web menarik beberapa data dari SQL server. Rencana besar untuk proyek ini menentukan bahwa DBA mengkonfigurasi data tingkat keamanan di SQL (dibandingkan dengan embedding ID pengguna dalam SQL query atau beberapa pendekatan lain).
Masalahnya adalah bahwa SQL server tidak tahu apa-apa tentang lingkungan FBA kami sehingga tidak dapat mempercayai kami. Kami memecahkan masalah ini dengan, karena tidak ada kata yang lebih baik, secara manual meniru pengguna AD sehingga kita bisa terhubung ke SQL sehingga SQL data tingkat keamanan pekerjaan.
Meskipun FBA adalah fitur ASP.NET, kita orang-orang bangsa SharePoint telah mengajarkan berbagai search engine yang jika Anda sedang query untuk FBA, Anda pasti ingin tahu cara mengkonfigurasi FBA dalam SharePoint. Aku gagal menemukan menemukan informasi apapun tentang cara mengaktifkan FBA berorientasi ASP.NET aplikasi untuk berkomunikasi dengan SQL dengan cara yang kami butuhkan.
Dalam meneliti ini, kita kembali membaca artikel ini: ASP.NET peniruan
Penelitian lebih lanjut membawa kita ke artikel codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Yang membantu kami menulis kode kami, yang saya telah menyertakan di bawah. Ianya tidak hal-hal yang paling elegan, Tapi itu berhasil. Saya harap Anda menemukan berguna.
Berikut adalah kode yang bekerja untuk kami:
dilindungi Batal btnSearchCarrier_Click(objek pengirim, EventArgs e) { coba { ImpersonateUser iU = baru ImpersonateUser(); // TODO: Menggantikan kredensial iU.Impersonate("DomainName", "Nama pengguna", "Password"); // KODE // iU.Undo(); } menangkap (Pengecualian ex) { } } // Menggunakan peniruan kelas seperti yang disebutkan di bawah ini. Umum kelas ImpersonateUser { [DllImport("advapi32.dll", SetLastError = benar)] Umum statis Surat Edaran Bool LogonUser( String lpszUsername, String lpszDomain, String lpszPassword, Int dwLogonType, Int dwLogonProvider, REF IntPtr phToken); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] swasta Surat Edaran statis Bool CloseHandle(Menangani IntPtr); swasta statis IntPtr tokenHandle = baru IntPtr(0); swasta statis WindowsImpersonationContext impersonatedUser; // Jika Anda memasukkan kode ini ke dalam DLL, Pastikan untuk menuntut bahwa // menjalankan dengan FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Nama = "FullTrust")] Umum Batal Impersonate(string domainName, string userName, string sandi) { coba { // Gunakan fungsi LogonUser tidak dikelola untuk mendapatkan token untuk pengguna // pengguna tertentu, domain, dan password. Const Int LOGON32_PROVIDER_DEFAULT = 0; // Melewati parameter ini menyebabkan LogonUser untuk membuat tanda utama. Const Int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // Langkah -1 Hubungi LogonUser untuk mendapatkan pegangan untuk token akses. Bool returnValue = LogonUser( nama pengguna, domainName, sandi, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, REF tokenHandle); // tokenHandle - token keamanan baru Jika (palsu == returnValue) { Int ret = Marshal.GetLastWin32Error(); Console.WriteLine("LogonUser panggilan gagal dengan kode kesalahan : " + RET); melempar Baru System.ComponentModel.Win32Exception(RET); } // Langkah - 2 WindowsIdentity newId = baru WindowsIdentity(tokenHandle); // Langkah -3 impersonatedUser = newId.Impersonate(); } menangkap (Pengecualian ex) { Console.WriteLine("Pengecualian terjadi. " + mantan.Pesan); } } /// <Ringkasan> /// Berhenti peniruan /// </Ringkasan> Umum Undo Batal() { impersonatedUser.Undo(); // Gratis token. Jika (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</akhir>