Rakan sekerja saya telah bekerja di bahagian web dalam persekitaran FBA. Antara perkara-perkara lain, Bahagian web menarik beberapa data dari SQL server. Rancangan grand bagi projek ini menentukan DBA yang konfigurasikan Keselamatan peringkat data dalam SQL (berbanding dengan pemupukan ID pengguna dalam pertanyaan SQL atau beberapa pendekatan lain).
Masalahnya ialah bahawa SQL server tidak tahu apa-apa tentang persekitaran FBA kita supaya ia tidak boleh mempercayai kami. Kita menyelesaikan masalah ini dengan, kerana kekurangan satu perkataan yang lebih baik, menyamar sebagai seorang pengguna iklan secara manual supaya kami dapat menyambung ke SQL supaya SQL data peringkat kerja-kerja Keselamatan.
Walaupun FBA merupakan sebuah filem cetera ASP.NET, kita orang SharePoint negara telah mengajar carian pelbagai enjin yang jika anda ada pertanyaan untuk FBA, anda mesti bermakna anda mahu tahu bagaimana untuk mengkonfigurasi FBA dalam SharePoint. Saya gagal untuk mencari Cari apa-apa maklumat tentang bagaimana untuk mengaktifkan FBA yang berorientasikan aplikasi ASP.NET untuk berkomunikasi dengan SQL dengan cara kita diperlukan.
Dalam penyelidikan ini, kita kembali membaca artikel ini: ASP.NET Impersonation
Lebih banyak penyelidikan membawa kita untuk artikel codproject ini: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Yang membantu kita menulis kod kami, yang saya sertakan di bawah. Ia bukanlah hal-hal yang paling elegan, tetapi ia bekerja. Saya berharap anda mendapati ia berguna.
Berikut adalah kod yang bekerja untuk kita:
dilindungi btnSearchCarrier_Click tidak sah(penghantar objek, EventArgs e) { cuba { ImpersonateUser iU = baru ImpersonateUser(); // TODO: Menggantikan kelayakan iU.Impersonate("DomainName", "Nama pengguna", "Kata laluan"); // KOD // iU.Undo(); } menangkap (Pengecualian ex) { } } // Menggunakan Impersonation kelas seperti yang dinyatakan di bawah. awam kelas ImpersonateUser { [DllImport("advapi32.dll", SetLastError = benar)] awam statik luar bool LogonUser( Tali lpszUsername, Tali lpszDomain, Tali lpszPassword, Int dwLogonType, Int dwLogonProvider, REF IntPtr phToken); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] swasta luar statik bool CloseHandle(Pemegang IntPtr); swasta statik IntPtr tokenHandle = baru IntPtr(0); swasta statik WindowsImpersonationContext impersonatedUser; // Jika anda memasukkan kod ini ke dalam DLL, Jangan lupa untuk menuntut bahawa // berjalan dengan FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Nama = "FullTrust")] awam Impersonate tidak sah(rentetan domainName, nama pengguna rentetan, rentetan kata laluan) { cuba { // Menggunakan fungsi LogonUser tidak terurus untuk mendapatkan token untuk pengguna // pengguna yang ditentukan, domain, dan kata laluan. const Int LOGON32_PROVIDER_DEFAULT = 0; // Lulus parameter ini menyebabkan LogonUser melahirkan tanda utama. const Int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // Langkah -1 Hubungi LogonUser untuk memperolehi pemegang ke token akses untuk. bool returnValue = LogonUser( Nama pengguna, domainName, kata laluan, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, REF tokenHandle); // tokenHandle - tanda keselamatan yang baru jika (false == returnValue) { Int ret = Marshal.GetLastWin32Error(); Console.WriteLine("Panggilan LogonUser gagal dengan kod ralat : " + ret); membuang baru yang System.ComponentModel.Win32Exception(ret); } // Langkah - 2 WindowsIdentity newId = baru WindowsIdentity(tokenHandle); // Langkah -3 impersonatedUser = newId.Impersonate(); } menangkap (Pengecualian ex) { Console.WriteLine("Pengecualian telah berlaku. " + bekas. Mesej); } } /// <Ringkasan> /// Impersonation hentian /// </Ringkasan> awam buat asal tidak sah() { impersonatedUser.Undo(); // Token yang bebas. jika (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</akhir>