Bạn cần ngăn người dùng truy xuất các trang nào đó trừ khi họđã được xác thực dựa vào Windows user account (tài khoản người dùng Windows) trên server.
Sử dụng IIS Windows authentication. Chọn phương pháp xác thựcmà bạn thích, và từ chối truy xuất nặc danh đến thư mục ảo bằng IIS Manager. Bạn có thể lấy thông tin về người dùng đã được xác thực từ thuộc tính Page.User hoặc lớp
Chương 7: ASP.NET và Web Form
IIS và ASP.NET sử dụng mô hình bảo mật được sắp lớp (layered security model). Khi người
dùng yêu cầu một trang ASP.NET trên HTTP, các bước dưới đây sẽ diễn ra:
1. IIS thực hiện việc xác thực người dùng. Nếu Anonymous accessđược kích hoạt, IIS sẽ
tự động đăng nhập người dùng với tài khoản nặc danh (IUSR_[ServerName]). Nếu không, nó sẽ yêu cầu thông tin xác thực để đăng nhập người dùng với một tài khoản
Windows khác.
2. Nếu IIS xác thực người dùng thành công, nó sẽ chuyển yêu cầu đến ASP.NET cùng với thông tin về người dùng đã được xác thực. Theo đó, ASP.NET có thể sử dụng các dịch vụ bảo mật của nó dựa vào các thiết lập trong file Web.config (ví dụ, không cho người dùng hoặc nhóm cụ thể truy xuất đến các trang hoặc thư mục nào đó). Ngoài ra, mã của bạn có thể hạn chế các hành động bằng cách kiểm tra thông tin về người dùng.
3. Nếu mã ASP.NET truy xuất bất kỳ tài nguyên hệ thống nào (ví dụ, mở một file hoặc kết nối đến một cơ sở dữ liệu), hệđiều hành Windows sẽ thực hiện những kiểm tra bảo mật của nó. Thông thường, mã ứng dụng ASP.NET không thực sự chạy dưới tài khoản của người dùng đã được xác thực. Như thế, những kiểm tra bảo mật này được thực hiện dựa trên tài khoản tiến trình ASPNET (được cấu hình bằng file machine.config).
Để sử dụng IIS authentication, bước đầu tiên là vô hiệu Anonymous access cho thư mục ảo.
Bạn cần khởi động IIS Manager (vào Start | Control Panel | Administrative Tools | Internet
Information Services). Kế tiếp, nhắp phải vào một thư mục ảo hoặc một thư mục con bên trong thư mục ảo, và chọn Properties. Chọn thẻDirectory Security (xem hình 7.5).
Hình 7.5 Directory Security
Kế tiếp, nhắp nút Edit. Cửa sổ như hình 7.6 sẽ xuất hiện. Trong nửa dưới của cửa sổ, bạn có thể kích hoạt một trong các phương pháp xác thực. Tuy nhiên, không phương pháp nào được sử dụng trừ khi bạn xóa dấu chọn Anonymous access.
Chương 7: ASP.NET và Web Form
Hình 7.6 Directory authentication
Bạn có thể kích hoạt nhiều phương pháp xác thực, trong trường hợp này client sẽ sử dụng phương pháp được hỗ trợ mạnh nhất. Nếu Anonymous accessđược kích hoạt thì nó luôn được sử dụng. Các phương pháp xác thực khác nhau được mô tả trong bảng 7.2.
Bảng 7.2 Các kiểu xác thực
Chế độ Mô tả
Anonymous Client không cần cung cấp bất kỳ thông tin nào. Người dùng được đăng
nhập bằng tài khoản nặc danh có sẵn (IUSR_[ServerName]).
Basic
Basic authentication là một phần của chuẩn HTTP 1.0, và nó được hầu hết
các trình duyệt và web-server hỗ trợ. Khi sử dụng Basic authentication, trình duyệt yêu cầu người dùng nhập username và password. Thông tin này
được chuyển cho IIS, và nó được so trùng với Windows user account cục
bộ. Basic authentication nên luôn được phối hợp với SSL vì nó không bảo
mật thông tin đăng nhập trước khi chuyển giao.
Digest
Digest authentication gửi một digest (tức mã băm mật mã) trên mạng. Do
đó, nó an toàn hơn Basic authentication vì thông tin đăng nhập nếu bị chặn cũng không thể dùng lại được. Bất lợi chủ yếu là Digest authentication chỉ được hỗ trợ trên Internet Explorer 5.0 trở lên. Cũng vậy, web-server của bạn cần sử dụng Active Directory hoặc có thể truy xuất đến một Active
Directory server.
Integrated
Khi sử dụng Integrated authentication thì Internet Explorer gửi logon token cho người dùng hiện hành một cách tựđộng, miễn là nó ở trên một miền đáng tin cậy. Integrated authentication chỉ được hỗ trợ trên Internet
Explorer 2.0 trở lên và không thể làm việc trên các proxy-server.
Một khi đã kích hoạt các thiết lập bảo mật cho thư mục ảo thích hợp, bạn cũng nên bảo đảm file Web.config được thiết lập là sử dụng Windows authentication. Trong một dự án Visual Studio .NET, đây là thiết lập mặc định.
Chương 7: ASP.NET và Web Form <configuration> <system.web> <!-- Bỏ qua các thiết lập khác. --> <authentication mode="Windows" /> </system.web> </configuration>
Vào lúc này, thư mục ảo của bạn sẽ yêu cầu xác thực người dùng và ứng dụng Web sẽ có thể
lấy thông tin về người dùng. Ngoài ra, bạn có thể thêm các quy tắc phân quyền (authorization rule) để ngăn người dùng hoặc nhóm nào đó truy xuất các trang web hoặc thư mục con. Bạn thực hiện điều này bằng cách thêm thẻ<allow> và <deny> vào phần <authorization> của file
Web.config. Ví dụ, bạn có thể tạo một thư mục con với nội dung file Web.config như sau:
<configuration> <system.web> <authorization> <deny roles="Guest,Associate" /> <allow users="nnbphuong81" /> <deny users="*" /> </authorization> </system.web> </configuration>
ASP.NET xét qua các quy tắc phân quyền theo thứ tự chúng xuất hiện và dừng khi tìm thấy
một trùng khớp. Trong ví dụ này, người dùng trong các nhóm Guest hoặc Associate sẽ tự động bị từ chối. Người dùng nnbphuong81 sẽđược phép (trừ khi anh ta là thành viên của một trong hai nhóm bị cấm ở trên). Tất cả các người dùng khác sẽ bị từ chối. Trong trường hợp này, đây là các nhóm và tài khoản người dùng cục bộ. Nếu muốn nói đến một tài khoản miền, bạn hãy sử dụng cú pháp [DomainName]\[UserName].
Để ý trong ví dụ này, file Web.config không chứa phần <authentication>. Đó là vì phần này
đã được cấu hình trong file Web.config thuộc thư mục ứng dụng Web. Các thư mục con có thể
thiết lập các quy tắc phân quyền của chúng, nhưng chúng không thể thay đổi chếđộ xác thực. Một tùy chọn khác không cho truy xuất đến các trang cụ thể là sử dụng đặc tính <location>: <configuration> <system.web> <!-- Bỏ qua các thiết lập khác. --> </system.web> <location path="SecurePage.aspx"> <system.web> <authorization> <deny roles="Guest" /> </authorization> </system.web> </location> </configuration>
Cuối cùng, bạn có thể viết logic xác thực bằng cách kiểm tra identity của người dùng trong phần mã trang web (sử dụng thuộc tính Page.User, thuộc tính này cung cấp đối tượng WindowsPrincipal). Bạn có thể lấy tên người dùng từ thuộc tính WindowsPrincipal.Identity.Name, và bạn có thể kiểm tra vai trò thành viên trong nhóm bằng
Chương 7: ASP.NET và Web Form
phương thức WindowsPrincipal.IsInRole. Phần mã cho trang web dưới đây sẽ trình bày các kỹ thuật này:
using System; using System.Web;
using System.Web.UI.WebControls; using System.Web.Security.Principal;
public class WindowsSecurityTest : System.Web.UI.Page { protected System.Web.UI.WebControls.Label lblMessage; // (Bỏ qua phần mã designer.)
private void Page_Load(object sender, System.EventArgs e) { // Thu lấy identity đã được IIS xác thực.
WindowsIdentity identity = (WindowsIdentity)User.Identity; // Kiểm tra xem nó có phải là một Administrator hay không. bool isAdmin = User.IsInRole(@"BUILTIN\Administrators"); // Hiển thị một vài thông tin về identity.
lblMessage.Text = "You have reached the secured page, " + User.Identity.Name + "." + "<br><br>Authentication Type: " + identity.AuthenticationType.ToString() + "<br>Anonymous: " + identity.IsAnonymous.ToString() + "<br>Authenticated: " + identity.IsAuthenticated.ToString() + "<br>Guest: " + identity.IsGuest.ToString() + "<br>System: " + identity.IsSystem.ToString() + "<br>Administrator: " + isAdmin.ToString(); } } 7