เพื่อนร่วมงานของฉันได้ทำงานบน web part ในสภาพแวดล้อม(fba). ในหมู่สิ่งอื่น ๆ, ส่วนเว็บดึงข้อมูลบางส่วนจากเซิร์ฟเวอร์ SQL. แผนแกรนด์สำหรับโครงการนี้บอกว่า DBA ที่กำหนดค่าความปลอดภัยระดับข้อมูลใน SQL (ตรงข้ามกับฝัง ID ผู้ใช้ในแบบสอบถาม SQL หรือวิธีอื่น ๆ).
ปัญหาคือ ว่า SQL server ไม่รู้อะไรเกี่ยวกับสภาพแวดล้อมของเรา(fba)ดังนั้นจึงไม่สามารถไว้วางใจเรา. เราแก้ไขปัญหานี้โดย, ขาดคำดี, การแอบอ้างผู้โฆษณาด้วยตนเองเพื่อให้เราสามารถเชื่อมต่อกับ SQL ที่ SQL ข้อมูลระดับความปลอดภัยในการทำงาน.
แม้ว่า FBA คือ มีคุณลักษณะ ASP.NET, เราประเทศ SharePoint ผู้สอนค้นหาต่าง ๆ เครื่องยนต์ซึ่งถ้าคุณกำลังสอบถามการ FBA, คุณต้องหมายถึง คุณต้องรู้วิธีการตั้งค่าคอนฟิก FBA ไซต์. ฉันไม่สามารถค้นหาข้อมูลเกี่ยวกับวิธีการเปิดใช้งานการ FBA เน้น ASP.NET แอพลิเคชันสื่อสารกับ SQL ในแบบที่เราต้องการค้นหา.
ในหลักสูตรของการวิจัยนี้, เราได้อ่านบทความนี้ใหม่: เลียนแบบใน ASP.NET
วิจัยเพิ่มเติมนำเราไปสู่บทความนี้ codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
ที่ช่วยให้เราเขียนโค้ดของเรา, ซึ่งผมได้รวมไว้ด้านล่าง. มันไม่ใช่สิ่งหรูหราที่สุด, แต่ทำงาน. ฉันหวังว่า คุณค้นหาประโยชน์.
นี่คือรหัสที่ทำงานให้เรา:
ได้รับการป้องกัน ยกเลิก btnSearchCarrier_Click(ผู้ส่งวัตถุ, EventArgs e) { ลอง { ImpersonateUser iU = ใหม่ ImpersonateUser(); // TODO: แทน iU.Impersonate ข้อมูลประจำตัว("DomainName", "ชื่อผู้ใช้", "รหัสผ่าน"); // รหัส // iU.Undo(); } จับ (ยกเว้นแฟนเก่า) { } } // ใช้ระดับการเลียนแบบ ตามด้านล่าง. สาธารณะ คลาส ImpersonateUser { [DllImport("advapi32.dll", SetLastError = จริง)] สาธารณะ คง extern bool LogonUser( สตริ lpszUsername, สตริ lpszDomain, สตริ lpszPassword, int dwLogonType, int dwLogonProvider, การอ้างอิง IntPtr phToken); [DllImport("เกี่ยวกับ kernel32.dll", CharSet = CharSet.Auto)] ส่วนตัว extern คง bool CloseHandle(หมายเลขอ้างอิง IntPtr); ส่วนตัว คง IntPtr tokenHandle = ใหม่ IntPtr(0); ส่วนตัว คง WindowsImpersonationContext impersonatedUser; // ถ้าคุณรวมรหัสนี้เป็น DLL, ให้แน่ใจว่าความต้องการ // ทำงานกับ FullTrust. [PermissionSetAttribute(SecurityAction.Demand, ชื่อ = "FullTrust")] สาธารณะ Impersonate โมฆะ(สตริ domainName, ชื่อสาย, ผ่านสตริงที่) { ลอง { // ใช้ LogonUser ฟังก์ชันจัดการรับโทเค็นสำหรับผู้ใช้ // ผู้ใช้ที่ระบุ, โดเมน, และรหัสผ่าน. ค่า const int LOGON32_PROVIDER_DEFAULT = 0; // ผ่านพารามิเตอร์นี้สาเหตุ LogonUser สร้างโทเค็นหลัก. ค่า const int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // ขั้นตอนที่ -1 เรียก LogonUser เพื่อขอรับหมายเลขอ้างอิงการเข้า. bool returnValue = LogonUser( ชื่อผู้ใช้, domainName, รหัสผ่าน, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, อ้างอิง tokenHandle); // tokenHandle - token ความปลอดภัยใหม่ ถ้า (false == returnValue) { int ret = Marshal.GetLastWin32Error(); Console.WriteLine("เรียก LogonUser ล้มเหลว ด้วยรหัสข้อผิดพลาด : " + ret); โยน System.ComponentModel ใหม่.Win32Exception(ret); } // ขั้นตอนที่ - 2 WindowsIdentity newId = ใหม่ WindowsIdentity(tokenHandle); // ขั้นตอนที่ -3 impersonatedUser = newId.Impersonate(); } จับ (ยกเว้นแฟนเก่า) { Console.WriteLine("เกิดข้อยกเว้น. " + อดีตข้อความ); } } /// <สรุป> /// เลียนแบบหยุด /// </สรุป> สาธารณะ ยกเลิกเป็นโมฆะ() { impersonatedUser.Undo(); // ฟรีสัญญาณ. ถ้า (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</สิ้นสุด>