2010-01-27 2 views
0

До недавнего времени я использовал тег "<impersonate >" в web.config, а затем соответствующие учетные данные.Как я могу олицетворять файл webservice (asmx) из кода?

Теперь я пытаюсь добавить еще один файл asmx, который будет выдавать себя за другую учетную запись и пытается сделать это из кода.

Вопрос -

Как олицетворение (на каждый запрос) из кода в файле ASMX (WebService)? (я использую C#)

Я думаю, что код должен быть в ctor класса asmx, но я не уверен, что это может быть. Я искал множество примеров, но не нашел достойного кода, который делает то, что я хочу.

Спасибо заранее!

ответ

0

Если IMPERSONATE установлен в положение ON в вашем web.config вы можете указать другой верительных через:

new System.Net.NetworkCredential("username", "password", "domain"); 

Я также нашел хорошую статью How to impersonate a user given her token Он показывает, как прикрепить diffrent WindowsIdentity к данный поток

+0

Спасибо. И как мне преобразовать код в эти новые учетные данные, которые я создал? – Omer

+0

Я проверил ваш код, просто чтобы застраховаться, и он не работал. – Omer

+0

Не могли бы вы изменить учетные данные пула приложений для пользователя, которому вы хотите себя выдавать? –

0

См пример кода, как вы можете это сделать:

using System; 
using System.Runtime.InteropServices; 
using System.Security.Principal; 
using System.Security.Permissions; 

[assembly: SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode = true)] 
[assembly: PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")] 
public class ImpersonationDemo 
{ 
    [DllImport("advapi32.dll", SetLastError = true)] 
    public static extern bool LogonUser(
     String lpszUsername, 
     String lpszDomain, 
     String lpszPassword, 
     int dwLogonType, 
     int dwLogonProvider, 
     ref IntPtr phToken); 

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

    // Test harness. 
    // If you incorporate this code into a DLL, be sure to demand FullTrust. 
    [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")] 
    public static void Main(string[] args) 
    { 
     IntPtr tokenHandle = new IntPtr(0); 
     try 
     { 
      string userName, domainName; 
      // Get the user token for the specified user, domain, and password using the 
      // unmanaged LogonUser method. 
      // The local machine name can be used for the domain name to impersonate a user on this machine. 
      Console.Write("Enter the name of the domain on which to log on: "); 
      domainName = Console.ReadLine(); 

      Console.Write("Enter the login of a user on {0} that you wish to impersonate: ", domainName); 
      userName = Console.ReadLine(); 

      Console.Write("Enter the password for {0}: ", userName); 

      const int LOGON32_PROVIDER_DEFAULT = 0; 
      //This parameter causes LogonUser to create a primary token. 
      const int LOGON32_LOGON_INTERACTIVE = 2; 

      tokenHandle = IntPtr.Zero; 

      // Call LogonUser to obtain a handle to an access token. 
      bool returnValue = LogonUser(
       userName, 
       domainName, 
       Console.ReadLine(), 
       3, 
       LOGON32_PROVIDER_DEFAULT, 
       ref tokenHandle); 

      Console.WriteLine("LogonUser called."); 

      if (false == returnValue) 
      { 
       int ret = Marshal.GetLastWin32Error(); 
       Console.WriteLine("LogonUser failed with error code : {0}", ret); 
       throw new System.ComponentModel.Win32Exception(ret); 
      } 

      Console.WriteLine("Did LogonUser Succeed? " + (returnValue ? "Yes" : "No")); 
      Console.WriteLine("Value of Windows NT token: " + tokenHandle); 

      // Check the identity. 
      Console.WriteLine("Before impersonation: " + WindowsIdentity.GetCurrent().Name); 
      // Use the token handle returned by LogonUser. 

      WindowsIdentity newId = new WindowsIdentity(tokenHandle); 

      using (WindowsImpersonationContext impersonatedUser = newId.Impersonate()) 
      { 
       // Check the identity. Here you shoul place code that will be executed on belaf of other login. 
       Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name); 
       GC.KeepAlive(impersonatedUser); 
      } 

      // Check the identity. 
      Console.WriteLine("After Undo: " + WindowsIdentity.GetCurrent().Name); 

      // Free the tokens. 
      if (tokenHandle != IntPtr.Zero) 
       CloseHandle(tokenHandle); 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Exception occurred. " + ex.Message); 
     } 

    } 
} 
+0

Благодарим вас за этот пример кода. Я видел что-то подобное в CodeProject. К сожалению, мне нужно сделать это для олицетворения веб-сервиса, и этот код относится к консольному приложению ... – Omer

+0

Я проверил этот код в контексте веб-службы, и он не работал. – Omer

Смежные вопросы