Tải bản đầy đủ (.pdf) (55 trang)

Chương 4: Membership and User Profiling pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.78 MB, 55 trang )

Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 1

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.


Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 2

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?
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 3


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 <forms> 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.
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 4

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
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 5

đó, 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

Get
User

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.



Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 6



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 n

ờ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


U
sername

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.

ChangePasswordQuest
ionAndAnswer

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
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 7

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", "");
}
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:
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 8


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("M
arco");

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
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 9

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.

Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 10

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
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 11

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:\<Windows Folder>\Microsoft.NET\Framework\v2.0.xxxxx\CONFIG
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 12


Những định nghĩa sau <membership> là nơi mà các SqlMembershipProvider được xác định và cấu
hình:
<
system.web>

<membership>
<providers>
<add name="AspNetSqlMembershipProvider"

type="System.Web.Security.SqlMembershipProvider, System.Web,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
/>
</providers>
</membership>

<! other settings >
</system.web>
Bạn có thể đăng ký nhiều providers bên trong các <providers>, 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ố
<membership> (không được hiển thị ở trên). Một thuộc tính của <membership> 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
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 13

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ố <provider>.
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 <connectionStrings> 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 n


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
Characters
S
ố l
ư

ợng tối thiểu của ký số trong một mật khẩu phải có
đ

đư
ợc
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

n
g đ


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ố <membership>.
passwordAttemptWindow

S


phút cho n
ỗ lực

đăng nh
ập không hợp lệ. Xem các mô tả cho
maxInvalidPasswordAttempts.
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 14

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
Expression
The regular expression that a password must match to be
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ố <machineKey> 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 đã
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 15

đượ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ệ).
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 16


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
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 17


