540
Chương 13: Bảo mật
xem các yêu cầu RBS khai báo bằng công cụ Permview.exe (đã được thảo luận trong mục
13.6). Cho dù hiện thực yêu cầu RBS bắt buộc hay khai báo, bạn cũng phải chắc rằng bộ thực
thi có thể truy xuất tên và các vai trò của người dùng hiện hành để đánh giá yêu cầu một cách
phù hợp.
Lớp
System.Threading.Thread
mô tả một tiểu trình của hệ điều hành (chạy mã lệnh được-
quản-lý). Thuộc tính tĩnh
CurrentPrincipal
của lớp
Thread
chứa một thể hiện
IPrincipal
—
mô tả người dùng mà tiểu trình hiện đang chạy trên danh nghĩa của người này. Ở mức hệ điều
hành, mỗi tiểu trình cũng có một Windows access token kết giao—mô tả tài khoản Windows
mà tiểu trình hiện đang chạy trên danh nghĩa của tài khoản này. Bạn cần hiểu rằng thể hiện
IPrincipal
và Windows access token là hai thực thể riêng biệt. Windows sử dụng access
token để thực hiện cơ chế bảo mật hệ điều hành, trong khi bộ thực thi .NET sử dụng thể hiện
IPrincipal
để đánh giá các yêu cầu RBS ở mức ứng dụng. Mặc dù chúng có thể mô tả cùng
một người dùng, nhưng điều này không có nghĩa là luôn luôn như vậy.
Theo mặc định, thuộc tính
Thread.CurrentPrincipal
là không xác định. Vì việc thu lấy các
thông tin liên quan đến người dùng có thể mất nhiều thời gian, và chỉ một phần nhỏ trong số
các ứng dụng sử dụng thông tin này, các nhà thiết kế .NET chọn cách khởi dựng "lười" đối với
thuộc tính
CurrentPrincipal
. Trước tiên, mã lệnh thu lấy thuộc tính
Thread.CurrentPrincipal
, bộ thực thi gán một thể hiện
IPrincipal
cho thuộc tính này theo
logic sau đây:
1. Nếu miền ứng dụng mà tiểu trình hiện hành đang thực thi có một principal mặc định,
thì bộ thực thi sẽ gán principal này cho thuộc tính
Thread.CurrentPrincipal
.
Theo mặc định, miền ứng dụng không có principal mặc định. Bạn có thể thiết lập
principal mặc định của một miền ứng dụng bằng cách gọi phương thức
SetThreadPrincipal
trên một đối tượng
System.AppDomain
mô tả miền ứng dụng bạn
muốn cấu hình. Để gọi
SetPrincipalPolicy
, mã lệnh của bạn phải có phần tử
ControlPrincipal
của
SecurityPermission
. Bạn chỉ có thể thiết lập principal mặc định
một lần cho mỗi miền ứng dụng; lời gọi
SetThreadPrincipal
thứ hai dẫn đến ngoại lệ
System.Security.Policy.PolicyException
.
2. Nếu miền ứng dụng không có principal mặc định, chính sách principal của miền ứng
dụng sẽ xác định hiện thực
IPrincipal
nào sẽ được tạo ra và gán nó cho
Thread.CurrentPrincipal
.
Để cấu hình chính sách principal cho một miền ứng dụng, bạn cần thu lấy đối tượng
AppDomain
mô tả miền ứng dụng và gọi phương thức
SetPrincipalPolicy
của đối tượng
này. Phương thức
SetPrincipalPolicy
nhận vào một thành viên thuộc kiểu liệt kê
System.Security.Principal.PrincipalPolicy
, giá trị này cho biết kiểu của đối tượng
IPrincipal
sẽ được gán cho
Thread.CurrentPrincipal
. Để gọi
SetPrincipalPolicy
,
mã lệnh của bạn phải có phần tử
ControlPrincipal
của
SecurityPermission
. Bảng 13.4
liệt kê các giá trị của
PrincipalPolicy
; giá trị mặc định là
UnauthenticatedPrincipal
.
3. Nếu mã lệnh của bạn có phần tử
ControlPrincipal
của
SecurityPermission
, bạn có thể
tự tạo ra đối tượng
IPrincipal
và trực tiếp gán nó cho thuộc tính