สรุป: องค์ประกอบ Membership ของ asp.net 2.0 มอบชุดอินเทอร์เฟซที่เรียบง่ายและใช้งานง่ายสำหรับนักพัฒนาเพื่อดำเนินการจัดการผู้ใช้และการตรวจสอบผู้ใช้ บทความนี้จะวิเคราะห์หลักการใช้งานโดยย่อ แนะนำวิธีใช้อย่างถูกต้อง และวิธีขยายขอบเขต
1. คลาสนามธรรม MembershipProvider
ในหลายกรณี เราไม่ได้ใช้คลาสนี้โดยตรงเมื่อใช้ Membership คลาส MembershipProvider กำหนดวิธีการเชิงนามธรรมและคุณลักษณะเชิงนามธรรม ซึ่งเป็นวิธีการและคุณลักษณะเหล่านี้ที่ประกอบขึ้นเป็นข้อกำหนดพื้นฐานของส่วนต่อประสานการเป็นสมาชิก และฟังก์ชันของการใช้การเป็นสมาชิกภายในกรอบงาน .NET ล้วนถูกเรียกผ่านประเภทนี้ คลาสที่สืบทอดมาจะมีฟังก์ชันการจัดการผู้ใช้ในสภาพแวดล้อมที่แตกต่างกันโดยการนำอินเทอร์เฟซเหล่านี้ไปใช้ และไม่มีผลกระทบต่อกรอบงานการเป็นสมาชิก มาดูคำจำกัดความต้นแบบของ MembershipProvider กันดีกว่า:
คลาสนามธรรมสาธารณะ MembershipProvider : ProviderBase
...{
// กิจกรรม
กิจกรรมสาธารณะ MembershipValidatePasswordEventHandler ValidatingPassword;
// วิธี
การป้องกัน MembershipProvider();
บูลนามธรรมสาธารณะ ChangePassword (ชื่อผู้ใช้สตริง, สตริง oldPassword, สตริง newPassword
)
; รหัสผ่าน, อีเมลสตริง, รหัสผ่านสตริง, รหัสผ่านสตริง, บูล isApproved, object providerUserKey, ออก MembershipCreateStatus
สถานะ
)
;
(รหัสผ่านสตริง, รูปแบบรหัสผ่าน int, สตริงเกลือ);
ไบต์
เสมือนที่ได้รับการป้องกัน(
รหัสผ่านไบต์ []);
, int pageIndex, int pageSize, out int TotalRecords)
;
สตริงนามธรรมสาธารณะ
MembershipUserCollection
GetAllUsers (int pageIndex, int pageSize, out int TotalRecords
);คำตอบ)
บทคัดย่อสาธารณะ MembershipUser GetUser (ชื่อผู้ใช้บูล userIsOnline);
บทคัดย่อ
สาธารณะ
MembershipUser GetUser (ชื่อผู้ใช้แบบสตริง GetUserNameByEmail)
OnValidatingPassword เสมือนที่ได้รับการป้องกัน (ValidatePasswordEventArgs e);
ResetPassword สตริงนามธรรมสาธารณะ (
ชื่อผู้ใช้สตริง UnEncodePassword
)
(ผู้ใช้ MembershipUser)
;บูลนามธรรมสาธารณะ ValidateUser (ชื่อผู้ใช้สตริง, รหัสผ่านสตริง);
// คุณสมบัติ
สตริงนามธรรมสาธารณะ ApplicationName ...{ get; set; }
public
abstract bool EnablePasswordReset ...
{ get; }
public
abstract boolabstract int MinRequiredNonAlphanumericCharacters ...{ get
; } บทคัดย่อสาธารณะ int MinRequiredPasswordLength ...
{ get; }
สตริง
นามธรรมสาธารณะ PasswordStrengthRegularExpression ... { get; }
บูลนามธรรมสาธารณะ RequiresQuestionAndAnswer ...{ get; }
บูลนามธรรมสาธารณะ RequiresUniqueEmail ...{ get;
// ฟิลด์
MembershipValidatePasswordEventHandler _EventHandler;
ส่วนตัว const int SALT_SIZE_IN_BYTES = 0x10
;
ตัวแก้ไขภายในมีหลายวิธีที่เป็นวิธีการเสริมสำหรับรหัสผ่าน ใช้ในการเข้ารหัส ถอดรหัส และตรวจสอบรหัสผ่าน แต่ดูเหมือนว่าจะมีปัญหาบางอย่างกับการออกแบบที่นี่ ดูเหมือนว่าจะไม่เหมาะสมเล็กน้อยที่จะกำหนดวิธีการเหล่านี้เป็นขอบเขตภายใน วิธีการเหล่านี้ถูกกำหนดไว้ในคลาสพื้นฐานเพื่อให้สามารถนำมาใช้ซ้ำได้ แต่จากมุมมองของเอฟเฟกต์ นี่คือ ไม่ใช่กรณีนี้ เนื่องจากสมาชิกภายในได้รับอนุญาตให้ใช้เฉพาะภายในชุดประกอบนี้เท่านั้น (ภายใต้สถานการณ์ปกติ วิธีการอื่น ๆ เช่น การสะท้อนกลับจะไม่รวมอยู่ด้วย) ซึ่งหมายความว่า MembershipProvider แบบขยายของเราเองไม่สามารถใช้วิธีการเหล่านี้ได้ และเมื่อพิจารณาจากขอบเขตการใช้งานในปัจจุบัน วิธีการเหล่านี้จะใช้เฉพาะใน SqlMembershipProvider เท่านั้น ดังนั้นฉันคิดว่าตัวดัดแปลงวิธีการเหล่านี้ควรเปลี่ยนเป็นแบบป้องกัน
2. Membership static class
ดังที่ได้กล่าวมาแล้ว ภายใต้สถานการณ์ปกติ เราจะไม่ใช้ MembershipProvider abstraction โดยตรง เพราะมันเกี่ยวข้องกับปัญหาของวิธีการสร้างอินสแตนซ์ของคลาสบริการสมาชิกที่แท้จริง และโดยทั่วไปจะเกี่ยวข้องกับการกำหนดค่าและการสร้างอินสแตนซ์ของอ็อบเจ็กต์ ทั้งหมดนี้ค่อนข้างจะ คำถามที่ยาก และสำหรับผู้เริ่มต้น คำถามเหล่านี้ไม่ใช่เรื่องง่ายที่จะเชี่ยวชาญ ในกรอบงาน .NET ชั้นของความสัมพันธ์ที่ซับซ้อนนี้ได้รับการป้องกันผ่านการเป็นสมาชิกคลาสคงที่ (คลาสคงที่) นอกจากการป้องกันผู้ใช้จากการอ่านไฟล์การกำหนดค่า ออบเจ็กต์เริ่มต้น และงานพื้นฐานอื่นๆ แล้ว Membership (Static Class) ยังมีบทบาทสำคัญในการโหลด MembershipProviders ทั้งหมด จึงมี API เพื่อให้ผู้ใช้ใช้งานได้สะดวกยิ่งขึ้น Membership (คลาสแบบคงที่) ยังรีโหลดวิธีการเหล่านี้ โหลดเป็นวิธีการแบบคงที่ และจัดเตรียมการใช้งานที่โอเวอร์โหลดที่สมบูรณ์ยิ่งขึ้นโดยอิงตาม API พื้นฐานของ MembershipProvider เพื่อให้ผู้ใช้สามารถโทรได้ สิ่งนี้สนับสนุนโดยตรงไม่ว่าจะอยู่ในเลเยอร์ UI หรือโปรเจ็กต์อื่นๆ เพียงอ้างอิงเนมสเปซ System.Web.Security และคุณสามารถเพลิดเพลินกับความสะดวกสบายต่างๆ ที่ Membership มอบให้โดยไม่ต้องกังวลกับรายละเอียดใดๆ ลองมาดูที่คำจำกัดความต้นแบบของการเป็นสมาชิก (คลาสแบบคงที่): (ใช้. NET Reflector ของ Lutz Roder เพื่อดูการใช้งานทั้งหมด)
คลาสคงที่สาธารณะ Membership
...{
// Events
public static event MembershipValidatePasswordEventHandler ValidatingPassword;
// วิธีการ
เป็นสมาชิกแบบคงที่ ();
Public static MembershipUser CreateUser (ชื่อผู้ใช้แบบสตริง
, รหัสผ่านสตริง, อีเมล
แบบสตริง, string รหัสผ่านคำถาม, รหัสผ่านสตริง, บูล isApproved, ออกสถานะ MembershipCreateStatus
)
;
บูลแบบคงที่สาธารณะ DeleteUser (ชื่อผู้ใช้
สตริง บูลDeleteAllRelatedData);
สาธารณะแบบคงที่ MembershipUserCollection FindUsersByEmail (สตริงemailToMatch
);
สาธารณะแบบคงที่ MembershipUserCollection FindUsersByEmail (สตริง emailToMatch, int pageIndex, int pageSize, ออก int TotalRecords);
,
out int TotalRecords);สตริงคงที่ส่วนตัว GetCurrentUserName()
;
public
static
MembershipUser
GetUser();
GetUser (ชื่อผู้ใช้แบบสตริง);
MembershipUser แบบคงที่ GetUser (วัตถุ providerUserIsOnline);
สาธารณะแบบคงที่
MembershipUser GetUser (ชื่อผู้ใช้
แบบคงที่แบบบูล UpdateUser
)
(ผู้ใช้ MembershipUser);
ValidateUser แบบคงที่สาธารณะ (ชื่อผู้ใช้สตริง, รหัสผ่านสตริง);
// คุณสมบัติ
สตริงคงที่สาธารณะ ApplicationName ...{ get; set; }
บูลคงที่สาธารณะ EnablePasswordReset ...
{
get;
}
บูลคงที่ IsHashAlgorithmFromMembershipConfig ...{ get
; } int แบบคงที่สาธารณะ MaxInvalidPasswordAttempts ...
{ get; }
สาธารณะ intแบบคง
ที่ MinRequiredNonAlphanumericCharacters ...
{ get; }
ผู้
ให้บริการ MembershipProvider แบบคงที่สาธารณะ ...{ get; }
ผู้ให้บริการแบบคง
ที่สาธารณะ
... { get;
int UserIsOnlineTimeWindow ...{ รับ;
// ฟิลด์
อักขระ
คงที่ส่วนตัว
s_HashAlgorithmFromConfig
;สตริง
คงที่ส่วนตัว
s_Provider
ส่วนตัวint
แบบคงที่
s_UserIsOnlineTimeWindow;
}
พูดแล้วก็ต้องพูดไม่กี่คำ ในกระบวนการดูโค้ดการใช้งาน Membership (Static Class) คุณจะพบว่าการโอเวอร์โหลด Membersip API ทั้งหมดจบลงด้วยการเรียกเมธอดของแอตทริบิวต์ Provider ประเภทของแอตทริบิวต์นี้คือประเภท MembershipProvider เฉพาะเมื่อคุณเห็นสิ่งนี้เท่านั้น อาจจะเข้าใจ มาทำความเข้าใจบทบาทสำคัญของ MembershipProvider กันดีกว่า นอกจากนี้ยังมีแอตทริบิวต์ผู้ให้บริการซึ่งจะได้รับคลาสบริการสมาชิกทั้งหมดที่กำหนดค่าใน web.config พวกมันทั้งหมดเป็นคุณสมบัติคงที่ แต่พวกมันจะสร้างอินสแตนซ์ได้อย่างไร? โดยการเรียกเมธอด Membership.Initialize() ทุกครั้งที่เรียกใช้คุณสมบัติทั้งสองนี้ เมธอดนี้จะถูกเรียกเพื่อตรวจสอบว่าคลาสบริการที่ Membership มอบให้นั้นได้รับการเตรียมใช้งานหรือไม่ ถ้าไม่เช่นนั้น คลาสบริการการกำหนดค่าจะถูกเรียกเพื่ออ่านการกำหนดค่า . เนื้อหาที่จะเริ่มต้น ณ จุดนี้ มันอาจไม่ใช่เรื่องยากสำหรับคุณที่จะเข้าใจว่าเหตุใดจึงใช้งานง่ายสำหรับเรา!
3. บทนำและการกำหนดค่าการใช้งานของ SqlMembershipProvider
ตกลง จากบทนำข้างต้น คุณควรจะสามารถเข้าใจโครงสร้างโดยรวมของการเป็นสมาชิกได้ใช่ไหม (หากคุณยังไม่ได้เปิด อาจเป็นไปได้ว่าคุณยังไม่ได้เปิด .NET Reflector ของ Lutz Roder เพื่อวิเคราะห์โค้ดการใช้งาน หรือคุณยังไม่เข้าใจบทบาทของคลาสนามธรรม) ไม่ว่าอะไรจะเกิดขึ้น เป้าหมายสูงสุดของเราคือการเรียนรู้วิธีใช้งาน
ก่อนหน้านั้น ฉันอยากจะแนะนำคลาสการใช้งาน MembershipProvider สองคลาสที่มีให้ใน .NET Framework ก่อน: ActiveDirectoryMembershipProvider และ SqlMembershipProvider (คุณรู้จักคลาสทั้งสองนี้ได้อย่างไร คุณสามารถดูคลาสที่สืบทอดมาทั้งหมดได้ใน Derived Types of MembershipProvider ) คลาสแรกจัดเตรียมผู้ใช้พื้นฐาน การจัดการภายใต้ Active Directory (ฉันไม่ได้ฝึกฝน) และอย่างหลังคือการใช้งานการจัดการผู้ใช้ตาม SqlServer ที่เราใช้บ่อยที่สุด
ถึงเวลาแนะนำวิธีใช้งานแล้ว จริงๆ แล้วมีบทความเกี่ยวกับเรื่องนี้อยู่ในสวนแล้ว ((แปล) วิธีใช้ Membership ใน ASP.NET 2.0) ดังนั้นผมจะไม่เสียคำพูดใดๆ อีกต่อไป แต่ที่นี่ฉันอยากจะบอกคุณถึงวิธีการเรียนรู้และใช้เป็นข้อมูลอ้างอิงโดยตรงที่สุด ค้นหาและเปิด machine.config บนดิสก์ระบบ ค้นหาโหนด AspNetSqlMembershipProvider และดูว่าคุณสามารถเห็นได้หรือไม่ อันที่จริงแล้ว นี่คือการกำหนดค่าสมาชิกขั้นพื้นฐานที่สุด แต่ไม่มีข้อกำหนดเฉพาะของแอตทริบิวต์ defaultProvider หลังจากระบุแอตทริบิวต์นี้แล้ว คุณสามารถใช้การควบคุมการเข้าสู่ระบบได้ โดยไม่จำเป็นต้องใช้รหัสใดๆ ในการยืนยันการเข้าสู่ระบบของผู้ใช้ หากคุณไม่เชื่อคุณสามารถลองได้ (สำหรับการยืนยันแบบฟอร์ม ฉันจะไม่แนะนำที่นี่ คุณสามารถดูข้อมูลที่เกี่ยวข้องได้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ SqlMembershipProvider โปรดดูที่ MSDN)
4. วิธีปรับแต่ง MembershipProvider ทรัพยากร MembershipProvider อื่นๆ ที่มีอยู่ แล้ว
เราจะปรับแต่ง MembershipProvider ได้อย่างไร? จริงๆ แล้ว หากคุณเข้าใจโครงสร้างของ Membership อยู่แล้ว ผมเชื่อว่ามันไม่ใช่เรื่องยากสำหรับคุณ อย่างไรก็ตาม เมื่อพิจารณาว่ายังมีงานจำนวนหนึ่งและมีความยากในการเขียน MembershipProvider ให้สมบูรณ์ สำหรับเรา อาจมีที่เพิ่มเติมในการขยายผู้ให้บริการที่มีอยู่ เช่น SqlMembershipProvider อันที่จริงมันง่ายมาก เราเพียงต้องการสืบทอดจาก SqlMembershipProvider (บอกคุณอย่างเงียบ ๆ ว่าสิ่งที่บันทึกไว้ในพารามิเตอร์การกำหนดค่าของวิธีการเตรียมใช้งานคือชื่อแอตทริบิวต์และค่าของส่วนการกำหนดค่าที่เกี่ยวข้องของผู้ให้บริการ) จากนั้นจึงขยายและ เขียนวิธีการที่จำเป็นอีกครั้ง เมื่อใช้งาน ในส่วนการกำหนดค่าของผู้ให้บริการ ให้เปลี่ยนค่าประเภทเป็นชื่อคลาสของคุณ จากนั้นจึงจะเรียบร้อย
สุดท้ายนี้ มี MembershipProviders จำนวนมากอยู่แล้วในสภาพแวดล้อมที่แตกต่างกันในตลาด เช่น mysql, Oracle เป็นต้น นี่คือการใช้งาน Mysql: http://www.codeproject.com/aspnet/mysqlmembershipprovider.asp มีการใช้งานที่แตกต่างกันมากขึ้น ฉันเชื่อว่าคุณสามารถรับความช่วยเหลือเพิ่มเติมจาก Google ได้
โอเค ฉันพูดมากเกินไป ฉันหวังว่ามันจะเป็นประโยชน์กับคุณที่ประสบปัญหาในการอ่านบล็อกนี้ ขอบคุณ ^ _ *