FBA และ SQL Server: เรื่องความรัก

เพื่อนร่วมงานของฉันได้ทำงานบน 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);
 }
 }

</สิ้นสุด>

สมัครสมาชิกไปยังบล็อกของฉัน.

แท็กของ Technorati:

One thought on“FBA และ SQL Server: เรื่องความรัก

  1. David ก่อน
    โพสต์นี้ขอคำถามที่ไม่เกี่ยวข้องแต่อาจไม่ทราบวิธีการส่งอีเมล์จากบล็อกนี้.
    ได้โพสต์ก่อนหน้านี้ที่คุณนำเสนอวิธีที่ดีเพื่อกรองไลบรารีเพื่อดูข้อมูลที่ untagged. มีความคิดใดเป็นอย่างไรคุณอาจดูรายการของเอกสาร untagged ในไลบรารีเอกสารทั้งหมด? ใช้ฟิลด์ในการค้นหาขั้นสูงที่ว่างไม่ส่งคืนผลลัพธ์ใด ๆ.

ทิ้งคำตอบไว้

ที่อยู่อีเมลของคุณจะไม่ถูกเผยแพร่. ช่องที่ต้องการถูกทำเครื่องหมาย *