หลังจากที่ ASP.net 2.0 เปิดตัว ฉันอยากจะใช้ Membership 2.0 มาโดยตลอด ซึ่งเป็นเครื่องมือการจัดการสิทธิ์เว็บไซต์ที่ครบครัน ฉันใช้ SQLProvider ใช้ aspnet_regsql เพื่อสร้างตารางที่ต้องการ และกำหนดค่า web.config อย่างไรก็ตาม ฉันพบปัญหามากมายในการใช้งานจริง รวมถึงการได้รับผู้ใช้ที่เข้าสู่ระบบในปัจจุบันผ่านทาง Membership.GetUser() หลังจากเข้าสู่ระบบ ผลลัพธ์ที่ได้ก็ถูกส่งกลับคืนมา สำหรับฉันมันเป็นโมฆะ... การตั้งค่าการรับรองความถูกต้องและการอนุญาตที่รวมอยู่ใน webconfig ดูเหมือนจะไม่มีผลเลย หลังจากค้นหามาบ้าง ฉันก็ยังแก้ไขปัญหานี้ไม่ได้ ดังนั้นฉันจึงไม่มีทางเลือกอื่นนอกจากใช้การเป็นสมาชิก แต่ดำเนินการ กระบวนการรับรองความถูกต้องและการอนุญาตทั้งหมดด้วยตัวเอง
เนื่องจากการควบคุมการเข้าสู่ระบบไม่ทำงาน ฉันจึงเขียนหน้า Login.aspx ด้วยตัวเอง หน้านี้ใช้ฟังก์ชัน Membership.ValidateUser() เพื่อตัดสินการเข้าสู่ระบบของผู้ใช้ หลังจากที่ผู้ใช้เข้าสู่ระบบสำเร็จแล้ว ชื่อผู้ใช้ของผู้ใช้จะถูกบันทึกในเซสชัน
ฉันได้ใช้ออบเจ็กต์ที่กำหนดค่าได้แบบอนุกรม XML ซึ่งมีโครงสร้างต่อไปนี้
<ตำแหน่งของเพจ>
<ที่ตั้งเพจ = "~/admin/admin/RoleManager.aspx">
<อนุญาตบทบาท = "ผู้ดูแลระบบ" />
ตำแหน่งเพจ>
ตำแหน่งเพจ>
PageLocations คือชุดของวัตถุรายการของ PageLocation ตำแหน่งใน Pagelocation ประกอบด้วยเพจที่จะเพิ่มสิทธิ์ Pagelocation มีออบเจ็กต์ Allow หนึ่งในนั้นคือ Roles ซึ่งมีบทบาทผู้ใช้ที่เพจสามารถอนุญาตได้ โดยสามารถคั่นด้วยเครื่องหมายจุลภาค เพื่อให้เพจทั้งหมดถูกเพิ่มลงในโครงสร้าง XML นี้
จากนั้นใช้ฟังก์ชันต่อไปนี้:
///
/// อนุญาตให้เข้าถึงหน้านี้ได้หรือไม่
/// สรุป>
/// เส้นทางที่ได้รับอนุญาต
/// บทบาทการอนุญาต
///
บูลสาธารณะ isAllow (Uri url, สตริง [] ชื่อบทบาท, บริบท HttpContext)
-
เส้นทางสตริง=context.Server.MapPath(url.AbsolutePath);
PageLocation theLocation = null;
foreach (ตำแหน่ง PageLocation ใน pageLocations)
-
การโก่งสตริง;
strlocation=context.Server.MapPath(location.Location);
ถ้า (strlocation.ToLower() == path.ToLower())
-
theLocation = ที่ตั้ง;
-
-
ถ้า (theLocation != null)
-
string[] บทบาท = theLocation.Allow.Roles.Split(',');
foreach (บทบาทสตริงในบทบาท)
-
foreach (ชื่อบทบาทสตริงในชื่อบทบาท)
-
ถ้า (ชื่อบทบาท == บทบาท)
-
กลับเป็นจริง;
-
-
-
กลับเท็จ;
-
อื่น
-
กลับเท็จ;
}
}
โดยการเปรียบเทียบเส้นทางสัมบูรณ์ของหน้าที่เยี่ยมชมในปัจจุบันกับเส้นทางสัมบูรณ์ในรูปแบบ xml จากนั้นรับออบเจ็กต์ Pagelocation ที่อธิบายไว้ใน xml เพื่อพิจารณาว่าบทบาท Allow ของเขาตรงกับบทบาทของผู้ใช้ปัจจุบันหรือไม่
เนื่องจากการจัดการของฉันใช้สำหรับการจัดการความปลอดภัยในเบื้องหลัง ฉันจึงเขียนการควบคุมผู้ใช้เพื่อสรุปคลาส SecurityConfig รับบัญชีผู้ใช้ที่เข้าสู่ระบบผ่าน Context.Session[] จากนั้นรับการเข้าสู่ระบบผ่าน Roles.GetRolesForUser(ชื่อผู้ใช้) บทบาทของผู้ใช้ จากนั้นส่ง Context.Request.Url และบทบาทไปยังฟังก์ชันทันที หากผู้ใช้ได้รับอนุญาต หน้าปัจจุบันจะปรากฏขึ้น มิฉะนั้น ระบบจะข้ามไปที่หน้าเข้าสู่ระบบของผู้ใช้เองหรือแจ้งให้คุณทราบว่าคุณไม่มีสิทธิ์ดังกล่าว .
เนื่องจากฉันใช้ MasterPage ในกรณีนี้ ฉันเพียงต้องผูกการควบคุมนี้กับมาสเตอร์เพจ เพื่อให้แต่ละเพจอยู่ภายใต้การจัดการ และเขียนเพจในพื้นหลังที่แก้ไขและทำให้ออบเจ็กต์ SecurityConfig เป็นอนุกรม ซึ่งบรรลุการควบคุมสิทธิ์สำหรับทุกเพจ
การใช้วิธีนี้เป็นความคิดที่ดีเมื่อการเป็นสมาชิกไม่ทำงาน ด้วยวิธีนี้ ไม่เพียงแต่ใช้ประโยชน์จากฟังก์ชันพื้นฐานที่ Membership มอบให้สำหรับผู้ใช้ เช่น CreateUser และ CreateRoles เท่านั้น แต่ยังตรงตามความจำเป็นในการตั้งค่าสิทธิ์อีกด้วย วิธีเดียวที่จะจัดการกับมันตอนนี้
นี่เป็นครั้งแรกที่ฉันโพสต์บนหน้าแรก และหวังว่าจะมีคนบอกฉันได้ในกรณีใดบ้างที่การอนุญาต .net จะไม่ทำงาน
http://www.cnblogs.com/livesite/archive/2006/08/14/membership.html