Xem mẫu

  1. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 Chương 4 Membership and User Profiling **** 1/ Thiết kế Để thiết lập bảo vệ, các "khách hàng ảo" đã có một membership system xử lý các hoạt động và các tính năng sau đây: - Người sử dụng phải có khả năng tạo ra các tài khoản mới độc lập, bằng cách điền vào một mẫu đăng ký trực tuyến. - Người sử dụng phải có khả năng thay đổi thông tin của mình sau này hoặc phục hồi chúng nếu họ quên. - Các quản trị viên phải có khả năng cho phép hoặc từ chối quyền truy cập vào phần cụ thể hoặc các trang cá nhân của một số người sử dụng. Các quyền truy cập cần được chỉnh sửa, ngay cả sau khi triển khai các trang web mà không cần sự can thiệp của một người phát triển phức tạp để thay đổi mã hoặc cài đặt. - Các quản trị viên phải có khả năng đình chỉ tạm thời hoặc vĩnh viễn một tài khoản người dùng, chẳng hạn như khi một người dùng không tôn trọng của trang web của chính sách thực hiện. - Các quản trị viên sẽ có thể xem tóm tắt và thống kê dữ liệu như là số tổng số người dùng đăng ký và làm thế nào để nhiều người trong số họ đang trực tuyến tại một thời điểm nào. Các quản trị viên cũng có thể muốn biết cụ thể khi người dùng đăng ký, và thời gian qua mà họ đăng nhập - Một profiling system nên cho phép mỗi người sử dụng đã đăng ký để lưu dữ liệu như các trang web và sở thích chi tiết cá nhân trong một lưu trữ dữ liệu (như là một cơ sở dữ liệu), vì vậy mà các thông tin sẽ được nhớ khi trở lại trang trong tương lai. Các quản trị viên phải có thể xem và chỉnh sửa hồ sơ của mỗi người sử dụng. ASP.NET 2,0 giới thiệu một số lớn các tính năng mới có thể trợ giúp để phát triển thành viên Subsystem. www.bqa.com.vn www.bsm.com.vn Page 1
  2. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 Các cơ chế lưu trữ mật khẩu Hiện có ba phương pháp cơ bản để lưu mật khẩu, với mỗi phương pháp cung cấp sự tương thích khác nhau giữa bảo mật và sự tiện lợi của việc phát triển, các quản trị viên, và người sử dụng. 1. Các phương pháp tiện lợi nhất cho các nhà phát triển lưu trữ mật khẩu và các quản trị viên là lưu trữ các mật khẩu như văn bản thuần tuý trong một trường của cơ sở dữ liệu. Điều này cũng thuận tiện cho người sử dụng bởi vì bạn có thể dễ dàng gửi email mật khẩu của một người sử dụng cho họ trong trường hợp họ quên nó. Tuy nhiên, đây là lựa chọn ít an toàn nhất, vì tất cả các mật khẩu được lưu trữ như văn bản thuần tuý , nếu cơ sở dữ liệu của bạn đã được công bởi một hacker, anh ta có thể dễ dàng truy cập vào mật khẩu của tất cả mọi người. Bạn cần phải hết sức cẩn thận về các khóa xuống cơ sở dữ liệu của bạn và đảm bảo rằng bạn của bạn bản đảm an toàn trong sao lưu cơ sở dữ liệu. 2. Để tăng cường an ninh cho lưu trữ mật khẩu, bạn có thể mã hóa các mật khẩu trước khi lưu trữ chúng trong một cơ sở dữ liệu. Có nhiều cách để mã hoá mật khẩu, nhưng phổ biến nhất là symmetric encryption, Trong đó sử dụng một hệ thống mật khẩu được mã hoá cho tất cả các người dừng. Đây là mật mã hai chiều: Bạn có thể mã hóa một mật khẩu và cũng có thể giải mã nó sau này. Điều này cung cấp các phương tiện thuận lợi cho các nhà phát triển, nhưng vẫn còn cung cấp nhiều tiện lợi cho người dùng bởi vì bạn vẫn có thể gửi email cho họ khi họn quên mật khẩu . 3. Mức cao nhất về an ninh đòi hỏi một hình thức mã hóa ngăn cản mà các quản trị viên và các nhà phát triển từ được quyền truy cập vào bất kỳ của người sử dụng mật khẩu của bạn. Điều này sử dụng loại mật mã một chiều được gọi là hashing. Bạn luôn luôn có thể mã hóa một mật khẩu bằng cách hashing mật khẩu với một thuật toán nhưng bạn có thể không bao giờ giải mã nó. Vì thế, bạn lưu trữ các phiên bản hashed mật khẩu, và sau này, khi bạn muốn xác minh mật khẩu của một người sử dụng khi anh ta đăng nhập lại một lần nữa, bạn có thể thực hiện cùng một thuật toán hashing với mật khẩu mà anh ta nhập vào. Sau đó bạn có thể so sánh hash này so với hash bạn được lưu trữ trong cơ sở dữ liệu - nếu hai cái trùng nhau bạn biết được người dùng nhập gõ mật khẩu của mình chính xác. Điều này cung cấp một số ít tiện lợi cho người phát triển, các quản trị viên, và người dùng bởi vì không thể gửi e-mail khi đã quên mật khẩu. Thay vào đó, nếu một người sử dụng quên mật khẩu của mình, sự lựa chọn duy nhất của bạn là thay đổi mật khẩu của người dùng để có một giá trị biết được, và sau đó lưu hash cho mật khẩu mới. Hashing (phương pháp 3) đã được sử dụng trong ấn bản đầu tiên của cuốn sách này, nhưng nó gây ra rất nhiều rắc rối cho các quản trị viên và thất vọng cho người dùng bởi vì người dùng thường thích có thể chọn "khôi phục" một mất mật khẩu mà không có một yêu cầu mới. Chúng tôi sẽ sử dụng mật mã Symmetric (phương pháp 2) trong ấn bản này, nhưng xin vui lòng ghi nhớ rằng mật khẩu hashes phải luôn luôn được sử dụng để bảo vệ các trang web có chứa dữ liệu tài chính hoặc các dữ liệu rất nhạy cảm (chẳng hạn như hồ sơ y tế, bài kiểm tra điểm số, vv). Phần lớn người dùng sẽ không muốn để xem các mật khẩu bí mật ngân hàng gửi tới trong một e-mail, và hầu hết thậm chí không muốn nhân viên của ngân hàng để có thể truy cập vào mật khẩu. Một nhân viên của ngân hàng là người đáng tin cậy hôm nay có thể trở thành một cựu nhân viên không được bằng lòng ngày mai, và rất hay để biết rằng anh ta sẽ không được dùng mật khẩu của bạn! Chế độ xác thực: Windows Security hoặc tùy chỉnh Đăng nhập? www.bqa.com.vn www.bsm.com.vn Page 2
  3. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 Việc đầu tiên bạn phải quyết định khi nào bạn thiết lập một cơ chế bảo mật cho một trang web được cho biết là bạn muốn sử dụng Windows hay forms xác thực. Cửa sổ xác thực là dễ nhất để thiết lập và sử dụng, trong khi các hình thức xác nhận yêu cầu bạn tạo một cơ sở dữ liệu và một biểu mẫu đăng nhập. Windows security thường là lựa chọn tốt nhất khi bạn đang phát triển một Intranet cho các trang web mà tất cả các người dùng có thể truy cập vào và được truy cập bởi người dùng của một mạng nội bộ của công ty (nơi mà họ có tên miền tài khoản người dùng). Với Windows security, người dùng được sử dụng bị giới hạn các trang web chính thức mà không cần phải đăng nhập vào trang web, trang web được thực hiện theo yêu cầu của người sử dụng, và hạn chế về an ninh sẽ được tự động thi hành trên tất cả các nguồn cho các mã cố truy cập và sử dụng (thường là các tập tin và các đối tượng cơ sở dữ liệu). Một lợi thế là Windows sẽ lưu trữ an toàn và mã hóa thông tin người dùng. Tuy nhiên, yêu cầu phải có một tài khoản mạng là một thiệt thòi rất lớn mà làm cho nó là sự lựa chọn không tốt cho trang web trên Internet. Nếu bạn sử dụng Windows security cho người sử dụng nằm ở bên ngoài của một mạng của công ty, công ty sẽ được yêu cầu để tạo ra một mạng lưới tài khoản người dùng cho mỗi trang web người sử dụng, mà nó làm chậm cho người dùng để truy cập và tốn kém cho các công ty quản lý. Trong khi bạn có thể viết một số mã để tự động tạo ra tài khoản mạng của Windows, và có thể viết một trang đăng nhập sử dụng Windows mạo danh cảnh phía sau. Quan trọng những tính năng mới được giới thiệu trong ASP.NET 2,0 là hỗ trợ cookieless clients trong các hình thức xác thực. ASP.NET 1.x hỗ trợ các chế độ cookieless chỉ dành cho biến Session, nhưng không phải để xác thực, và bạn đã sử dụng workarounds để làm cho nó làm việc cho cookieless xác thực. Bây giờ bạn chỉ có để đặt yếu tố của cookieless thuộc tính trong web.config cho đúng hoặc vào AutoDetect. Với AutoDetect, ASP.NET kiểm tra việc của người dùng trình duyệt hỗ trợ các tập tin cookie, và nếu như vậy, sử dụng một tập tin cookie để lưu trữ một Session ID. Nếu một người sử dụng của trình duyệt không hỗ trợ các tập tin cookie, sau đó sẽ vượt qua các ASP.NET Session ID trong URL. Chỉ có những người sử dụng không hỗ trợ cookies phải thấy một đoạn dài và xấu xí Session ID trong URL. www.bqa.com.vn www.bsm.com.vn Page 3
  4. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 The "Let's Do Everything on Our Own" Approach Thiết kế một mô-đun để xử lý người dùng và các hồ sơ thành viên không phải là dễ dàng. Nó ng có vẻ đặc biệt khó khăn ở đầu tiên: Bạn có thể dễ dàng chia một vài bảng trong một số cơ sở dữ liệu để lưu trữ dữ liệu (roles, account credentials and details, the associations between roles and accounts, and account profiles) và một API cho phép các nhà phát triển để yêu cầu, tạo, và sửa đổi các dữ liệu này. Tuy nhiên, điều hiếm khi được dễ dàng như chúng xuất hiện lần đầu tiên! Bạn không được giảm bớt các thành phần của các mô-đun, vì chúng là rất quan trọng cho hoạt động của trang web, và thiết kế các mô-đun đúng là rất quan trọng bởi vì tất cả các trang web khác dựa vào mô-đun đó. Nếu bạn thiết kế và triển khai thực hiện những mô-đun tin tức kém, bạn có thể quay trở lại và sửa chữa nó mà không ảnh hưởng đến tất cả các trang web khác của mô-đun (diễn đàn, thương mại điện tử, thư thông báo, phiếu thăm dò ý kiến, vv). Tuy nhiên, nếu bạn quyết định để thay đổi thiết kế của các mô-đun thành viên sau khi bạn đã phát triển mô-đun khác có sử dụng nó, có thển là tốt, bạn sẽ cần phải sửa đổi gì đó trong những mô-đun tốt hơn. Những mô-đun thành viên phải được hoàn thành, nhưng cũng đơn giản để sử dụng, và các nhà phát triển sẽ có thể sử dụng các lớp và phương thức khi họ thiết kế trang quản lý. Họ cũng có thể tạo và chỉnh sửa các tài khoản người dùng bằng cách ghi một vài dòng mã hoặc, nhưng vẫn tốt hơn, không có ở tất cả các mã. ASP.NET 1,1 cung cấp một khuôn khổ là một phần an ninh cho phép bạn xác định vai trò mà có thể hoặc không thể truy cập các trang web hoặc thư mục cụ thể xác định vai trò của các hạn chế trong web.config. Nó cũng đã tạo ra một mật mã xác thực cho người sử dụng tập tin cookie, một khi người dùng đăng nhập. Tuy nhiên, nhà phát triển đã được hoàn toàn chịu trách nhiệm về tất cả các công việc của các văn bản đăng nhập và đăng ký các trang web, xác nhận người sử dụng, gán cho đúng vai trò, và quản lý các tài khoản. Trong những ấn bản đầu tiên của cuốn sách này, chúng tôi đã làm tất cả những gì có thể, với các mã tùy chỉnh. Các giải pháp làm việc tốt, nhưng vẫn bị một vài vấn đề: 1. Các nhà phát triển đã thực hiện tất cả các chương trình kiểm tra an ninh, thông thường là trong sự kiện Page_Load, trước khi làm bất cứ điều gì khác. Nếu bạn sau này muốn thêm vào vai trò người sử dụng hoặc các ACL (danh sách kiểm soát truy cập) của một trang web hoặc trang web của khu vực, bạn phải chỉnh sửa mã, biên tập lại, và tái triển khai việc cài đặt 2. Các thành viên cũng bao gồm hệ thống hồ sơ người dùng. Cơ sở dữ liệu đã có bảng của người sử dụng đầu tiên và cuối cùng tên, địa chỉ, ngày tháng năm sinh và các dữ liệu liên quan. Tuy nhiên, lược đồ bảng đã được cố định, do đó, nếu bạn muốn có thêm nhiều thông tin hơn để các hồ sơ sau này, bạn phải thay đổi cơ sở dữ liệu, các thủ tục liên quan đến lưu trữ, và nhiều phương pháp API, thêm vào giao diện người dùng để chèn dữ liệu. Những điều có thể đã được thực hiện linh hoạt hơn, nhưng nó có nhiều khó khăn để phát triển. Bạn cần phải cân nhắc những lợi thế về thiết kế có tính mở rộng so với thời gian và nỗ lực để thực hiện nó. May mắn thay, ASP.NET 2,0 đã có đầy đủ-đặc trưng và các hồ sơ thành viên. Vâng, đó là đúng, bạn không cần phải viết một dòng mã để đăng ký người sử dụng, bảo vệ các trang quan trị, và kết hợp một cấu hình cho người sử dụng, trừ khi bạn muốn tuỳ chỉnh cách thức chúng hoạt động (ví dụ, để thay đổi định dạng trong đó các dữ liệu này được lưu giữ, hoặc các phương tiện lưu trữ riêng của mình). Phần này lần đầu tiên giới thiệu việc xây dựng và bảo mật hồ sơ trong khuôn khổ ASP.NET 2,0; sau www.bqa.com.vn www.bsm.com.vn Page 4
  5. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 đó, bạn sẽ tìm hiểu làm thế nào để thuận tiện sử dụng nó trong dự án riêng của bạn thay vì giải pháp của riêng bạn Membership và lớp MembershipUser Các lớp bảo mật chính của ASP.NET 2,0 trong System.Web.Security.Membership, chứa 1 trong static-methods để tạo, xóa, cập nhật, và lấy các người dùng đăng ký. Bảng sau đây mô tả các phương pháp quan trọng nhất. Phương thức Diễn tả CreateUser Tạo tài khoản mới DeleteUser Xóa tài khoản người dùng FindUsersByEmail Trả về một mảng của người sử dụng với các địa chỉ e-mail cung cấp. Nếu SQL Server được sử dụng để lưu trữ các tài khoản, các dữ liệu vào e- mail có thể chứa bất kỳ ký tự đại diện ký tự được hỗ trợ bởi SQL Server trong lệnh “LIKE”, chẳng hạn như % cho bất kỳ chuỗi số không hay nhiều ký tự, or _ cho một ký tự.. FindUsersByName Trả về một mảng của người sử dụng với các tên cung cấp. Ký tự đại diện ký tự được hỗ trợ. GeneratePassword Tạo ra một mật khẩu mới với chiều dài chỉ định. Và chỉ rõ số ký số GetAllUsers Trả về một mảng chứa các tài khoản đã đăng ký GetNumberOfUsersOnline Cho biết số thành viên đang online GetUser Tìm một người sử dụng cụ thể theo tên GetUserNameByEmail Trả về username của người dùng với email được cung cấp UpdateUser Cập nhật một người dùng ValidateUser kiểm tra tính hợp lệ của tài khoản, trả về kiểu boolen Một số trong những phương thức (CreateUser, GetAllUsers, GetUser, FindUsersByName, FindUsersByEmail và UpdateUser) chấp nhận hoặc trả lại theo gợi ý của lớp System.Web.Security.MembershipUser, trong đó đại diện cho một người sử dụng, và cung cấp khá nhiều thông tin chi tiết về nó. Bảng sau đây mô tả các thuộc tính và phương thức được trình bày của lớp này. www.bqa.com.vn www.bsm.com.vn Page 5
  6. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 Thuộc tính Diễn giải Comment Một ý kiến (thường là nhập của người quản trị) kết hợp với một người sử dụng CreationDate Ngay khi người dùng đăng ký Email địa chỉ e-mail của người sử dụng IsApproved Cho biết các tài khoản được kích hoạt, và cho người sử dụng có thể đăng nhập IsLockedOut Cho biết các tài khoản người dùng đã được vô hiệu hoá sau khi một số tên đăng nhập không hợp lệ. Điều này là thuộc tính chỉ đọc, và các quản trị viên chỉ có thể gián tiếp cài đặt nó trở lại sai, bằng cách gọi phương thức UnlockUser được mô tả dưới đây. IsOnline Cho biết người sử dụng hiện nay đang trực tuyến LastActivityDate Ngay khi người dùng đăng nhập vào hoặc cuối cùng đã được xác nhận. Nếu lần đăng nhập cuối cùng đã được cố định, điều này sẽ không nhất thiết phải là ngày đăng nhập, nhưng nó có thể là ngày khi người sử dụng truy cập trang web và tự động đã được xác thực thông qua các tập tin cookie. LastLockoutDate Ngay khi người sử dụng đã được khóa tự động bởi hệ thống thành viên, sau khi một (cấu hình) số đăng nhập không hợp lệ LastLoginDate ngày cuối cùng đăng nhập LastPasswordChangedDate Khi người sử dụng cuối cùng thay đổi mật khẩu của mình PasswordQuestion Các câu hỏi để hỏi người sử dụng khi họ quên mật khẩu - được sử dụng để chứng minh nó thực sự là của họ UserName Username của người dùng Thuộc tính Diễn giải ChangePassword Thay đổi mật khẩu của người sử dụng. Mật khẩu hiện thời phải được cung cấp. ChangePasswordQuestionAndAnswer Thay đổi câu hỏi và câu trả lời được hỏi của một người sử dụng quên mật khẩu của mình. Cần phải nhập mật khẩu mới (để người nào đó không thể thay đổi mật khẩu này cho một người nào khác). GetPassword Trả lại mật khẩu hiện tại của bạn. Tùy thuộc vào cách thức hệ thống thành viên được thiết lập, nó có thể yêu cầu câu trả lời cho những câu hỏi của mật khẩu người sử dụng như là đầu www.bqa.com.vn www.bsm.com.vn Page 6
  7. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 Thuộc tính Diễn giải vào và sẽ không làm việc nếu chỉ một mật khẩu hash được lưu trong cơ sở dữ liệu. ResetPassword Tạo ra một mật khẩu mới cho người sử dụng. Đây chỉ là chức năng để thay đổi mật khẩu nếu các thành viên hệ thống đã được thiết lập để hash mật khẩu. UnlockUser Mở khóa người dùng, nếu trước đó họ đã được khóa bởi hệ thống vì lý do quá nhiều nỗ lực đăng nhập không hợp lệ Khi bạn thay đổi một thuộc tính của người sử dụng, các giá trị mới không phải là ngay lập tức được lưu trữ, bạn cần phải gọi phương thức UpdateUser của Membership class để làm điều đó. Điều này được thực hiện để bạn có thể gọi để có cập nhật nhiều thuộc tính của người dùng, và do đó cải thiện hiệu suất. Bằng cách sử dụng hai lớp với nhau, bạn có thể quản lý các dữ liệu tài khoản một cách trực quan và đơn giản. Nó ở ngoài phạm vi của cuốn sách này để cung cấp chi tiết của tất cả các phương thức và overload, nhưng tôi có thể cho bạn thấy một số ví dụ về cách sử dụng trong thực tế của họ - xin vui lòng tham khảo MSDN cho tất cả các chi tiết về các lớp . Dưới đây là một số mã cho đăng ký một tài khoản mới và xử lý các trường hợp ngoại lệ mà có thể được nâng lên, nếu một tài khoản với tên người dùng chỉ định hoặc địa chỉ e-mail đã tồn tại: string msg = "User created successfully!"; try { MembershipUser newUser = Membership.CreateUser( "Marco", "secret", "mbellinaso@wrox.com"); } catch (MembershipCreateUserException exc) { msg = "Unable to create the user. "; switch (exc.StatusCode) { case MembershipCreateStatus.DuplicateEmail: msg += "An account with the specified e-mail already exists."; break; case MembershipCreateStatus.DuplicateUserName: msg += "An account with the specified username already exists."; break; case MembershipCreateStatus.InvalidEmail: msg += "The specified e-mail is not valid."; break; case MembershipCreateStatus.InvalidPassword: www.bqa.com.vn www.bsm.com.vn Page 7
  8. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 msg += "The specified password is not valid."; break; default: msg += exc.Message; break; } } lblResult.Text = msg; Nếu bạn muốn thay đổi một số thông tin của người sử dụng, trước hết bạn lấy một MembershipUser là đại diện cho người sử dụng, thay đổi một số thuộc tính như mong muốn, và sau đó cập nhật người sử dụng, như được hiển thị dưới đây: MembershipUser user = Membership.GetUser("Marco"); if (DateTime.Now.Subtract(user.LastActivityDate).TotalHours < 2) user.Comment = "very knowledgeable user; strong forum participation!"; Membership.UpdateUser(user); Để xác nhận hiệu lực người dùng khi đăng nhập chỉ cần một dòng mã (và thậm chí không có, vì bạn sẽ thấy ngắn): BOOL isValid = Membership.ValidateUser ( "Marco", "secret"); Trong chương này, bạn sẽ sử dụng các lớp , để thực hiện các tính năng sau đây trong trang quản trị:  Lấy tổng số người sử dụng và xác định xem có bao nhiêu người trong số họ đang trực tuyến.  Tìm người sử dụng bằng một phần của tên người dùng hoặc địa chỉ e-mail.  Hiển thị một số thông tin trả về người sử dụng được tìm kiếm, được liệt kê trong một lưới , ví dụ như ngày người sử dụng cuối cùng hoạt động và cho dù họ đang hoạt động hay không. Trong một trang khác, chúng tôi sẽ hiển thị tất cả các chi tiết của một người sử dụng cụ thể và sẽ cho phép người quản trị có thể thay đổi một số chi tiết www.bqa.com.vn www.bsm.com.vn Page 8
  9. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 The Provider Model Design Pattern Tôi sử dụng thuật ngữ "data store" để tham khảo các vật lý phương tiện nào để lưu dữ liệu – điều này có nghĩa là các dữ liệu lưu trong một cơ sở dữ liệu hoặc trong Active Directory, nhưng .NET trừu tượng cơ chế lưu trữ dữ liệu từ các lớp thao tác dữ liệu. Lớp provider là một lớp lưu trữ dữ liệu đại diên các lớp khác để thao tác dữ liệu. Điều này cung cấp mô hình thiết kế, được giới thiệu trong Chương 3, là pervasive .NET 2,0 - bạn có thể thường xuyên "plug in" khác nhau cùng nhà cung cấp để thay đổi cơ chế, được sử dụng để lưu và phục hồi dữ liệu. Các Membership class sử dụng một lớp thứ hai (được gọi là Membership provider) mà thực sự biết thông tin chi tiết của một dữ liệu lưu trữ và thực hiện tất cả các hỗ trợ logic để đọc và ghi dữ liệu vào / từ nó. Bạn có thể nghĩ rằng hầu hết các Membership provider như là một lớp business (trong đó chỉ có thao tác dữ liệu), và các lớp provider cung cấp dịch vụ truy cập dữ liệu lớp này cung cấp các chi tiết của thao tác. Hai built-in trong providers sẵn có cho các hệ thống thành viên, và bạn có thể chọn một trong các cài đặt trong tập tin web.config. Các built-in là providers cho SQL Server 2000/2005 (SqlMembershipProvider) và cho Active Directory (ActiveDirectoryMembershipProvider), nhưng bạn cũng có thể viết thư riêng của bạn hoặc tìm từ một bên thứ ba (để sử dụng với Oracle, MySQL, DB2, vv ., hoặc có thể tệp tin XML). Hình 4-1 cung cấp một hình ảnh đại diện của các nhà cung cấp dịch vụ thiết kế mô hình mẫu. www.bqa.com.vn www.bsm.com.vn Page 9
  10. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 Tôi thấy rằng việc sử dụng các mô hình provider cung cấp sự linh hoạt lớn, bởi vì bạn có thể thay đổi provider được sử dụng bởi các thành viên API bên trên mà không ảnh hưởng tới phần còn lại của mã, bởi vì bạn chỉ cần truy cập vào các thành viên lớp "business" từ các trang và các lớp business khác , và không phải là provider trực tiếp. Trên thực tế, bạn có thể bỏ qua ngay provider được sử dụng, và ở đâu và làm thế nào để các dữ liệu được lưu giữ (điều này là ý tưởng đằng sau abstraction các dữ liệu lưu trữ). Abstraction rõ ràng là cung cấp cho người sử dụng cảm giác rằng họ không cần phải biết chính xác như dữ liệu của họ sẽ được lưu trữ thế nào, nhưng bây giờ chúng tôi cũng có abstraction cho các nhà phát triển, vì họ cũng không luôn luôn cần phải biết làm thế nào dữ liệu được lưu giữ ! Để tạo mới một provider bạn có thể bắt đầu bằng cách xây dựng một provider mới mà kế thừa trực tiếp từ System.Web.Security.MembershipProvider (mà lần lượt kế thừa từ System.Configuration.Provider.ProviderBase), hoặc chỉ cần bạn có thể tùy chỉnh một số các phương thức hiện hành của một Provider. Ví dụ, hãy giả sử bạn muốn sửa đổi SqlMembershipProvider để kiểm tra mật khẩu của một người sử dụng để đảm bảo rằng nó không trùng tên người dùng. Bạn chỉ đơn giản cần phải định nghĩa lớp riêng của bạn , trong đó kế thừa từ SqlMembershipProvider, và bạn có thể chỉ cần ghi đè lên phương thức CreateUser như thế này: class SqlMembershipProviderEx : SqlMembershipProvider { public override MembershipUser CreateUser( string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) { if (username.ToLower() == password.ToLower()) { status = MembershipCreateStatus.InvalidPassword; return null; } else { return base.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out status); } } } quan trọng www.bqa.com.vn www.bsm.com.vn Page 10
  11. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 thiết kế mô hình provider này cũng rất hữu ích trong việc di chuyển tài nguyên của các hệ thống có table tuỳ chỉnh và stored procedures. cơ sở dữ liệu của bạn có thể đã chứa hàng ngàn hồ sơ thông tin của người sử dụng, và bạn muốn tránh bị mất đi cho họ, nhưng bây giờ bạn muốn thay đổi trang web của bạn để tận dụng lợi ích của Membership class. Thay vì tạo ra một ứng dụng tùy chỉnh để di chuyển dữ liệu mới để lưu trữ dữ liệu (hoặc bằng cách sử dụng SQL Server DTS để sao chép dữ liệu từ các bảng của bạn đến bảng mới sử dụng bởi các tiêu chuẩn SqlMembershipProvider), bạn chỉ cần tạo riêng các provider trực tiếp sử dụng tables and stored procedures hiện tại . Nếu bạn đã sử dụng một lớp business để truy cập vào tài khoản của dữ liệu từ các trang ASP.NET, sau đó tạo ra một lớp provider có thể chỉ thay đổi tên và signature của một số phương thức. lần lược, bạn có thể thực hiện theo phương pháp tiếp cận này: Tiếp tục giữ lớp business hiện tại của bạn, nhưng làm cho nó private, và sau đó di chuyển nó trong một lớp provider mới để kế thừ các phương thức và các thuộc tính của lớp business.Lợi ích của việc này, thay vì sử dụng lớp business hiện tại “như là” thì bạn có thể thay đổi để lưu trữ dữ liệu khác nhau sau này chỉ thêm nó vào các membership infrastructure - bạn sẽ không có thay đổi bất cứ điều gì trong ASP.NET các trang đó gọi built-in Membership lớp. Một khi bạn đã có provider mà bạn muốn (một trong những provider mặc định, một tùy chỉnh phát triển của bạn, hoặc một bên thứ ba cung cấp), bạn phải cho ASP.NET biết cái mà bạn muốn sử dụng khi bạn gọi phương thức trong lớp Membership tập tin Web.config được sử dụng để xác định và cấu hình các provider cho các hệ thống Membership. Nhiều trong số các cài đặt cấu hình mặc định là hard-coded trong ASP.NET runtime thay vì được lưu vào tập tin Machine.Config. Điều này được thực hiện để cải thiện hiệu suất bằng cách đọc và phân tích nhỏ hơn một tệp tin XML khi ứng dụng bắt đầu, nhưng bạn vẫn có thể sửa đổi các cài đặt này dành cho mỗi ứng dụng của riêng bạn bằng cách gán giá trị trong web.config để ghi đè giá trị mặc định. Bạn có thể đọc được cài đặt mặc định của Machine.config.default xem các tập tin được tìm thấy trong các thư mục (the "xxxxx" phần sẽ được thay thế bằng các xây dựng số cài đặt của bạn): C:\\Microsoft.NET\Framework\v2.0.xxxxx\CONFIG www.bqa.com.vn www.bsm.com.vn Page 11
  12. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 Những định nghĩa sau là nơi mà các SqlMembershipProvider được xác định và cấu hình: Bạn có thể đăng ký nhiều providers bên trong các , và một trong những lựa chọn mà bạn muốn sử dụng bằng cách xác định tên của nó trong thuộc tính defaultProvider của yếu tố (không được hiển thị ở trên). Một thuộc tính của là userIsOnlineTimeWindow, trong đó chỉ rõ bao nhiêu phút sau khi qua hoạt động là một người sử dụng vẫn được coi trực tuyến. Tức là, nếu một người sử dụng đăng nhập sẽ trả về một trang, nhưng sau đó đóng trình duyệt của mình ngay lập tức, cô ấy sẽ được tính là đang được trực tuyến trong vài phút. Chúng tôi cần các tham số loại này bởi vì chúng tôi không có cách nào định nghĩa để biết khi một người dùng đã để lại trang web hoặc đóng trình duyệt của mình xuống. Bạn có thể thử nghiệm điều này bằng cách kiểm tra các giá trị trả lại của Membership.GetNumberOfUsersOnline khi người dùng đến trang web của bạn và sau đó rời khỏi. Đối với trang web của chúng tôi, chúng tôi sẽ sử dụng SQL Server 2005 Express Edition, các ấn bản miễn phí của SQL Server 2005, để lưu trữ các hồ sơ tài khoản, và cơ sở dữ liệu này cũng sẽ được sử dụng cho tất cả các nội dung động của trang web. Trong phần "Giải pháp" của chương này, bạn www.bqa.com.vn www.bsm.com.vn Page 12
  13. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 sẽ thấy trên thực tế thế nào để thêm vào và cấu hình cho các providers để lưu trữ dữ liệu. Mặc dù cơ sở dữ liệu này là bản đầy đủ để sử dụng trên một máy tính của phát triển, nó sẽ là khôn ngoan để sử dụng thêm một ấn bản feature-laden của SQL Server 2005 cho việc triển khai để có được sự phát triển tốt hơn và các công cụ phân tích, và để có được hiệu suất tốt nhất từ cao kết thúc máy tính, máy chủ. Chi tiết về các SqlMembershipProvider bạn thấy các cài đặt mặc định được sử dụng để đăng ký SqlMembershipProvider. Bảng sau liệt kê các thuộc tính bạn có thể xác định khi bạn đăng ký các provider, trong yếu tố . Thuộc tính. diễn tả applicationName Tên của ứng dụng web; được sử dụng nếu bạn muốn lưu trữ dữ liệu về tài khoản của người sử dụng cho nhiều trang web trong một cơ sở dữ liệu connectionStringName Tên của chuỗi kết nối, đăng ký tại các phần web.config, chỉ vào cơ sở dữ liệu SQL Server được sử dụng để lưu trữ dữ liệu. Quan trọng: không phải là chuỗi kết nối thật! Đây chỉ là một tên tham chiếu đến web.config, nơi thật sự chuỗi kết nối được lưu giữ. description Một mô tả cho provider enablePasswordReset Cho biết bạn muốn cho phép các phương thức và kiểm soát cài đặt lại cho một mật khẩu mới, tự động tạo enablePasswordRetrieval Cho biết bạn muốn cho phép các phương thức và kiểm soát cho phép một người sử dụng lấy lại mật khẩu đã quên maxInvalidPasswordAttempts Tối đa số lần thử đăng nhập không hợp lệ. Nếu người dùng không đăng nhập được sau số lần này, sau thời gian đươc qui định trong thuộc tính passwordAttemptWindow, các tài khoản người dùng bị "khóa cho đến khi người quản trị gọi UnlockUser phương thức của một MembershipUser đại diện cho người sử dụng. minRequiredNonalphanumeric Số lượng tối thiểu của ký số trong một mật khẩu phải có để được Characters hợp lệ minRequiredPasswordLength Số lượng tối thiểu của các ký tự cho một mật khẩu hợp lệ name Tên sử dụng để đăng ký Provider. Điều này được sử dụng để chọn các Provider bằng cách thiết lập các defaultProvider thuộc tính của yếu tố . passwordAttemptWindow Số phút cho nỗ lực đăng nhập không hợp lệ. Xem các mô tả cho maxInvalidPasswordAttempts. www.bqa.com.vn www.bsm.com.vn Page 13
  14. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 Thuộc tính. diễn tả passwordFormat Xác định là mật khẩu được lưu giữ như thế nào trong dữ liệu lưu trữ. Có thể có giá trị là Clear, Encrypted, và Hashed. passwordStrengthRegular The regular expression that a password must match to be Expression considered valid requiresQuestionAndAnswer Cho biết những người sử dụng phải trả lời cho một câu hỏi bí mật cá nhân trước khi lấy hoặc cài đặt lại mật khẩu của mình. Các câu hỏi và câu trả lời được người sử dụng lựa chọn tại thời điểm đăng ký. requiresUniqueEmail Cho phép cùng một địa chỉ e-mail có thể được dùng để tạo nhiều tài khoản người dùng Lưu ý Theo mặc định, minRequiredPasswordLength được thiết lập là 7 và minRequiredNonalphanumericCharacters được cài là 1, điều đó có nghĩa là bạn phải đăng ký với một mật khẩu là ít nhất bẩy ký tự và chứa ít nhất một ký tự không là chữ cái. Cho dù bạn để lại các cài đặt mặc định hoặc thay đổi chúng cho phù hợp với nhu cầu của bạn, hãy nhớ những giá trị này vào danh sách đăng ký của bạn trên trang web để cho người dùng biết yêu cầu mật khẩu của bạn Các thuộc tính cho phép bạn tinh chỉnh các trong hệ thống membership. Ví dụ, khả năng xác định một biểu thức chính quy rằng mật khẩu phải cung cấp cho bạn rất phù hợp với tính linh hoạt để đáp ứng các yêu cầu nghiêm ngặt. Tuy nhiên, một trong những thuộc tính quan trọng nhất chắc chắn là passwordFormat, được sử dụng để xác định xem bạn muốn có mật khẩu được mã hóa, hoặc cho dù bạn chỉ muốn một hash của họ được lưu. Mật khẩu được mã hóa hashed hoặc bằng cách sử dụng các thông tin quan trọng được cung cấp trong yếu tố của các tập tin cấu hình (bạn nên nhớ để đồng bộ hóa machine key giữa các máy chủ nếu bạn sẽ triển khai vào một hệ thống máy chủ ). Các thuật toán mặc định được sử dụng để tính toán mật mã của hash là SHA1, nhưng bạn có thể thay đổi nó thông qua các thuộc tính xác thực của các yếu tố machineKey. Lưu mật khẩu trong văn bản rõ ràng cung cấp hiệu suất tốt nhất khi tiết kiệm và lấy các mật khẩu, nhưng đó là giải pháp mất an toàn nhất. Encrypting một mật khẩu cho biết thêm một số chế biến phí, nhưng nó có thể rất nhiều cải thiện an ninh. Hashing mật khẩu được cung cấp bảo mật tốt nhất bởi vì các thuật toán hashing là một trong những cách thức, trong đó có nghĩa là mật khẩu không thể được tải về bất kỳ hình thức nào, thậm chí của một quản trị viên. Nếu một người sử dụng quên mật khẩu của mình, cô ấy chỉ có thể thiết lập lại nó mới nó sẽ tự động tạo ra (thường được gửi qua e-mail cho người sử dụng). Tùy chọn tốt nhất luôn luôn phụ thuộc vào nhu cầu của từng trang web cụ thể: Nếu tôi đã www.bqa.com.vn www.bsm.com.vn Page 14
  15. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 được lưu mật khẩu cho một thương mại điện tử trên trang web mà tôi cũng có thể tiết kiệm người sử dụng thông tin thẻ tín dụng, tôi sẽ chắc chắn hash của mật khẩu và sử dụng một kết nối SSL để có an ninh tôt. Đối với nội dung của chúng tôi dựa trên trang web, tuy nhiên, tôi thấy rằng mật khẩu encrypting là một lựa chọn tốt. đúng thế, chúng tôi cũng đang xây dựng một e-commerce store nhỏ, nhưng chúng tôi sẽ không lưu trữ thông tin quan trọng (số thẻ tín dụng hay các dữ liệu nhạy cảm) trên trang web của chúng tôi. Quan trọng Không bao giờ lưu mật khẩu dưới dạng văn bản rõ ràng. Một số thay đổi cần thiết để mã hoá và giải mã mật khẩu chắc chắn là các giá trị gia tăng an ninh, và như vậy, tự tin rằng những người sử dụng và các nhà đầu tư có trong các trang web. Exploring the Default SQL Server Data Store Mặc dù hệ thống thành viên của ASP.NET 2,0 được xây dựng lại và sẵn sàng để dùng, điều này không phải là một lý do chính đáng để bỏ qua các thiết kế và cấu trúc dữ liệu. Bạn nên quen thuộc với hệ thống này để giúp bạn chẩn đoán bất kỳ vấn đề nào mà có thể phát sinh trong quá trình phát triển hoặc triển khai. Hình 4-2 cho thấy những bảng biểu được sử dụng bởi các lớp SqlMembershipProvider để lưu hồ sơ và các dữ liệu người dùng. Tất nhiên, dữ liệu, lưu trữ của thiết kế của các nhà cung cấp dịch vụ có thể hoàn toàn khác nhau (đặc biệt là nếu chúng không phải là dựa trên cơ sở dữ liệu quan hệ). www.bqa.com.vn www.bsm.com.vn Page 15
  16. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 Hình 4-2 Những điều thú vị mà bạn có thể nhìn thấy từ Hình 4-2 là sự hiện diện của bảng aspnet_Applications, trong đó chứa một tham chiếu đến nhiều ứng dụng (các trang web). Cả hai bảng aspnet_Users và aspnet_Membership chứa một tham chiếu đến bảng aspnet_Applications thông qua khóa ngoại ApplicationId. Điều này cho phép bạn thiết kế để sử dụng cùng một cơ sở dữ liệu để lưu trữ các tài khoản người dùng cho nhiều trang web, mà có thể rất hữu ích nếu bạn có một số trang web bằng cách sử dụng cùng một máy chủ cơ sở dữ liệu (thường được thực hiện với doanh nghiệp hoặc các trang web thương mại với chi phí thấp được chia sẻ lưu trữ). Trong một tình huống mà bạn có một ứng dụng quan trọng đòi hỏi tối an ninh đa, bạn sẽ muốn lưu trữ dữ liệu các thành viên trong một cơ sở dữ liệu mà chỉ có các quản trị viên có thể truy cập trang web. Trong trường hợp của chúng tôi, tuy nhiên, chúng tôi chỉ sử dụng SQL Server 2005 Express, và điều này đòi hỏi chúng ta phải sử dụng cơ sở dữ liệu của chúng tôi sở hữu tư nhân, triển khai đơn giản như là một tập tin theo thư mục App_Data đặc biệt. Ngoài các bảng biểu, cũng có một vài liên quan đến membership www.bqa.com.vn www.bsm.com.vn Page 16
  17. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 (vw_aspnet_MembershipUsers và vw_aspnet_Users) và một số stored procedures (aspnet_membership_xxx) cho CRUD (Tạo, Đọc, cập nhật, và Xóa). Bạn có thể khám phá tất cả các đối tượng này bằng cách sử dụng máy chủ tích hợp cửa sổ Explorer trong IDE của Visual Studio, như được hiển thị trong Hình 4-3. Hình 4-3. Chúng ta cũng có thể cấu hình bằng tool, phần này sẽ được nói rõ ở cuối của mục “Giải Pháp”. Giao diện login controls Như bạn đã thấy ở trên, tạo, xác nhận hiệu lực, quản lý và người sử dụng lập trình đòi hỏi phải chỉ là một vài dòng mã. Nhưng có thể không cần viết code được không ? Đó thực sự có thể có ngay bây giờ, nhờ có những login controls mới được giới thiệu với ASP.NET 2.0. Những điều khiển cung cấp một giao diện người dùng thực hiện phổ biến nhất cho các hoạt động giao dịch với thành viên và an ninh, chẳng hạn như việc tạo một tài khoản mới, đăng nhập và thoát, lấy một hoặc cài đặt lại quên mật khẩu, hoặc hiển thị các kết quả khác nhau theo sự xác nhận tình trạng của hiện nay người sử www.bqa.com.vn www.bsm.com.vn Page 17
  18. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 dụng. Trong Hình 4-5 mà bạn nhìn thấy một ảnh chụp màn hình của Visual Studio 2005 IDE, dó là một phần trong Login controls. Nó cũng cho thấy một CreateUserWizard (công cụ tạo user mới) với của sổ pop up thông minh hiện kế bên. Hình 4-5 CreateUserWizard Control Một wizard là một chức năng mới trong ASP.NET 2,0 được sử dụng để tạo ra một giao diện trực quan cho một quá trình bao gồm nhiều bước. Mỗi bước có một hình ảnh riêng biệt của bảng điều khiển hoặc khung chứa riêng nhóm kiểm soát. Sau khi người sử dụng điền vào trong để kiểm soát các giá trị của từng bước, ông có thể nhấn một liên kết để tiến đến bước tiếp theo trong trình wizard. Các CreateUserWizard kiểm soát tạo ra một giao diện người dùng cho một người sử dụng để đăng ký mới, bằng cách cung cấp tên người dùng, mật khẩu, và địa chỉ e-mail. Các câu hỏi bí mật và câu trả lời cũng được yêu cầu, nhưng chỉ khi membership provider hiện tại có requiresQuestionAndAnswer thuộc tính để thiết lập đúng, nếu không, hai textboxes cuối được ẩn. Khi được nhấp vào nút Submit , sự kiểm soát gọi Membership.CreateUser thay cho bạn. Theo mặc định, mã được tạo ra theo thiết kế (và được nhìn thấy trong Source View) là như sau: www.bqa.com.vn www.bsm.com.vn Page 18
  19. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 Nó không có chứa các thuộc tính xuất hiện, và sự kiểm soát sẽ xem xét đơn giản và đơn giản, với những mặc định font chữ, nền, và màu sắc foreground. Tuy nhiên, bạn có thể xác định giá trị cho tất cả các thuộc tính được sử dụng để kiểm soát sự xuất hiện. Một cách dễ dàng để làm điều đó bằng cách nhấp chuột vào là tự động định dạng từ những cửa sổ thông minh công việc và lựa chọn một trong những phong cách trước khi thực hiện. Ví dụ, nếu bạn chọn Elegant phong cách, sự kiểm soát sẽ xem xét như được hiển thị trong Hình 4-6 2/ Giải pháp 1. Định nghĩa các thiết thông số cần thiết cho membership, roles, và profiles trong web.config. 2. Tạo login box nằm phía trên bên phải trang master page, và trang AccessDenied.aspx. 3. Tạo trang Register.aspx, UserProfile.ascx. 4. Tạo trang PasswordRecovery.aspx. 5. Tạo trang EditProfile.aspx để thay đổi password và thông tin profile. 6. Thiết kế profiles để lưu theme mà người dùng chọn. 7. Tạo trang administration (ManageUsers.aspx, EditUsers.aspx) để hiển thị tất cả users, cũng như edit và delete. www.bqa.com.vn www.bsm.com.vn Page 19
  20. Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005 Thêm code vào file web.config để cấu hình 1. Cấu hình authentication type ... ... 2. Cấu hình membership ...
nguon tai.lieu . vn