2011-01-29 27 views
7

Tôi đang phát triển một ứng dụng cần tải trình cắm vào các miền ứng dụng con riêng biệt. Chỉ một trình cắm được tải vào một miền ứng dụng con. Mỗi trình cắm thêm yêu cầu bản sắc Windows khác nhau và các danh tính này khác với danh tính Windows được sử dụng trong miền ứng dụng mặc định (cha mẹ). Mỗi trình cắm thêm tải một hoặc nhiều trình cắm thêm con của nó.Mạo danh cấp miền ứng dụng

Ví dụ: Danh tính miền ứng dụng mặc định là Authority \ Limited (Quyền là tên miền hoặc tên máy). Hai trình cắm được tải vào hai miền ứng dụng con. Danh tính của các trình cắm được tải là Authority \ Privileged1Authority \ Privileged2. Authority \ Privileged1Authority \ Privileged2 có tất cả truy cập cơ sở dữ liệu cần thiết để Database1Database2, tương ứng, trong khi Authority \ TNHH không có quyền truy cập vào bất kỳ cơ sở dữ liệu nói trên.

Khi tạo miền ứng dụng trẻ em, tôi gọi System.AppDomain.SetThreadPrincipal phương pháp truyền System.Security.Principal.WindowsPrincipal dụ. Ví dụ được tạo từ Ví dụ System.Security.Principal.WindowsIdentity được tạo từ mã thông báo người dùng trùng lặp (xem http://support.microsoft.com/kb/306158). Tôi đã bỏ qua cuộc gọi đến Phương thức WindowsIdentity.Impersonate vì tôi đang ở miền ứng dụng mặc định trong khi tạo cá thể WIndowsPrincipal.

Tôi hy vọng rằng việc đặt chủ đề của tên miền ứng dụng sẽ đủ để các trình cắm thêm được tải thành công đăng nhập vào cơ sở dữ liệu tương ứng và thực thi một số câu lệnh T-SQL. Trước sự ngạc nhiên của tôi, giá trị trả về bởi phương thức WindowsIdentity.GetCurrent() được sử dụng khi mở kết nối tới cơ sở dữ liệu. Giá trị được trả về bởi phương thức này là nhận dạng quy trình hoặc danh tính mạo danh.

Vì danh tính quá trình không có quyền cần thiết để làm việc với cơ sở dữ liệu nên không được chấp nhận. Do đó, mạo danh phải đến để chơi. Tuy nhiên, mạo danh phải diễn ra chỉ trong các miền ứng dụng con. Mỗi trình cắm đều cho thấy các phương thức được sử dụng để thực hiện tải và dỡ tải trình cắm. Tôi hiểu rằng tôi phải thực hiện mạo danh ngay từ đầu và hoàn tác việc mạo danh khi kết thúc các phương pháp đó. Tuy nhiên, việc mạo danh phải được thực hiện đối với tất cả các chuỗi được sinh ra trong các miền ứng dụng con. Vì mỗi trình cắm thêm tải một hoặc nhiều trình cắm thêm con của nó và mỗi trình cắm thêm có thể sinh ra một hoặc nhiều luồng, việc mạo danh sẽ phải được thực hiện ở nhiều nơi và trông rất lộn xộn.

Có thể thực hiện mạo danh chỉ một lần để ảnh hưởng đến tất cả các chủ đề được sinh ra trong các miền ứng dụng con?

+1

Bạn có thể xem xét sử dụng quy trình con thay vì tên miền con và chạy các quy trình này trong tài khoản mong muốn. Việc thiết lập từ xa rõ ràng sẽ làm phức tạp mọi thứ một chút nhưng có lẽ bạn đã có một API tại chỗ phù hợp với các loại remoting. –

+0

Ứng dụng đã hỗ trợ chạy các tiến trình con theo nhận dạng tùy ý. Tuy nhiên, nó phải hỗ trợ điều tương tự cho các miền ứng dụng con. Cảm ơn. –

Trả lời

3

Không, bạn không thể làm điều đó - mạo danh là theo một chuỗi và cùng một chuỗi có thể có mã từ một số AppDomain trên một ngăn xếp cuộc gọi. Điều này đặc biệt đúng đối với các hệ thống plugin, nơi mã chính (từ một số AppDomain chính) gọi logic của plugin trong AppDomain riêng biệt.

Về cơ bản bạn phải mạo danh trước khi gọi plugin và hoàn nguyên khi bạn hoàn tất. Lưu ý rằng nếu plugin sử dụng threadpool cho các hoạt động của riêng nó thì nó sẽ cần mạo danh đúng cách.

+0

Cảm ơn, Alexei. Có sự kiện nào cho biết một chuỗi đã được gán để thực thi một số mã trong miền ứng dụng và rằng một chuỗi đã hoàn thành việc thực thi mã không? Nếu có những sự kiện như vậy, tôi có thể đăng ký cho họ và thực hiện mạo danh và đảo ngược ở một nơi, một cách tôn trọng. –

+0

Tôi không biết. Tôi không bao giờ cần điều này, tôi sẽ đọc trên remoting và xem xét thông qua không gian tên System.Runtime.Remoting để tìm hiểu. –

+0

Đủ công bằng. Cám ơn vì sự gợi ý. –

Các vấn đề liên quan