ASP và Windows Form Microsoft ASP.NET phần 2

Chia sẻ: Nghia Bui Tuan | Ngày: | Loại File: PDF | Số trang:14

0
169
lượt xem
109
download

ASP và Windows Form Microsoft ASP.NET phần 2

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bạn cần thêm mã JavaScript vào một Web Form. Định nghĩa hàm JavaScript trong một chuỗi, và sử dụng phương thức Page.RegisterClientScriptBlock để chèn hàm JavaScript vào trang được trả về. Khi đó, bạn có thể thêm các đặc tính điều khiển để gọi các hàm này.

Chủ đề:
Lưu

Nội dung Text: ASP và Windows Form Microsoft ASP.NET phần 2

  1. 1.1 Đáp ứng các sự kiện phía client với JavaScript Bạn cần thêm mã JavaScript vào một Web Form. Định nghĩa hàm JavaScript trong một chuỗi, và sử dụng phương thức Page.RegisterClientScriptBlock để chèn hàm JavaScript vào trang được trả về. Khi đó, bạn có thể thêm các đặc tính điều khiển để gọi các hàm này. ASP.NET là một mô hình lập trình đa năng. Đáng tiếc, một khi trang đã được trả về dạng HTML, bạn không thể thực thi bất kỳ mã .NET nào nữa mà không phải phát sinh postback đến server. Hạn chế này làm giảm tính hiệu quả của các trang web có tính tương tác (chẳng hạn, xác nhận tính hợp lệ của đầu vào). Dĩ nhiên, không có lý do gì khiến bạn không thể trộn chức năng JavaScript phía client vào mã .NET. Mặc dù .NET không chứa bất kỳ giao diện đối tượng nào để tạo JavaScript, nhưng bạn có thể chèn nó vào trang bằng tay. Có một cách để thực hiện việc này là thiết lập đặc tính điều khiển. Ví dụ, TextBox dưới đây sẽ hiển thị một MessageBox khi nó mất focus: TextBox1.Attributes.Add("onBlur", "alert('The TextBox has lost focus!');"); Thẻ TextBox sẽ được trả về dạng HTML như sau: Trong trường hợp này, bạn sử dụng hàm JavaScript alert (nội tại) và sự kiện JavaScript onBlur (phát sinh khi một điều kiểm mất focus). Hầu hết các phần tử HTML đều hỗ trợ các sự kiện sau đây: • onFocus⎯xảy ra khi một điều kiểm nhận focus. • onBlur⎯xảy ra khi một điều kiểm mất focus. • onClick⎯xảy ra khi người dùng nhắp vào một điều kiểm. • onChange⎯xảy ra khi người dùng thay đổi giá trị của điều kiểm nào đó. • onMouseOver⎯xảy ra khi người dùng di chuyển con trỏ chuột trên một điều kiểm. Một cách khác để chèn mã JavaScript là định nghĩa một hàm JavaScript trong một biến chuỗi rồi lệnh cho ASP.NET chèn nó vào trang web được trả về. Nếu làm theo cách này, bất kỳ điều kiểm nào cũng có thể gọi hàm để đáp ứng cho một sự kiện JavaScript. Ví dụ dưới đây sẽ làm rõ kỹ thuật này bằng một trang web gồm một bảng và một bức hình (xem hình 7.2). Khi người dùng di chuyển chuột lên các ô trong bảng thì hai hàm JavaScript tùy biến sẽ được sử dụng: một tạo highlight cho ô hiện tại và một gỡ bỏ highlight khỏi ô trước đó. Ngoài ra, hàm tạo highlight còn thay đổi URL của bức hình tùy thuộc vào cột nào đang được chọn. Nếu người dùng đưa chuột lên cột thứ nhất, hình mặt
  2. cười sẽ được hiển thị. Nếu người dùng đưa chuột lên cột thứ hai hoặc thứ ba, hình quyển sách với dấu chấm hỏi nhấp nháy sẽ được hiển thị. using System; using System.Web; using System.Web.UI.WebControls; public class JavaScriptTest : System.Web.UI.Page { protected System.Web.UI.WebControls.Table Table1; protected System.Web.UI.WebControls.Image Image1; // (Bỏ qua phần mã designer.) private void Page_Load(object sender, System.EventArgs e) { // Định nghĩa các hàm JavaScript. string highlightScript = " " + "function HighlightCell(cell) {" + "cell.bgColor = '#C0C0C0';" + "if (cell.cellIndex == 0) {" + "document.Form1.Image1.src='happy_animation.gif';}" + "else {" + "document.Form1.Image1.src='question_animation.gif';}" + ";}" + ""; string unhighlightScript = " " + "function UnHighlightCell(cell) {" + "cell.bgColor = '#FFFFFF';" + "}" + ""; // Chèn hàm JavaScript vào trang (nó sẽ xuất hiện // ngay sau thẻ ). // Chú ý rằng mỗi khối kịch bản được kết hợp với một tên chuỗi. // Điều này cho phép nhiều điều kiểm đăng ký cùng khối kịch bản, // trong khi vẫn bảo đảm nó sẽ được trả về chỉ một lần
  3. // trong trang cuối cùng. if (!this.IsClientScriptBlockRegistered("Highlight")) { Page.RegisterClientScriptBlock("Highlight", highlightScript); } if (!this.IsClientScriptBlockRegistered("UnHighlight")) { Page.RegisterClientScriptBlock("UnHighlight", unhighlightScript); } // Thiết lập đặc tính cho mỗi ô trong bảng. foreach (TableRow row in Table1.Rows) { foreach (TableCell cell in row.Cells) { cell.Attributes.Add("onMouseOver", "HighlightCell(this);"); cell.Attributes.Add("onMouseOut", "UnHighlightCell(this);"); } } } The image part with relationship ID rId5 was not found in the file. Hình 7.2 Hàm JavaScript tạo highlight cho ô hiện tại Bạn cần hiểu rõ tính bảo mật của JavaScript. Tất cả mã JavaScript được trả về trực tiếp trong trang HTML, và người dùng có thể xem xét nó. Do đó, bạn đừng bao giờ đặt bất kỳ giải thuật hoặc thông tin bí mật nào vào mã JavaScript. Ngoài ra, bạn sử dụng JavaScript để kiểm tra tính hợp lệ chỉ là một tiểu xảo,
  4. không phải là một phương cách để ngăn các hành động không hợp lệ, bởi người dùng có thể vô hiệu hoặc phá hỏng JavaScript trong trình duyệt của họ. 1.2 Hiển thị cửa sổ pop-up với JavaScript Bạn cần hiển thị một cửa sổ pop-up để đáp ứng cho một hành động của người dùng. Đăng ký một hàm JavaScript (hoặc thêm một đặc tính điều khiển sự kiện), và sử dụng hàm JavaScript window.open. Vì tất cả mã ASP.NET thực thi trên server nên không có cách nào để hiển thị một cửa sổ mới từ mã C#. Bạn có thể thêm siêu liên kết vào một trang sao cho nó tự động mở trong một cửa sổ mới bằng cách thiết lập đặc tính target của thẻ là _blank, nhưng cách này vẫn không cung cấp khả năng điều khiển kích thước hoặc kiểu của cửa sổ. Giải pháp để mở cửa sổ pop-up là sử dụng mã JavaScript. Cửa sổ pop-up có thể là một trang HTML, một trang ASP.NET, một file hình, hoặc bất kỳ kiểu tài nguyên nào có thể được mở trong trình duyệt của client. Để mở một cửa sổ pop-up, bạn cần sử dụng hàm window.open và chỉ định ba thông số. Thông số thứ nhất là liên kết đến trang mới, thông số thứ hai là tên frame của cửa sổ, và thông số thứ ba là một chuỗi các đặc tính (phân cách bằng dấu phẩy) cấu hình kiểu và kích thước của cửa sổ pop-up. Các đặc tính này bao gồm: • Đặc tính height và width—được thiết lập là các giá trị tính theo pixel. • Đặc tính toolbar, menubar, và scrollbars—có thể được thiết lập là yes hay no, tùy thuộc vào bạn muốn hiển thị các phần tử này hay không. • Đặc tính resizable—có thể được thiết lập là yes hay no, tùy thuộc vào bạn muốn đường viền cửa sổ là cố định hay có thể thay đổi kích thước được. Ví dụ dưới đây trình bày cách mở một trang ASP.NET thứ hai trong một cửa sổ pop-up khi người dùng nhắp vào một Button.
  5. The image part with relationship ID rId6 was not found in the file. Hình 7.3 Hiển thị cửa sổ pop-up Bạn cần thêm đoạn mã này vào phương thức thụ lý sự kiện Page.Load. string popupScript = "window.open('PopUp.aspx', " + "'CustomPopUp', " + "'width=200, height=200, menubar=yes, resizable=no')"; cmdPopUp.Attributes.Add("onClick", popupScript); Và đây là đoạn mã (trong phương thức thụ lý sự kiện Page.Load) dùng để hiển thị cửa sổ pop-up một cách tự động khi trang được hiển thị: string popupScript = "" + "window.open('PopUp.aspx', " + "'CustomPopUp', " + "'width=200, height=200, menubar=yes, resizable=no')" + ""; Page.RegisterStartupScript("PopupScript", popupScript); 1.3 Thiết lập focus cho điều kiểm Bạn cần chỉ định điều kiểm nào sẽ nhận focus khi trang được trả về và gửi cho người dùng. Tạo một lệnh JavaScript để thiết lập focus, và thêm nó vào trang bằng phương thức Page.RegisterStartupScript.
  6. Điều kiểm web ASP.NET không cung cấp cách để thiết lập focus cho điều kiểm, mà chỉ cung cấp thuộc tính TabIndex để thiết lập thứ tự tab. Nhưng thuộc tính này chỉ áp dụng cho Microsoft Internet Explorer và không thể được sử dụng để thiết lập focus cho điều kiểm do bạn chọn. Để vượt qua hạn chế này, bạn cần sử dụng đến mã JavaScript. Phương thức dưới đây sẽ thực hiện công việc này. Nó nhận vào một tham chiếu đến bất kỳ đối tượng điều kiểm nào, thu lấy ClientID kết giao (mã JavaScript phải sử dụng ID này để tìm đến điều kiểm), rồi tạo dựng và đăng ký kịch bản để thiết lập focus. private void SetFocus(Control ctrl) { // Định nghĩa lệnh JavaScript. // Di chuyển focus đến điều kiểm bạn muốn. string setFocus = "" + "document.getElementById('" + ctrl.ClientID + "').focus();"; // Thêm mã JavaScript vào trang. this.RegisterStartupScript("SetFocus", setFocus); } Nếu thêm phương thức này vào một Web Form, bạn có thể gọi SetFocus khi cần. Ví dụ dưới đây sẽ thiết lập focus khi trang nạp lần đầu tiên: private void Page_Load(object sender, System.EventArgs e) { if (!this.IsPostBack) { // Chuyển focus đến một TextBox cụ thể. SetFocus(TextBox1); } } 1.4 Cho phép người dùng upload file Bạn cần tạo một trang cho phép người dùng upload một file. Sử dụng điều kiểm HtmlInputFile, thiết lập kiểu mã hóa của form là multipart/form-data, và lưu file bằng phương thức HtmlInputFile.PostedFile. SaveAs. Vì ASP.NET thực thi trên server nên không có cách nào để truy xuất các tài nguyên trên máy client, bao gồm file. Tuy nhiên, bạn có thể sử dụng điều kiểm System.Web.UI. HtmlControls.HtmlInputFile để cho phép người dùng upload một file. Điều kiểm này trả về phần tử HTML , hiển thị một nút Browse và một hộp chứa tên file.
  7. Người dùng nhắp vào nút Browse và chọn một file. Bước này diễn ra một cách tự động và không đòi hỏi bất kỳ đoạn mã tùy biến nào. Sau đó, người dùng phải nhắp vào một nút khác (bạn phải tạo nút này) để bắt đầu quá trình upload. Để tạo một trang cho phép upload file, bạn cần thực hiện các bước sau đây: • Thiết lập kiểu mã hóa của form là multipart/form-data. Để thực hiện thay đổi này, tìm thẻ trong file .aspx và điều chỉnh như sau: • Thêm điều kiểm HtmlInputFile vào trang. Trong Microsoft Visual Studio .NET, bạn sẽ tìm thấy điều kiểm này dưới thẻ HTML của hộp công cụ, với tên là File Field. Một khi đã thêm điều kiểm này, bạn nhắp phải vào nó và chọn Run As Server Control để tạo thẻ . • Thêm một Button khác để bắt đầu quá trình chuyển giao file đã được chỉ định (bằng phương thức HtmlInputFile.PostedFile.SaveAs). Dưới đây là phần mã cho trang upload file: using System; using System.Web; using System.Web.UI.WebControls; using System.IO; public class UploadPage : System.Web.UI.Page { protected System.Web.UI.WebControls.Label lblInfo; protected System.Web.UI.WebControls.Button cmdUpload; protected System.Web.UI.HtmlControls.HtmlInputFile FileInput; // (Bỏ qua phần mã designer.) private void cmdUpload_Click(object sender, System.EventArgs e) { if (FileInput.PostedFile.FileName == "") { // Không file nào được chỉ định. lblInfo.Text = "No file specified."; } else { try { if (FileInput.PostedFile.ContentLength > 1048576) {
  8. // Cấm các file lớn hơn 1 megabyte. lblInfo.Text = "File is too large."; }else { // File được lưu vẫn giữ lại tên file gốc của nó. string fileName = Path.GetFileName(FileInput.PostedFile.FileName); // Tiến trình ASP.NET phải có quyền đối với // vị trí nó thực hiện lưu file, nếu không // ngoại lệ "access denied" sẽ xảy ra. FileInput.PostedFile.SaveAs(fileName); lblInfo.Text = "File " + fileName + " uploaded."; } }catch (Exception err) { lblInfo.Text = err.Message; } } } } The image part with relationship ID rId7 was not found in the file. Hình 7.4 Trang thử nghiệm upload file Bạn có thể kiểm tra các thuộc tính của file được chỉ định (bao gồm kích thước của nó) trước khi lưu để ngăn kiểu tấn công từ chối dịch vụ (lừa ứng dụng ASP.NET để upload các file lớn làm đầy đĩa cứng). Tuy nhiên, đoạn mã này không ngăn người dùng submit file ngay từ đầu, điều này vẫn có thể làm chậm server và được sử dụng để mở một kiểu
  9. tấn công từ chối dịch vụ khác—nắm lấy tất cả các tiểu trình thợ ASP.NET đang rảnh. Để ngăn chặn kiểu tấn công này, bạn hãy sử dụng thẻ trong file Web.config để chỉ định kích thước tối đa của file (tính theo kilobyte): Nếu bạn không chỉ định kích thước tối đa, giá trị mặc định 4096 (4 megabyte) sẽ áp dụng. Nếu người dùng cung cấp một file quá lớn, một ngoại lệ sẽ phát sinh ngay khi trang được post-back. Có một cách khác để gửi file từ client lên web-server là sử dụng dịch vụ Web XML ASP.NET. Bạn cần phát triển một ứng dụng dựa-trên-Windows cho phép người dùng chọn một file và rồi giao tiếp với một dịch vụ Web XML để chuyển giao thông tin. 1.5 Sử dụng IIS authentication 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ực mà 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 HttpContext. 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. 1. 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 đó).
  10. 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. 2. 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). The image part with relationship ID rId8 was not found in the file. 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.
  11. The image part with relationship ID rId9 was not found in the file. 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ả Client không cần cung cấp bất kỳ thông tin nào. Người dùng Anonymous được đăng nhập bằng tài khoản nặc danh có sẵn (IUSR_[ServerName]). 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 Basic 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 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 Digest đượ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.
  12. 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, Integrated 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. 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ẻ và vào phần 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: 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].
  13. Để ý trong ví dụ này, file Web.config không chứa phần . Đó 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 : 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 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) {
  14. // 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 + "." + "Authentication Type: " + identity.AuthenticationType.ToString() + "Anonymous: " + identity.IsAnonymous.ToString() + "Authenticated: " + identity.IsAuthenticated.ToString() + "Guest: " + identity.IsGuest.ToString() + "System: " + identity.IsSystem.ToString() + "Administrator: " + isAdmin.ToString(); } }
Đồng bộ tài khoản