CÁC GIẢI PHÁP LẬP TRÌNH C# - Trang 544

544
Chương 13: Bảo mật

dụng trong ngữ cảnh của một tài khoản Windows khác. Điều này đúng trong trường hợp các
ứng dụng phía server cần xử lý phiên giao dịch dựa trên danh nghĩa của các người dùng kết
nối đến server. Thông thường, một ứng dụng server chạy trong ngữ cảnh của tài khoản
Windows được tạo riêng cho ứng dụng—đây là tài khoản dịch vụ (service account). Tài khoản
dịch vụ này sẽ có các quyền tối thiểu để truy xuất các tài nguyên hệ thống, làm cho ứng dụng
hoạt động như thể đó là người dùng đã kết nối cho phép ứng dụng truy xuất các hoạt động và
tài nguyên phù hợp với quyền hạn của người dùng đó. Khi một ứng dụng nắm lấy định danh
của một người dùng khác, đây là sự giả nhận (impersonation). Nếu được hiện thực đúng, sự
giả nhận sẽ đơn giản hóa việc quản trị bảo mật và thiết kế ứng dụng, trong khi vẫn duy trì việc
giải trình người dùng.

Như đã thảo luận trong mục 13.14, Windows access token.NET principal của
một tiểu trình là các thực thể riêng biệt và có thể mô tả những người dùng khác
nhau. Kỹ thuật giả nhận được mô tả trong mục này chỉ thay đổi Windows access
token
của tiểu trình hiện hành, chứ không thay đổi principal của tiểu trình này.
Để thay đổi principal
của tiểu trình, mã lệnh của bạn phải có phần tử

ControlPrincipal

của

SecurityPermission

và gán một đối tượng

System.Security.Principal.IPrincipal

mới vào thuộc tính

CurrentPrincipal

của

System.Threading.Thread

hiện hành.

Lớp

System.Security.Principal.WindowsIdentity

cung cấp các chức năng mà thông qua đó,

bạn có thể thực hiện sự giả nhận. Tuy nhiên, quá trình này tùy thuộc vào ứng dụng của bạn
đang chạy trên phiên bản Windows nào. Trên Windows Server 2003 trở về sau, lớp

WindowsIdentity

hỗ trợ các phiên bản nạp của chồng phương thức khởi dựng, cho phép tạo ra

các đối tượng

WindowsIdentity

dựa trên tên tài khoản của người dùng cần giả nhận. Trên tất

cả các phiên bản Windows trước đó, trước hết bạn phải thu lấy

System.IntPtr

chứa tham

chiếu đến Windows access token mô tả người dùng cần giả nhận. Để thu lấy tham chiếu này,
bạn cần sử dụng một phương thức nguyên sinh như

LogonUser

của Win32 API.

Vấn đề chủ yếu khi thực hiện sự giả nhận trên Windows 2000Windows NT
một tài khoản phải có đặc quyền SE_TCB_NAME
thì mới có thể thực thi

LogonUser

. Điều này đòi hỏi bạn cấu hình chính sách bảo mật của Windows

cấp cho tài khoản quyền “Act as part of operating system” (mức tin cậy rất cao).
Bạn đừng bao giờ trực tiếp cấp đặc quyền SE_TCB_NAME
cho các tài khoản
người dùng.

Một khi đã có đối tượng

WindowsIdentity

mô tả người dùng cần giả nhận, bạn hãy gọi

phương thức

Impersonate

của nó. Từ lúc này, tất cả các hành động mà mã lệnh của bạn thực

hiện đều diễn ra trong ngữ cảnh của tài khoản Windows đã được giả nhận. Phương thức

Impersonate

trả về đối tượng

System.Security.Principal.WindowsSecurityContext

, đối

tượng này mô tả tài khoản tích cực trước khi giả nhận. Để trở về tài khoản cũ, bạn cần gọi
phương thức

Undo

của đối tượng

WindowsSecurityContext

này.

Ứng dụng dưới đây trình bày sự giả nhận của một người dùng Windows. Ứng dụng này cần
hai đối số dòng lệnh: tên tài khoản của người dùng cần giả nhận và password của tài khoản.

Liên Kết Chia Sẽ

** Đây là liên kết chia sẻ bới cộng đồng người dùng, chúng tôi không chịu trách nhiệm gì về nội dung của các thông tin này. Nếu có liên kết nào không phù hợp xin hãy báo cho admin.