Archive for Tháng Ba, 2007

Chương trình Turbo C++ (Tin học đại cương)

Posted in Uncategorized on Tháng Ba 26, 2007 by Phạm Quang Hoà

Tải về: Turbo C++ 3.0

Ghi chú: Giải nén vào ổ đĩa C, chạy tệp C:\TC\BIN\TC.EXE để bắt đầu.

Bảo mật trong ASP.NET Web Service

Posted in Uncategorized on Tháng Ba 13, 2007 by Phạm Quang Hoà

Một trong những vấn đề cần quan tâm khi sử dụng Web Service đó chính là vấn đề bảo mật và quản lý tài khoản truy cập. Do Web Service được đặt trên Web Server, và có thể được truy cập thông qua Internet nên cần phải có cơ chế kiểm soát quyền truy cập và thực hiện. Bài này sẽ giới thiệu một số kỹ thuật sử dụng trong vấn đề bảo mật cho Web Service.

Quản lý tài khoản và phân quyền
ASP.NET cung cấp sẵn chức năng quản lý tài khoản và phân quyền thông qua thư việc System.Web.Security, trong đó lớp Membership quản lý các tài khoản và lớp Roles quản lý quyền và phân quyền. Các tài khoản có thể được tạo ra thông qua các trang quản trị hoặc dùng Web Service. Thông tin về các tài khoản được lưu trong một CSDL SQL Server có tên ASPNETDB.MDF (ngầm định).

Thiết lập quyền truy cập và sử dụng Web Service
Web Service cũng như Web Page, một số cho phép truy cập tự do, một số yêu cầu phải có quyền truy cập. Việc thiết lập quyền truy cập một Web Service được thực hiện như đối với Web Page, và thường được cấu hình trong web.config. Đoạn mã sau thiết lập quyền truy cập Administrators cho tất cả các trang trong thư mục admin:
<location path="Admin">
 <system.web>
  <authorization>
  <allow roles="Administrators"/>
  <deny users="*"/>
  </authorization>
 </system.web>
</location>

Tuy nhiên cách thiết lập này thường được áp dụng đối với Web Page, còn đối với Web Service thường cho phép truy cập tự do nhưng thiết lập quyền thực hiện đối với từng phương thức. Để thiết lập quyền thực hiện phương thức, thêm thuộc tính PrincipalPermission và quy định quyền tương ứng.
Đối với những phương thức chỉ yêu cầu đăng nhập, không cần quan tâm đến nhóm, thì đặt Authenticated = true. Ví dụ để thực hiện phương thức GetCategories, chỉ cần đăng nhập thành công:
[WebMethod]
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
public DiscountDataSet.CategoriesDataTable GetCategories() {
  return new DiscountDataSetTableAdapters.CategoriesTableAdapter().GetData();
}

