2010-06-07 25 views
5

tôi đã sử dụng mã mạo danh phổ biến và nó chỉ làm việc tốt, cho đến khi tôi chèn ngẫu nhiên 'dggdgsdg' ở miền - và nó làm việc dù sao ...Mạo danh một người sử dụng trong phạm vi sai không ném ngoại lệ

if (LogonUser(Username, Domain, Password, Logon32LogonInteractive, Logon32ProviderDefault, ref existingTokenHandle) && 
    DuplicateToken(existingTokenHandle, (int)SecurityImpersonationLevel.SecurityDelegation, ref duplicateTokenHandle)) 
    { 
      Identity = new WindowsIdentity(duplicateTokenHandle); 
      ImpersonationContext = Identity.Impersonate(); 
    } 
    else 
    { 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

Tôi đã sử dụng một số TestUser trên miền của tôi và nó đã hoạt động. Sau đó tôi chuyển tên miền sang ngẫu nhiên 'werwerhrg' và mạo danh Người thử nghiệm trên tên miền của tôi! Tại sao? Tôi mong chờ một ngoại lệ được ném ra, tại sao nó lại hoạt động?

private const int Logon32LogonInteractive = 2; 
private const int Logon32ProviderDefault = 0; 

public enum SecurityImpersonationLevel 
     { 
      SecurityAnonymous = 0, 
      SecurityIdentification = 1, 
      SecurityImpersonation = 2, 
      SecurityDelegation = 3 
     } 
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); 

[DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
private extern static bool CloseHandle(IntPtr handle); 

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
private static extern bool DuplicateToken(IntPtr existingTokenHandle, int securityImpersonationLevel, ref IntPtr duplicateTokenHandle); 
+1

Thông thường với xác thực tên miền, những gì tôi thấy là tên người dùng/miền được kết hợp. Vì vậy, bạn chỉ định MyDomain \ TestUser hoặc TestUser @ MyDomain. Hãy thử chỉ định tên người dùng của bạn như thế và xem điều gì sẽ xảy ra. Tôi đoán rằng máy của bạn là thành viên của miền mục tiêu và bằng cách nào đó, máy đó đang cố gắng sử dụng người dùng trên miền đó thay vì tên miền được chỉ định. –

+0

@Tim, tôi đã thử điều đó, không may mắn. Nếu tôi chỉ định 'domain \ testUser' làm tên người dùng, tôi sẽ nhận được ngoại lệ 'tên người dùng không xác định hoặc mật khẩu không đúng'. – Rita

+1

Đăng thông báo P/Invoke của bạn. –

Trả lời

4

Tôi tin câu trả lời nằm ở cách xác thực được thực hiện. LogonUser sẽ cố gắng đăng nhập bạn vào máy tính cục bộ mà nó đã được thực thi. Nếu máy tính này nằm trên một miền thì mật khẩu của bạn sẽ được kiểm tra với bộ điều khiển AD và được xác minh.

Nếu bạn tuy nhiên cung cấp tên miền không thể tìm thấy, miền đó sẽ xác thực dựa trên đó là cơ sở người dùng cục bộ của chính nó dưới dạng dự phòng. Tại địa phương nó sẽ sử dụng NTLM (NTLM được sử dụng khi máy khách và máy chủ là cùng một máy). NTLM xác minh băm mật khẩu và tên người dùng, và dường như không bận tâm với tên miền (ref doc).

Nếu bạn sử dụng UPN format instead and set domain to null thì bạn sẽ gặp lỗi nếu miền không tồn tại và nhận được kết quả mong muốn của bạn.

Điều này cũng tương tự như khi tôi tạo người dùng A bằng mật khẩu B trên hai máy, sau đó những người dùng đó có thể truy cập từng máy khác bằng quyền cục bộ mà không phải đăng nhập. Và tất cả điều này là một lý do chính đáng tại sao bạn nên tránh xa các tài khoản cục bộ trong một thế giới tên miền (ít nhất là với cùng tên người dùng, tiền tố chúng), và tại sao các máy không phải tên miền không thể nhìn thấy nhau trên các trang web khác. một mạng lưới. Và tại sao bạn nên sử dụng Kerberos trên tất cả nếu bạn có thể thay vì NTLM.

+0

Cảm ơn bạn rất nhiều! – Rita

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