ใน ASP.NET 2.0 ฟังก์ชันผู้ให้บริการสมาชิกที่เพิ่มเข้ามาใหม่ รวมกับชุดการควบคุมการลงทะเบียนและเข้าสู่ระบบที่มีประสิทธิภาพ สามารถจัดการการเข้าสู่ระบบและการอนุญาตของผู้ใช้ได้อย่างง่ายดาย (ดู << บทนำเกี่ยวกับการควบคุมการเข้าสู่ระบบ ASP.NET 2.0 >>)
อย่างไรก็ตาม คุณอาจพบว่าฟังก์ชันการควบคุมการเข้าสู่ระบบและการจัดการสมาชิกที่มาพร้อมกับ ASP.NET 2.0 นั้นใช้กับ SQL Server 2005 Express ตามค่าเริ่มต้น ดังนั้น จะเปลี่ยนไปใช้ SQL Server 2000 หรือแหล่งข้อมูลอื่น ๆ ได้อย่างไร เช่น การเข้าถึง , ออราเคิล ฯลฯ ? หากคุณต้องการเขียนแอปพลิเคชันใหม่เพื่อจัดการผู้ใช้ที่เข้าสู่ระบบหรือสิทธิ์ผู้ใช้ในแอปพลิเคชันของคุณ คุณควรแก้ไขอย่างไร ในบทความนี้ เราจะแสดงวิธีการใช้ผู้ให้บริการที่กำหนดเองใน ASP.NET 2.0 เพื่อร่วมมือกับการควบคุมการเข้าสู่ระบบเพื่อใช้กระบวนการเข้าสู่ระบบแบบง่ายๆ
เพื่อให้เข้าใจถึงวิธีการทำงานของผู้ให้บริการใน ASP.NET 2.0 ให้ดูที่แผนภาพโครงสร้างต่อไปนี้ก่อน:
ชื่อฟิลด์ ประเภทข้อมูล ขนาดฟิลด์ ชื่อผู้ใช้ (รหัส) ข้อความ 8 ข้อความรหัสผ่าน 8 ข้อความอีเมล 50 ข้อความคำถามรหัสผ่าน 50 รหัสผ่านตอบข้อความ 50 |
คลาสสาธารณะ ModifiedSqlMembershipProvider สืบทอด SqlMembershipProvider ฟังก์ชั่นการแทนที่สาธารณะ CreateUser (...) - ฟังก์ชันสิ้นสุด - คลาสสิ้นสุด |
ถ้าคุณไม่ต้องการใช้ SqlMembershipProvider ที่ให้ไว้ใน Visual Studio 2005 beta 2 คุณจะต้องประกาศคลาสของคุณเองและสืบทอดคลาส MembershipProvider เท่านั้น คลาMembershipProviderประกอบด้วยวิธีการและคุณสมบัติที่เกี่ยวข้องกับการเป็นสมาชิก
ใน Solution Explorer ใช้ "เพิ่มรายการใหม่..." เพื่อเพิ่มคลาส ตั้งชื่อเป็น AccessMembershipProvider.vb และปฏิบัติตามระบบพร้อมท์เพื่อวางคลาสไว้ในไดเร็กทอรี App_Code
ถัดไป อ้างอิงเนมสเปซที่เกี่ยวข้องและเขียนเฟรมเวิร์กของโปรแกรมดังต่อไปนี้:
นำเข้า Microsoft.VisualBasic
นำเข้า System.Data
Public Class AccessMembershipProvider
สืบทอด MembershipProvider
เพื่อที่จะใช้ผู้ให้บริการที่กำหนดเอง
End Class
ต้องทำการกำหนดค่าที่เกี่ยวข้องใน web.configคุณสามารถเพิ่มไฟล์ web.config ใหม่และเขียนโค้ดต่อไปนี้:
<system.web>
<โหมดการรับรองความถูกต้อง = "แบบฟอร์ม"/>
<การเป็นสมาชิก
defaultProvider="AccessMembershipProvider">
<ผู้ให้บริการ>
<เพิ่มชื่อ = "AccessMembershipProvider"
type="AccessMembershipProvider"
ต้องการคำถามและคำตอบ = "จริง"
ConnectionString="ผู้ให้บริการ=Microsoft.Jet.
OLEDB.4.0;แหล่งข้อมูล=C:NewMembershipProvider
App_DataMembers.mdb ยังคงมีความปลอดภัย
ข้อมูล=เท็จ" />
</ผู้ให้บริการ>
</สมาชิกภาพ>
</system.web>
ในหมู่พวกเขา โปรดใส่ใจกับประเด็นต่อไปนี้:
ต้องเลือกวิธีการรับรองความถูกต้องเป็น "แบบฟอร์ม" (โหมดการรับรองความถูกต้อง = "แบบฟอร์ม")
โดยใช้แท็ก <เพิ่ม> เพิ่มผู้ให้บริการที่กำหนดเองชื่อ AccessMembershipProvider .
แอ็ตทริบิวต์ needQuestionAndAnswer เมื่อค่าเป็นจริง บ่งชี้ว่าในระหว่างการลงทะเบียนใหม่ ต้องกรอกคำถามและคำตอบพร้อมท์ที่จะตอบ
ConnectionString ระบุสตริงการเชื่อมต่อเพื่อเชื่อมต่อกับฐานข้อมูล
แอตทริบิวต์ DefaultProvider ระบุว่าผู้ให้บริการรายใดที่ระบบใช้เป็นค่าเริ่มต้น เนื่องจากสามารถตั้งค่าผู้ให้บริการหลายรายในระบบได้
ใน AccessMembershipProvider.vb ให้เพิ่มสมาชิกส่วนตัวต่อไปนี้
ConnStr As String
การสื่อสารส่วนตัวในฐานะ OleDb.OleDbCommand ใหม่
ส่วนตัว _requiresQuestionAndAnswer เป็นบูลีน
Private _minRequiredPasswordLength As Integer
และเพิ่มวิธี Initialize() โดยโค้ดจะเป็นดังนี้
Public Overrides Sub Initialize(ByVal name As String, ByVal config As System.Collections.Specialized.NameValueCollection)
'===ดึงค่าแอ็ตทริบิวต์ที่ตั้งไว้ใน
'web.config และกำหนดให้กับตัวแปรท้องถิ่น===
ถ้า config("requiresQuestionAndAnswer") = "true" แล้ว _
_requiresQuestionAndAnswer = จริง
connStr = config("connectionString")
MyBase.Initialize (ชื่อ, config)
สิ้นสุด Sub
เมื่อโหลดผู้ให้บริการแล้ว จะเรียกใช้เมธอด Initialize() ในไฟล์ web.config เมื่อสักครู่นี้ ค่าแอตทริบิวต์ต่างๆ ที่ตั้งค่าโดยใช้แท็ก <add> สามารถอ่านได้ในวิธีนี้ ตัวอย่างเช่น สามารถอ่านได้โดยใช้พารามิเตอร์ config ในโค้ดข้างต้น config("connectionString") ใช้เพื่ออ่านสตริงการเชื่อมต่อฐานข้อมูลและใส่ไว้ในตัวแปร connStr หลังจากนั้น ให้ตั้งค่าคุณสมบัติ RequiresQuestionAndAnswer ดังนี้:
Public Overrides ReadOnly Property _
ต้องการคำถามและคำตอบ() _
เป็นบูลีน
รับ
ถ้า _requiresQuestionAndAnswer = True แล้ว
กลับเป็นจริง
อื่น
กลับเท็จ
สิ้นสุดถ้า
จบรับ
คุณสมบัติสิ้นสุด
โปรดทราบว่าต้องตั้งค่าของคุณสมบัตินี้ มิฉะนั้น ในตัวควบคุม CreateUserWizard กล่องข้อความสองกล่องของคำถามพร้อมท์รหัสผ่านและคำตอบพร้อมท์รหัสผ่านจะไม่ปรากฏขึ้น
ต่อไปเราสามารถเริ่มเขียนโค้ดเพื่อสร้างผู้ใช้ใหม่ได้ รหัสของเมธอด CreateUser() มีดังนี้:
Public Overrides Function CreateUser(ByVal username As String, ByValpass As String, ByVal email As String, ByValpasswordQuestion As String) , รหัสผ่าน ByValAnswer As String , ByVal ได้รับการอนุมัติเป็นบูลีน, ByVal providerUserKey As Object, สถานะ ByRef As System.Web.Security.MembershipCreateStatus) As System.Web.Security.MembershipUser
Dim conn เป็น OleDb.OleDbConnection ใหม่ (connStr)
พยายาม
con.เปิด()
Dim sql As String = "ใส่ค่าสมาชิก (" & _
"@ชื่อผู้ใช้, @รหัสผ่าน, @อีเมล, " & _
" @passwordQuestion, @passwordAnswer )"
Dim comm เป็นใหม่ OleDb.OleDbCommand (sql, conn)
comm.Parameters.AddWithValue("@ชื่อผู้ใช้", ชื่อผู้ใช้)
comm.Parameters.AddWithValue("@password", รหัสผ่าน)
comm.Parameters.AddWithValue("@email", อีเมล)
comm.Parameters.AddWithValue("@passwordQuestion", รหัสผ่านคำถาม)
comm.Parameters.AddWithValue("@passwordAnswer", รหัสผ่านAnswer)
ผลลัพธ์ติ่มซำเป็นจำนวนเต็ม = comm.ExecuteNonQuery()
สถานะ
conn.Close()
= MembershipCreateStatus.Success
ผู้ใช้ Dim ในฐานะผู้ใช้สมาชิกใหม่ ("AccessMembershipProvider", ชื่อผู้ใช้, ไม่มีอะไร, อีเมล, คำถามรหัสผ่าน, ไม่มีอะไร, จริง, เท็จ, ตอนนี้, ไม่มีอะไร, ไม่มีอะไร, ไม่มีอะไร, ไม่มีอะไร)
ส่งคืนผู้ใช้
จับอดีตเป็นข้อยกเว้น
สถานะ = MembershipCreateStatus.UserRejected
กลับไม่มีอะไร
สิ้นสุดการลอง
End Function
มาตีความโค้ดด้านบนกันก่อน ขั้นแรก เราแทรกบันทึกลงในฐานข้อมูล หลังจากเพิ่มผู้ใช้ใหม่สำเร็จแล้ว เราจะต้องส่งคืนสถานะข้อมูลสถานะ (สถานะถูกส่งผ่านเป็นสถานะ ByRef As System.Web.Security .MembershipCreateStatus method) และเราต้องการส่งคืนอินสแตนซ์ของคลาส MembershipUser ดังนั้นเราจึงส่งคืนอินสแตนซ์ในลักษณะนี้:
Dim user As New MembershipUser("AccessMembershipProvider", ชื่อผู้ใช้, Nothing, email,passwordQuestion, Nothing, True , False, Now, Nothing, Nothing, Nothing, Nothing)
ในหมู่พวกเขามี Constructor มากมายที่ใช้วิธีการของคลาส MembershipUser สำหรับรายละเอียด คุณสามารถตรวจสอบ MSDN ได้ ที่นี่เราใช้เฉพาะชื่อผู้ใช้ อีเมล รหัสผ่านคำถาม วันที่สร้าง (วันที่สร้างบัญชี ตอนนี้คือ) ใช้ที่นี่)
ในหน้าเข้าสู่ระบบ เพื่อตรวจสอบว่าผู้ใช้ที่ถูกต้องเข้าสู่ระบบหรือไม่ คุณต้องเขียนโค้ดต่อไปนี้:
Public Overrides Function ValidateUser( _
ชื่อผู้ใช้ ByVal เป็นสตริง _
รหัสผ่าน ByVal เป็นสตริง) เป็นบูลีน
Dim conn เป็นใหม่ OleDb.OleDbConnection (connStr)
พยายาม
con.เปิด()
หรี่ sql เป็นสตริง = _
"เลือก * จากการเป็นสมาชิก WHERE" & _
" ชื่อผู้ใช้=@ชื่อผู้ใช้ และ รหัสผ่าน=@รหัสผ่าน "
Dim comm เป็นใหม่ OleDb.OleDbCommand (sql, conn)
comm.Parameters.AddWithValue("@ชื่อผู้ใช้", _
ชื่อผู้ใช้)
comm.Parameters.AddWithValue("@รหัสผ่าน", _
รหัสผ่าน)
เครื่องอ่าน Dim เป็น OleDb.OleDbDataReader = _
com.ExecuteReader
หากผู้อ่านมีแถวแล้ว
กลับเป็นจริง
อื่น
กลับเท็จ
สิ้นสุดถ้า
conn.Close()
จับอดีตเป็นข้อยกเว้น
Console.Write (เช่น ToString)
กลับเท็จ
สิ้นสุดการลอง
ฟังก์ชั่นสิ้นสุด
เป็นเช่นนี้ ผู้ให้บริการแบบกำหนดเองแบบง่ายๆ เสร็จสมบูรณ์ ซึ่งสามารถใช้ร่วมกับการเข้าสู่ระบบ การลงทะเบียน และการควบคุมอื่นๆ เมื่อคุณรันโปรแกรม หน้าลงทะเบียนผู้ใช้จะปรากฏขึ้นเป็นครั้งแรก เมื่อผู้ใช้ลงทะเบียนสำเร็จ ผู้ใช้จะถูกพาไปยังหน้าเข้าสู่ระบบ ดังแสดงในรูปต่อไปนี้: