2011-10-10 45 views
9
WindowsIdentity identity = new WindowsIdentity(accessToken); 
WindowsImpersonationContext context = identity.Impersonate(); 

... 
context.Undo(); 

Tôi sẽ khai báo UserName và Passowrd ở đâu?Mạo danh với tên người dùng và mật khẩu?

các accessToken param không giúp tôi quá nhiều ...

Tôi có phải nhập khẩu DLL CỦA cho nó?

Trả lời

22

Bạn cần phải nhận của người sử dụng thẻ. Sử dụng p/gọi LogonUser từ advapi32.dll:

[DllImport("advapi32.dll", SetLastError = true)] 
    public static extern bool LogonUser(
      string lpszUsername, 
      string lpszDomain, 
      string lpszPassword, 
      int dwLogonType, 
      int dwLogonProvider, 
      out IntPtr phToken); 

Ví dụ:

IntPtr userToken = IntPtr.Zero; 

bool success = External.LogonUser(
    "john.doe", 
    "domain.com", 
    "MyPassword", 
    (int) AdvApi32Utility.LogonType.LOGON32_LOGON_INTERACTIVE, //2 
    (int) AdvApi32Utility.LogonProvider.LOGON32_PROVIDER_DEFAULT, //0 
    out userToken); 

if (!success) 
{ 
    throw new SecurityException("Logon user failed"); 
} 

using (WindowsIdentity.Impersonate(userToken)) 
{ 
    // do the stuff with john.doe's credentials 
} 
+0

Có cách nào để làm như vậy mà không có mật khẩu? Tôi có quyền truy cập vào nó như tôi đang tạo ra ngay trước khi mạo danh, chỉ nghĩ rằng tôi muốn hỏi. – Doug

+2

Tôi đoán người ta nên gọi 'CloseHandle' (như đã đề cập trong [docs for' LogonUser'] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa378184 (v = vs.85) .aspx)) cho 'userToken' sau khối sử dụng. Hay điều này được gọi theo cách nào đó bởi 'WindowsIdentity'? – CodeFox

+0

Xin chào Nếu đây là Ứng dụng ASP.NET, phạm vi của điều này là gì? Tôi có nên gọi chức năng này trong mọi trang không? –

2

Bạn cần P/gọi API LogonUser(). Điều đó chấp nhận tên người dùng, tên miền và mật khẩu và trả về một mã thông báo.

5

chính xác nội dung được nhắc đến mà bạn phải sử dụng. để có được nó, bạn cần phải gọi phương thức LogonUser:

oops không nhận ra rằng tôi chỉ có mã VB.net ở đây. tưởng tượng nó trong C#;) đây trong c#

khai phương pháp bên ngoài:

Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As [String], _ 
ByVal lpszDomain As [String], ByVal lpszPassword As [String], _ 
ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, _ 
ByRef phToken As IntPtr) As Boolean 

và thực hiện:

_Token = New IntPtr(0) 

Const LOGON32_PROVIDER_DEFAULT As Integer = 0 
'This parameter causes LogonUser to create a primary token. 
Const LOGON32_LOGON_INTERACTIVE As Integer = 2 
Const LOGON32_LOGON_NEWCREDENTIALS As Integer = 9 

_Token = IntPtr.Zero 

' Call LogonUser to obtain a handle to an access token. 
Dim returnValue As Boolean = LogonUser(_User, _Domain, _Password, LOGON32_LOGON_NEWCREDENTIALS, LOGON32_PROVIDER_DEFAULT, _Token) 

If False = returnValue Then 
    Dim ret As Integer = Marshal.GetLastWin32Error() 
    Console.WriteLine("LogonUser failed with error code : {0}", ret) 
    Throw New System.ComponentModel.Win32Exception(ret) 
End If 

_Identity = New WindowsIdentity(_Token) 
_Context = _Identity.Impersonate() 
Các vấn đề liên quan