(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ử
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 18

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:
<asp:CreateUserWizard ID="CreateUserWizard1" runat="server">
<WizardSteps>
<asp:CreateUserWizardStep runat="server">
</asp:CreateUserWizardStep>

<asp:CompleteWizardStep runat="server">

Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 19

</asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
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.
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 20


Thêm code vào file web.config để cấu hình
1. Cấu hình authentication type
<
system.web
>



<!
Section <authentication> cho phép cấu hình (đặt)mode chứng thực bảo mật
sử dụng bởi ASP.NET để nhận dạng user.
-mode = "Windows" : Là mặc định sử dụng với một số dạng chứng thực của IIS

-mode = "Forms" : Chỉ rõ chứng thực dựa trên ASP.NET.
>
<! Tra trong MSDN từ khoá <authentication> để hiểu rõ >
<authentication mode="Forms">
<forms cookieless="AutoDetect"
loginUrl="~/AccessDenied.aspx"

name="KimSoftFormAuth" />
</authentication>

</system.web>
2. Cấu hình membership
<
system.web
>



<!
Bạn có thể sử dụng ASP.NET Membership cho ứng dụng bằng cách trực tiếp thao tác với file web.config hay bạn
có thể sử dụng Web Site Administration Tool.
Trong phần cấu hình membership bạn có thể chỉ ra như sau:
1./ membership provider nào. (Chỉ ra đường dẫn đến database lưu trữ thông tin membership).
2./ Password options : Có mã hoá hay không? (encryption) và có hỗ trợ password recovery dựa trên 1
câu hỏi bảo mật không?.
3./ Users và passwords: Nếu bạn sử dụng Web Site Administration Tool, Bạn có thể tạo và quản lý users
trực tiếp.
Ngược lại, bạn phải gọi membership functions (lập trình) để tạo và quản lý users.
>
<membership defaultProvider="KimSoft_MembershipProvider" userIsOnlineTimeWindow="15">
<providers>
<add name="KimSoft_MembershipProvider"
connectionStringName="LocalSqlServer"
applicationName="/"
enablePasswordRetrieval="true"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"

requiresUniqueEmail="true"
passwordFormat="Encrypted"
maxInvalidPasswordAttempts="5"
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 21





passwordAttemptWindow
=
"
10
"

minRequiredPasswordLength="5"
minRequiredNonalphanumericCharacters="0"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</membership>

</system.web>
3. Cấu hình connectionStrings
 Thay đoạn code sau cho chuỗi <connectionStrings/>
<!




**Cấu hình chuỗi kết nối tới Database **
-Có thể sử dụng KimSoftSqlServer để kết nối đến database KimSoft lưu trên Database Server hay
LocalSqlServer để kết nối đến ASPNETDB.mdf lưu trong thư mục App_Data của project.
Các project thực tế thông thường sẽ lưu thông tin membership vào chung database project.
Project này sẽ lưu thông tin membership vào chung với database KimSoft.
>
<connectionStrings>
<remove name="KimSoftSqlServer"/>
<!
<remove name="LocalSqlServer"/>
>
<! SQL Database Server >
<add name="KimSoftSqlServer" connectionString="Data Source=DUONGVUNGOCLAN;Initial
Catalog=KimSoft;Persist Security Info=True;User ID=sa;Password=longnamit726354"
providerName="System.Data.SqlClient" />

<! SQLExpress
<add name="LocalSqlServer" connectionString="Data
Source=DUONGVUNGOCLAN\SQLExpress;Integrated Security=True;User
Instance=True;AttachDBFilename=|DataDirectory|aspnetdb.mdf"
providerName="System.Data.SqlClient"/>
>
</connectionStrings>
4. Cấu hình role manager
<
system.web
>




<! Cấu hình roleManager
Role thường đi chung với membership
>
<roleManager enabled="true" cacheRolesInCookie="true"
cookieName="KimSoftRoles"
defaultProvider="KimSoft_RoleProvider">
<providers>
<add connectionStringName="KimSoftSqlServer"
applicationName="/"
name="KimSoft_RoleProvider"
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 22





type
=
"
System.Web.Security.SqlRoleProvider, Sys
tem.Web,
&#xD;&#xA;
Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>

</roleManager>

</system.web>
5. Cấu hình anonymousIdentification
<
system.web
>



<!
Configures anonymous identification for application authorization.
Việc này được yêu cầu để nhận biết các users đã được chứng thực hay chưa.
>
<anonymousIdentification cookieless="AutoDetect" enabled="true"/>

</system.web>
6. Cấu hình profile
<
system.web
>



<!
Cấu hình các tham số (parameters) cho việc quản lý các giá trị của user profile bằng cách sử dụng ASP.NET
profile.
Tuỳ vào bài toán khác cần lưu những tham số khác các bạn thay đổi số lượng, tên cũng như kiểu dữ liệu cho
user profile.
>

<profile defaultProvider="KimSoft_ProfileProvider">
<providers>
<add name="KimSoft_ProfileProvider"
connectionStringName="LocalSqlServer"
applicationName="/"
type="System.Web.Profile.SqlProfileProvider, System.Web,&#xD;&#xA;Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
<properties>
<add name="FirstName" type="String" />
<add name="LastName" type="String" />
<add name="Gender" type="String" />
<add name="BirthDate" type="DateTime" />
<add name="Occupation" type="String" />
<add name="Website" type="String" />
<group name="Address">
<add name="Street" type="String" />
<add name="PostalCode" type="String" />
<add name="City" type="String" />
<add name="State" type="String" />
<add name="Country" type="String" />
</group>

<group name="Contacts">
Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 23





<
add

name
=
"
Phone
"

type
=
"
String
"

/>

<add name="Fax" type="String" />
</group>

<group name="Preferences">
<add name="Theme" type="String" allowAnonymous="true" />
<add name="Culture" type="String" defaultValue="en-US" />
<add name="Newsletter" type="KimSoft.BLL.Newsletters.SubscriptionType" />
</group>
</properties>
</profile>


</system.web>

Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 24


7. Cấu hình machineKey.
<
system.web
>



<! Sử dụng để mã hoá tra từ khoá <machineKey> trong MSDN để hiểu rõ >
<machineKey
validationKey=
"287C5D125D6B7E7223E1F719E3D58D17BB967703017E1BBE28618FAC6C4501E910C7E59800B5D4C2EDD5B0ED
98874A3E952D60BAF260D9D374A74C76CB741803"
decryptionKey= "5C1D8BD9DF3E1B4E1D01132F234266616E0D5EF772FE80AB"
validation="SHA1"/>

</system.web>
8. Cấu hình sitemap provider.
<
system.web
>




<! Cấu hình SiteMap >
<siteMap defaultProvider="KimSoft_SiteMapProvider" enabled="true">
<providers>
<add name="KimSoft_SiteMapProvider"
type="System.Web.XmlSiteMapProvider"
securityTrimmingEnabled="true"
siteMapFile="web.sitemap" />
</providers>
</siteMap>

</system.web>
9. Cấu hình ngăn cản truy cập file EditProfile.aspx từ Anonymous users .
</
system.web
>

<!
Cấu hình không cho phép Anonymous users truy cập trang EditProfile.aspx
? đại diện cho Anonymous users, * đại diện cho authenticated users
>
<location path="EditProfile.aspx">
<system.web>
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
</system.web>
</location>
10. Tạo thư mục Newsletter trong App_Code/BLL/

Building CMS E-Commerce Project using ASP.NET 3.5 in C# 2008 and SQLServer 2005

www.bqa.com.vn
www.bsm.com.vn Page 25

11. Tạo lớp Enum.cs trong thư mục Newsletter và viết code như sau:
//
Sử dụng chữ thay cho số
,
tra trong MSDN từ khoá enum để hiểu rõ
.

namespace KimSoft.BLL.Newsletters
{
public enum SubscriptionType : int
{
None = 0,
PlainText = 1,
Html
}
}
12. Thêm vào <div id="loginbox"> của template.master file đoạn code sau:


<
!


Phần đăng nhập


>


<div id="loginbox">
<asp:LoginView ID="LoginView1" runat="server">
<AnonymousTemplate>
<asp:Login ID="Login" runat="server" Width="100%"
FailureAction="RedirectToLoginPage">
<LayoutTemplate>

<! Phần text box Username và Password >
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="60px">Username:</td>
<td><asp:TextBox id="UserName" runat="server" Width="95%" /></td>

<td width="5px" align="right">
<asp:RequiredFieldValidator ID="valRequireUserName"
runat="server" SetFocusOnError="true" Text="*"
ControlToValidate="UserName" ValidationGroup="Login" />
</td>
</tr>
<tr>
<td>Password:</td>
<td><asp:TextBox ID="Password" runat="server"
TextMode="Password" Width="95%" /></td>
<td width="5px" align="right">
<asp:RequiredFieldValidator ID="valRequirePassword"
runat="server" SetFocusOnError="true" Text="*"
ControlToValidate="Password" ValidationGroup="Login" />

</td>
</tr>
</table>

<! Phần Remember me và button Go >
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td><asp:CheckBox ID="RememberMe" runat="server"
Text="Remember me"></asp:Checkbox></td>

×