2011-12-12 28 views
5

Tôi có một dự án asp.net, nơi yêu cầu sẽ ủy quyền công việc cho nền (qua quartz.net). Ứng dụng web đang sử dụng xác thực cửa sổ và mạo danh.Windows Mạo danh và nhân bản mã thông báo

Tôi cũng muốn mạo danh người dùng hiện tại trên chuỗi nền. Tôi đã đọc cách mạo danh người dùng với tên miền, tên người dùng và mật khẩu được cung cấp và gọi ra hạt nhân. Phương thức đó hoạt động.

IntPtr token; 
var successfullLogon = LogonUser(userName, password, domain, logonType, logonProvider, out token); 
if(successfullLogon == false) 
{ 
    var errorCode = Marshal.GetHRForLastWin32Error(); 
    Marshal.ThrowExceptionForHR(errorCode); 
} 

Điều đó có tác dụng nhưng yêu cầu tôi cung cấp tên người dùng/mật khẩu cụ thể hoặc yêu cầu người dùng nhập mật khẩu của họ. không phải tình huống nào là lý tưởng.

Điều tôi muốn là chuyển mã thông báo từ danh tính của người dùng từ yêu cầu tới nền và sau đó mạo danh người dùng từ mã thông báo hiện tại này. Tôi đọc rằng tôi nên có thể gọi DuplicateHandle,

var token = ((WindowsIdentity)Request.User.Identity).GetToken().ToInt64(); 
var token = new IntPrt(token from request); 
IntPtr duplicate; 
try 
{ 
    if(NaviteMethod.DuplicateToken(token, SecurityImpersonationLevel.Impersonate, out duplicate) == false) 
    { 
     var errorCode = Marshal.GetHRForLastWin32Error(); 
     Marshal.ThrowExceptionForHR(errorCode); 
    } 

    using(var identity = new WindowsIdentity(duplicate)) 
    using(var context = identity.Impersonate()) 
    { 
     //do work 
     context.Undo(); 
    } 
} 
finally 
{ 
    if(duplicate != IntPtr.Zero) 
    { 
     NaviteMethod.CloseHandler(duplicate); 
    } 
} 

Nhưng tôi nhận được một ngoại lệ chồng chéo I/O hoạt động là cơ bản dở dang

Các cuộc gọi NativeMethod đến từ bài đăng này: How do I pass credentials to a machine so I can use Microsoft.Win32.RegistryKey.OpenRemoteBaseKey() on it?

Có thể sử dụng mã thông báo của người dùng hiện tại và mạo danh người dùng đó trên một chuỗi nền không? Nếu vậy làm thế nào điều này có thể được thực hiện và có bất kỳ quyền truy cập người dùng cần thiết cho điều này xảy ra?

Trả lời

1

Rất tiếc, bạn không thể bỏ qua "LogonUser". Một tùy chọn là sử dụng ASP.NET Impersonation. Điều thứ hai bạn đã có nếu bạn thay thế hai dòng đầu tiên của khối mã thứ hai bằng mã khối đầu tiên.

+0

Tôi đã sử dụng mạo danh cho các yêu cầu http. mã này thực hiện trong nền vì vậy nó độc lập với mạo danh asp.net. tùy chọn thứ hai là những gì tôi hiện có tại chỗ và có vẻ là giải pháp tôi sẽ gắn bó với. –

+0

Lựa chọn tuyệt vời. Nó sẽ tiết kiệm thời gian của bạn. –

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