2010-02-17 46 views
5

Tôi đang làm việc trên một ứng dụng ASP.net và tôi đang cố gắng để mạo danh một người dùngLàm cách nào để mạo danh người dùng khác?

Tôi đang tạo WindowsIdentity với một mã thông báo

WindowsIdentity winId = new WindowsIdenty(token); 

thẻ này đã nhận được bằng cách gọi un quản lý mã

[DllImport("advapi32.dll")] 
public static extern int LogonUserA(String lpszUserName, 
    String lpszDomain, 
    String lpszPassword, 
    int dwLogonType, 
    int dwLogonProvider, 
    ref IntPtr phToken); 

có cách nào khác để nhận mã thông báo mà không sử dụng mã không được quản lý advapi32.dll này không?

tks

+0

Có nhiều Win32 API cách. –

Trả lời

3

Cá nhân, tôi thích wrapper class để xử lý việc mạo danh này.

Vì vậy, bạn sẽ làm việc với mã không được quản lý, nhưng AFAIK không có cách nào để thực hiện việc này với mã được quản lý trực tiếp.

+0

Mã lớp bao bọc của bạn hoạt động tốt. Cắt và dán đơn giản. Cảm ơn! –

2

xây dựng một lớp học: Impersonate.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Security; 
using System.Security.Principal; 
using System.Runtime.InteropServices; 
using System.IO; 
using System.Text; 

using System.Web; 

// you must change the YourProgramName 

namespace [YourProgramName] 
{ 
    public class Impersonate 
    { 

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

     [DllImport("kernel32.dll")] 
     private static extern int FormatMessage(int dwFlags, string lpSource, int dwMessageId, int dwLanguageId, 
               StringBuilder lpBuffer, int nSize, string[] Arguments); 


     private const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8; 
     private const int LOGON32_PROVIDER_DEFAULT = 0; 
     private const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000; 

     private static WindowsImpersonationContext winImpersonationContext = null; 

     public static void ImpersonateUser(string domain, string userName, string password) 
     { 

      //Benutzer einloggen 
      int userToken = 0; 

      bool loggedOn = (LogonUser(userName, domain, password, LOGON32_LOGON_NETWORK_CLEARTEXT, 
             LOGON32_PROVIDER_DEFAULT, out userToken) != 0); 

      if (loggedOn == false) 
      { 
       int apiError = Marshal.GetLastWin32Error(); 
       StringBuilder errorMessage = new StringBuilder(1024); 
       FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, null, apiError, 0, errorMessage, 1024, null); 
       throw new Exception(errorMessage.ToString()); 
      } 

      WindowsIdentity identity = new WindowsIdentity((IntPtr)userToken); 
      winImpersonationContext = identity.Impersonate(); 

     } 

     public static void UndoImpersonation() 
     { 
      if (winImpersonationContext != null) 
      { 
       winImpersonationContext.Undo(); 
      } 
     } 

    } 
} 

sử dụng trong chương trình của bạn:

Impersonate.ImpersonateUser("Domain", "Username", "UserPassword"); 

        //Your Code as the new User 

       Impersonate.UndoImpersonation(); 
Các vấn đề liên quan