C# - IMPERSONATION KULLANIMI (Kod Aralıgında Yetki Alma)


Eger işlemi default kullanıcı bilgileri ile yapıyorsak , bazı işlemleri yaparken kullanıcı yetkisi yeterli olmayabilir.Bunun için yetki gereken işleri yapmadan önce yetkili birinin bilgilerini verir sonra yetkiyi tekrar alabiliriz.
Yukarida tanımladıgım işlem için once bir Impersonate adında class tanımlayalım ve içerigi asagıdakı gibi olsun.

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Principal;
namespace SametPlugins
{
  public class Impersonate
  {
    public Impersonate()
    {
    }
    public const int LOGON32_LOGON_INTERACTIVE = 2;
    public const int LOGON32_PROVIDER_DEFAULT = 0;

    WindowsImpersonationContext impersonationContext;

    [DllImport("advapi32.dll")]
    public static extern int LogonUserA(String lpszUserName,
        String lpszDomain,
        String lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int DuplicateToken(IntPtr hToken,
        int impersonationLevel,
        ref IntPtr hNewToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool RevertToSelf();

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

    public bool impersonateValidUser(String userName, String domain, String password)
    {
      WindowsIdentity tempWindowsIdentity;
      IntPtr token = IntPtr.Zero;
      IntPtr tokenDuplicate = IntPtr.Zero;

      if (RevertToSelf())
      {
        if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT, ref token) != 0)
        {
          if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
          {
            tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
            impersonationContext = tempWindowsIdentity.Impersonate();
            if (impersonationContext != null)
            {
              CloseHandle(token);
              CloseHandle(tokenDuplicate);
              return true;
            }
          }
        }
      }
      if (token != IntPtr.Zero)
        CloseHandle(token);
      if (tokenDuplicate != IntPtr.Zero)
        CloseHandle(tokenDuplicate);
      return false;
    }

    public void undoImpersonation()
    {
      impersonationContext.Undo();
    }
  }
}

Daha sonra kod tarafında bu classı kullanmak için,classtan nesne uretır ve impersonateValidUser metodunu kullanarak yetkiyi verir.İşlemimizi yaptıktan sonra yetkiyi almak için undoImpersonation metodunu cagırırız.

Örnek Kod:

//Kod

Impersonate impersonate=new Impersonate();
impersonate.impersonateValidUser("kullaniciadi","domainadi","sifre");

/*Yetki gerektiren kod bu araya yazılacak*/

impersonate.undoImpersonation();/*Tekrar default kullanıcıya geri donuldu*/


Hiç yorum yok:

Yorum Gönder