Các phương thức cần thiết lập các quyền cụ thể, thì ứng với mỗi quyền đặt một thuộc tính PrincipalPermission. Ví dụ để thực hiện phương thức UpdateCategories, cần phải có quyền Administrators hoặc Editors, định nghĩa phương thức đó như sau:
[WebMethod]
[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
[PrincipalPermission(SecurityAction.Demand, Role = "Editors")]
public void UpdateCategories(DiscountDataSet.CategoriesDataTable categories) {
  new DiscountDataSetTableAdapters.CategoriesTableAdapter().Update(categories);
}

Đăng nhập và đăng xuất
Để có thể sử dụng các phương thức có thiết lập quyền thực hiện, cần phải đăng nhập với quyền tương ứng. Phương thức đăng nhập có thể được định nghĩa như sau:
[WebMethod]
public bool LogIn(string userName, string password) {
  if (System.Web.Security.Membership.ValidateUser(userName, password)) {
  FormsAuthentication.SetAuthCookie(userName, true);
  return true;
  } else {
  return false;
  }
}

Ở đây, việc kiểm tra tính hợp lệ của tài khoản được thực hiện bằng phương thức ValidateUser của Membership và đặt trạng thái đăng nhập bằng phương thức SetAuthCookie của FormsAuthentication. Để trạng thái đăng nhập được lưu lại phục vụ cho việc thực hiện các phương thức khác, phía client phải bật Cookie.
Phương thức đăng xuất được định nghĩa như sau:
[WebMethod]
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
public void LogOut() {
  if (Context.User.Identity.IsAuthenticated)
  FormsAuthentication.SignOut();
}

Sau khi đăng xuất, trạng thái đăng nhập bị xoá và để thực hiện được các phương thức có thiết lập quyền thì phải đăng nhập trở lại.
Để xác định trạng thái đăng nhập hiện thời, hoặc xem tài khoản đăng nhập hiện thời có nằm trong nhóm nào đó hay không, có thể định nghĩa các phương thức sau:
[WebMethod]
public bool IsAuthenticated() {
  return Context.User.Identity.IsAuthenticated;
}

[WebMethod]
public bool IsInRole(string role) {
  return System.Web.Security.Roles.IsUserInRole(role);
}

Bật Cookie phía client
Cookie dùng để lưu thông tin qua các lần gọi phương thức, ví dụ trạng thái đăng nhập. Để bật Cookie, cần phải tạo ra một đối tượng CookieContainer và gán cho thuộc tính CookieContainer của service.
service.CookieContainer = new CookieContainer();

Tạo thanh công cụ và trình đơn động

Posted in Visual Studio 2005 on Tháng Ba 6, 2007 by Phạm Quang Hoà

Với các ứng dụng tạo trên Visual Studio 2005, có thể lựa chọn Menu và Toolbar truyền thống hoặc sử dụng Menu, Toolbar mới được thiết kế riêng trên .NET Framework 2.0. Menu và Toolbar mới này được thiết kế chung và đều gọi là các ToolStrip.
Trong các ứng dụng mà số lượng các chức năng nhiều, hoặc khi muốn cùng một nút trên thanh công cụ thực hiện các công việc khác nhau tuỳ theo tài liệu được mở, thì cách thực hiện tốt nhất là tạo trình đơn và thanh công cụ động, với các đặc tính như:

  • Các chức năng riêng sẽ chỉ được hiển thị trên thanh công cụ/ trình đơn khi tài liệu tương ứng được mở.
  • Cùng một nút trên thanh công cụ, hoặc một MenuItem có thể thực hiện các công việc khác nhau tương ứng với từng tài liệu được mở, ví dụ như nút Sửa sẽ sửa đối tượng được chọn hiện thời trên tài liệu được mở.

Để thực hiện được điều này, các ToolStrip cho phép trộn hai Menu/Toolbar với nhau, khi trộn có thể có thể chọn một trong những lựa chọn sau:

  • Append: ToolStripMenuItem/ToolStripButton được thêm vào cuối của Menu hoặc ToolBar.
  • Insert: có thể lựa chọn vị trí chèn vào.
  • Replace: Thay thế ToolStripMenuItem/ToolStripButton đã có của Menu hoặc ToolBar (theo Text).
  • Remove: Loại bỏ ToolStripMenuItem/ToolStripButton đã có của Menu hoặc ToolBar.
  • MatchOnly (Thường áp dụng cho Menu): Trộn nội dung của hai ToolStripMenuItem/ToolStripButton (Theo Text).

Như vậy, có thể sử dụng tính năng này để tạo Menu/ToolBar động cho chương trình, cách làm như sau:

  1. Trên cửa sổ chính, tạo Menu và ToolBar có các chức năng chung (các chức năng không phụ thuộc tài liệu được mở) và các chức năng dùng chung (tất cả các chức năng dùng chung thiết kế trên cửa sổ chính đều disabled).
  2. Trên các tài liệu sẽ được mở trong cửa sổ chính, tạo Menu/Toolbar và thiết kế các chức năng riêng và các chức năng dùng chung được cài đặt riêng cho tài liệu đó. Menu/Toolbar này được ẩn đi vì các chức năng của nó sẽ được trộn vào Menu/Toolbar trên cửa sổ chính.
  3. Khi mở tài liệu, trộn các chức năng trên Menu/Toolbar của tài liệu vào Menu/Toolbar của cửa sổ chính.
  4. Khi đóng tài liệu, gỡ bỏ các chức năng trên Menu/Toolbar của tài liệu ra khỏi Menu/Toolbar của cửa sổ chính.
  5. Khi chuyển tài liệu: gỡ bỏ các chức năng của tài liệu cũ, trộn các chức năng của tài liệu mới.

Để trộn hai Menu/Toolbar, sử dụng phương thức Merge của ToolStripManager:

    ToolStripManager.Merge(sourceToolStrip, targetToolStrip)

Để gỡ bỏ một Menu/Toolbar đã trộn, sử dụng phương thức RevertMerge của ToolStripManager:

    ToolStripManager.RevertMerge(targetToolStrip) : Gỡ tất cả các ToolStrip đã trộn vào targetToolStrip.
    ToolStripManager.RevertMerge(targetToolStrip, sourceToolStrip): Chỉ gỡ sourceToolStrip ra khỏi targetToolStrip.