Bảo mật ASP.NET
Bảo mật vốn là chủ đề cực kỳ phức tạp và bảo mật trong ASP.NET cũng
không phải ngoại lệ. Các lập trình viên .NET chắc hẳn cũng đã quen
thuộc với những khó khăn gặp phải khi tìm kiếm tài liệu tiếng Việt trong
lĩnh vực này. Hôm nay, Quản Trị Mạng xin giới thiệu nôi dung chương 9,
chương về Bảo mật ASP.NET trong cuốn “ASP.NET in a Nutshell” của
hai tác giả Andrew Duthie và Matthew MacDonald, nhà xuất bản
O’Reilly.
Trong chương này, chúng ta sẽ đề cập đến một số phương thức giúp đảm bảo
an toàn cho các ứng dụng ASP.NET. Để nhấn mạnh vào nội dung trọng tâm
của chương, chúng ta sẽ không bàn về bảo mật mạng, bảo mật máy chủ và
bảo mật cơ sở hạ tầng ASP.NET. Nói như thế không có nghĩa là các chủ đề
đó không quan trọng. Ngược lại, nếu không cấu hình hỗ trợ bảo mật phù hợp
cho máy chủ và cơ sở hạ tầng mạng, những gì cố gắng thực hiện để đảm bảo
an toàn cho ứng dụng ASP.NET thông qua các công cụ .NET Framework
cung cấp sẽ trở nên vô ích. Tuy nhiên, nằm trong phạm vi giới hạn của một
chương nên chúng ta chỉ đi sâu vào vấn đề bảo mật các chương trình ứng
dụng ASP.NET.
, ngoại trừ một điểm là
có thêm một ô textbox (để kiểm chứng mật khẩu) và ba điều khiển kiểm tra
tính hợp lệ:
Một điều khiển CompareValidator để xác định xem giá trị trong ô
Password và PasswordConfirm có khớp với nhau hay không.
Một điều khiển RequiredFieldValidator để xác nhận người dùng đã
nhập địa chỉ e-mail, vì thế chúng ta không có giá trị e-mail null trong
file XML.
Một điều khiển RequiredFieldValidator để đảm bảo rằng người dùng đã
nhập mật khẩu để không có giá trị mật khẩu null trong file XML.
Nếu muốn đảm bảo thêm cho e-mail nhập vào là hợp lệ, chúng ta có thể sử
dụng hàm RegularExpressionValidator.
Trong trình điều khiển sự kiện Register_Click, đầu tiên nó sẽ kiểm tra để đảm
bảo trang web là hợp lệ nhằm giúp vi xử lý tránh phải lãng phí thời gian làm
việc với dữ liệu không hợp lệ. Nếu trình duyệt của người dùng hỗ trợ
DHTML, trang web thậm chí sẽ không được đưa lên cho đến khi các yêu cầu
của điều khiển hợp lệ được đáp ứng.
Nếu trang web hợp lệ, một biến DataSet cục bộ sẽ được khai báo và được cấp
phát không gian bộ nhớ trên file Users.xml. Sau đó là kiểm tra xem địa chỉ e-
mail người dùng nhập vào có tồn tại trên file không. Nếu không, thuộc tính
Text của điều khiển Label ASP.NET sẽ được dùng để yêu cầu người dùng
nhập một địa chỉ e-mail khác.
Nếu e-mail đó không tồn tại, một DataRow mới sẽ được tạo, chứa địa chỉ e-
mail đã chọn của người dùng cùng với bản băm của mật khẩu, thêm hàng mới
vào dataset và ghi dataset trở lại file XML (như ví dụ bên dưới). Kỹ thuật này
không kiểm soát trùng hợp, vì thế nếu ai đó thay đổi nội dung của file XML
trong khi nó đang được đọc hoặc ghi dữ liệu vào thì các thay đổi sẽ bị ghi đè.
Dim NewUser As DataRow
NewUser = LoginDS.Tables(0).NewRow( )
NewUser("Email") = Email.Text
NewUser("Password") = _
FormsAuthentication.HashPasswordForStoringInConfigFile( _
Password.Text, "SHA1")
LoginDS.Tables(0).Rows.Add(NewUser)
LoginDS.WriteXml(Server.MapPath("Users.xml"))
Chú ý: Để ghi file Users.xml thành công, tài khoản bên dưới bộ thực thi
ASP.NET đang chạy phải truy cập được vào file.
Sau khi ghi thông tin của người dùng mới vào Users.xml, chúng ta sẽ đưa
người dùng tới trang mô tả trong tham số xâu truy vấn:
Response.Redirect(Request.QueryString("Page"))
9.1.2.2. Thoát (Log-out)
Nhiều khi chúng ta phải làm việc với thông tin nhạy cảm trong ứng dụng từ
các máy công cộng. Trong những trường hợp như vậy, chúng ta cần cung cấp
cho người dùng một số cách log-out nhằm ngăn người khác truy cập thông tin
riêng tư hoặc truy cập tài nguyên ứng dụng thông qua tài khoản của họ.
Trong thẩm định Forms điều này khá đơn giản. Chúng ta có thể gọi phương
thức tĩnh SignOut của lớp FormsAuthentication như ở ví dụ 9-4. Khi đó
người dùng sẽ được chuyển đến file Logout.aspx để hoàn chỉnh quá trình log-
out. Chúng ta cũng có thể tạo một điều khiển người dùng chứa một nút mà
khi kích vào nó sẽ gọi ra phương thức SignOut và thêm điều khiển người
dùng cho tất cả các trang được bảo vệ của ứng dụng.
Ví dụ 9-4. Logout.aspx
Logout Page
Sub Page_Load(Sender As Object, e As EventArgs)
FormsAuthentication.SignOut( )
Message.Text = "You have been logged out."
End Sub
Ví dụ 9-5 thể hiện nội dung của file Users.xml.
Ví dụ 9-5. Users.xml
andrew@aspnetian.com
816010E041FA485C6E2383C649343D3A0CAD4D25</Passwo
rd>
9.1.3. Thẩm định Passport
Thẩm định Passport cho phép một người dùng có một mật khẩu duy nhất
trong khi có thể đăng nhập (địa chỉ e-mail được gắn với tài khoản Passport
của họ) vào nhiều ứng dụng hay website. Điều này giúp đơn giản quá trình
đăng nhập của người dùng và giảm bớt công việc quản trị khi bảo trì tài
khoản người dùng.
Để sử dụng được thẩm định Passport trong ASP.NET chúng ta phải
download và cài đặt Passport SDK.
Sau khi cài đặt Passport SDK, chúng ta cần cấu hình theo cấu trúc tương ứng.
Cuối cùng là cấu hình ứng dụng ASP.NET để sử dụng thẩm định Passport,
như đoạn mã bên dưới:
<!--
Other configuration elements
-->
Phần tử và thuộc tính redirectUrl là tuỳ ý và được dùng để mô tả
một URL nôi bộ để chuyển hướng nếu người dùng đưa ra yêu cầu đăng nhập
không sử dụng tài khoản các Passport của họ. Nếu được bỏ qua,
người dùng đăng nhập không sử dụng tài khoản Passport sẽ được chuyển tới
trang đăng nhập trên một server login Passport.
9.2. Cấp phép (Authorization)
Cấp phép là quá trình xác định xem liệu người dùng đã được nhận dạng trong
quá trình thẩm định có được phép truy cập tài nguyên họ đang yêu cầu không
hay phải thực hiện thêm hành động nào khác (ví dụ như update dữ liệu cho
cơ sở dữ liệu rồi mới được truy cập). Quá trình thẩm định trả lời cho câu hỏi:
“Bạn là ai?”, còn quá trình cấp phép trả lời cho câu hỏi: “Bạn có được phép
làm điều đó hay không?”.
Cấp phép trong ASP.NET có ba hình thức: cấp phép sử dụng Danh sách điều
khiển truy cập (ACL), cấp phép sử dụng đưòng dẫn URL và cấp phép
programmatic.
9.2.1. Cấp phép ACL
Danh sách điều khiển truy cập (ACL) được dùng trong Windows NT,
Windows 2000, Windows XP và Windows Sever 2003 để kiểm soát truy cập
tài nguyên hệ thống như các tệp, thư mục trong hệ thống file NTFS. Bạn có
thể gán một số tài nguyên nhất định vào ACL cho tài khoản người dùng hoặc
một nhóm người dùng Windows để cho phép họ truy cập tài nguyên hoặc xác
định kiểu truy cập (đọc, ghi, thay đổi…) được phép dùng.
Thẩm định ACL chủ yếu được dùng với thẩm định Windows trong
ASP.NET. IIS sử dụng nhân dạng người dùng đã qua thẩm định để thực hiện
các kiểm tra ACL và cũng có thể đưa ra các yêu cầu về tài nguyên được bảo
vệ bởi ACL. bằng cách dùng ngữ cảnh bảo mật của người dùng, nếu
impersonation được cho phép.
Để bảo vệ một file dùng ACL, kích phải chuột lên file trong Windows
Explorer và chọn Properties. Tiếp theo, bấm chọn thẻ Security để xem người
dùng, nhóm người dùng và đặc quyền hiện thời có trên file. Sử dụng các nút
Add và Remove để thêm hoặc bớt tài khoản người dùng, nhóm người dùng
và đánh dấu hoặc bỏ dấu ở các ô trong phần Permissions để thay đổi đặc
quyền cho người dùng.
(Trong Windows XP, thẻ Security có thể không xuất hiện trên hộp thoại
Properties của file hay folder nếu chức năng Simple File Sharing được bật.
Để xem liệu thành phần này có đang được bật hay không, vào Tools >
Folder Options trong Windows Explorer. Sau đó chọn thẻ View, vào phần
Advanced Settings, bỏ dấu chọn trong ô "Use simple file sharing
(recommended)" đi là được).
Một trong những việc cần làm đầu tiên trong là loại bỏ nhóm Everyone ra
khỏi thư mục, do nhóm này cho phép bất kỳ ai truy cập máy tính cũng có thể
truy cập file này.
Khi loại bỏ một số tài khoản đặc biệt (như SYSTEM) khỏi các danh sách ACL
chúng ta cần thận trọng. Một số file hệ điều hành đòi hỏi phải có tài khoản
SYSTEM mới được phép truy cập để thực hiện các chức năng của hệ điều
hành. Vì thế loại bỏ những đặc quyền này có thể là nguyên nhân gây ra nhiều
vấn đề nghiêm trọng. thậm chí dẫn đến không khởi động được hệ điều hành.
9.2.2. Cấp phép URL
Chế độ cấp phép URL sử dụng các yếu tố và của phần tử
cấu hình để kiểm soát truy cập file, thư mục bên trong ứng
dụng, giống như trong ví dụ ở thẩm định Forms. Truy cập có thể được cho
phép hoặc bị từ chối dựa trên tên người dùng (username), vai trò (role) và
phương thức HTTP dùng để yêu cầu tài nguyên. Do đó, lấy ví dụ, nếu cho
phép người dùng Marcie truy cập tất cả tài nguyên trong ứng dụng theo tất cả
phương thức yêu cầu của HTTP, nhưng cấm người dùng Charles thực hiện
yêu cầu POST, chúng ta sẽ phải thêm phần vào sau file
web.config ở mức gốc của ứng dụng (hoặc có thể thêm phần
vào file web.config trong một thư mục con để ghi đè hoặc
thêm các thiết lập):
Như trên hình 9-1, chúng ta có thể dùng thẻ với thuộc tính path
cho điều khiển truy cập của một file hay folder cụ thể:
Do thẻ trong file web.config đòi hỏi cặp thẻ riêng
của nó nên thẻ luôn xuất hiện bên trong các thẻ
và nhưng bên ngoài các thẻ và
. Chúng ta có thể định nghĩa ít hay nhiều thẻ khác
nhau tuỳ ý. Mỗi thể có thể chứa những giới hạn cấp phép URL riêng.
Để mô tả miền thay cho các tài khoản hay nhóm cục bộ, chúng ta có thể sử
dụng định dạng domainname\ userorgroupname khi mô tả tên trong
và . Có hai ký tự đặc biệt: “*” cho phép tất cả người dùng,
“?” là chỉ những người dùng nặc danh (không qua thẩm định). Cuối cùng, có
thể mô tả nhiều người dùng hoặc nhóm người dùng cùng một lúc trong
và bằng dấu phẩy.
9.2.3 Cấp phép Programmatic (programmatic authorization)
Chúng ta có thể thực hiện các kiểm tra programmatic tại thời gian chạy bằng
cách xác định xem liệu người dùng có được phép thực hiện một hành động
nào đó hay không. Công cụ chủ yếu để thực hiện điều này là phương thức
IsInRole, được định nghĩa bởi giao diện IPrincipalvà có thể truy cập từ thuộc
tính User của lớp Page. Cũng như với cấp phép ACL, phương thức này hữu
ích nhất khi dùng với cơ chế thẩm định Windows và khi muốn kiểm tra xem
liệu liệu người dùng đã qua thẩm định thuộc nhóm Windows nào, như nhóm
manager (quản lý) chẳng hạn. Chúng ta có thể lấy ví dụ minh hoạ cho việc sử
dụng IsInRole như bên dưới:
If Page.User.IsInRole("Managers") Then
'perform some action restricted to managers
Else
Message.Text = "You must be a manager to perform this action"
End If
Bạn đọc thân mến, có thể thấy rõ bảo mật ứng dụng trong ASP.NET tập trung
làm rõ hai vấn đề thẩm định (authentication) và cấp phép (authorization).
Song ngoài hai khái niệm chính này chúng ta cũng cần biết đến một số yếu tố
đáng quan tâm khác mà có dịp chúng tôi sẽ tiếp tục chuyển tới các bạn vào
một ngày gần nhất. Hy vọng các bạn đã có được một tài liệu tham khảo hữu
ích từ phần bài dịch này của tác giả. Trong quá trình dịch không thể tránh
khỏi một số sai sót, mong các bạn góp ý để giúp tác giả sửa chữa nhằm phục
vụ bạn đọc một tác phẩm hay hơn và chính xác hơn.
File đính kèm:
Bảo mật ASP.NET.pdf

