Trong hành trình của tôi để nắm vững các sắc thái của mạo danh người dùng trong Windows, trước tiên tôi gặp phải vấn đề về việc mạo danh cơ sở dữ liệu từ xa (xem this SO question) nhưng cuối cùng tôi đã tìm ra điều đó. Rào cản tiếp theo của tôi là hoàn tác/hủy/hoàn nguyên (chọn động từ yêu thích của bạn) mạo danh.Windows Mạo danh: Một lỗ hổng trong thuốc mỡ
Tôi đã thử một vài thư viện mạo danh khác nhau mà có vẻ đáng tin cậy với tôi:
- Phil Harding của Impersonator
- Matt Johnson SimpleImpersonation
Kết quả là giống hệt nhau với cả hai thư viện. Các phương pháp hay nhất quyết định sử dụng loại đăng nhập LOGON32_LOGON_NEW_CREDENTIALS (xem API Windows LogonUser function) cho kết nối DB từ xa. Khi tôi làm điều đó ở đây là những gì mẫu mã của tôi sản xuất:
// SCENARIO A
BEGIN impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\ImpersonatedUser
END impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\ImpersonatedUser << NOT EXPECTED HERE!!
Cách giải quyết duy nhất mà tôi đã tìm thấy là sử dụng các loại LOGON32_LOGON_INTERACTIVE đăng nhập và sau đó tôi có được điều này:
// SCENARIO B
BEGIN impersonation.
Local user = MyDomain\ImpersonatedUser << EXPECTED, BUT NOT WANTED!
DB reports: MyDomain\ImpersonatedUser
END impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\MyUser
Từ các mô tả ngắn gọn của phương pháp WindowsImpersonationContext.Undo có vẻ như nó đã hoạt động trong Kịch bản A.
Có thể hoàn nguyên bằng cách sử dụng loại đăng nhập LOGON32_LOGON_NEW_CREDENTIALS không?
Đóng và mở lại kết nối với cơ sở dữ liệu. Cơ sở dữ liệu không nhận được thông báo khi bạn thay đổi cấp độ mạo danh. Tôi chỉ có thể đoán rằng trong kịch bản B, trình khách cơ sở dữ liệu tự động thiết lập một kết nối mới. –
Cảm ơn nhận xét, @HarryJohnston; Tôi nên đã nói rằng tôi đã làm, trên thực tế, đóng kết nối SQL và bắt đầu một tươi. –
Có lẽ máy khách cơ sở dữ liệu đang lưu vào bộ nhớ đệm kết nối SQL, hoặc nhiều khả năng là kết nối mạng bên dưới (một đường ống có tên?). Tùy chọn tốt nhất của bạn có lẽ là khởi chạy một tiến trình con (trong ngữ cảnh của mã thông báo mới) để thực hiện kết nối cơ sở dữ liệu giả mạo cho bạn. –