نحوه انجام Impersonation در .NET

mohsen3 هفته قبل
ارسال شده در
csharp

اصطلاح Impersonation به معنای اجرای کد تحت یک حساب کاربری خاص است.

استفاده از WindowsIdentity.RunImpersonated

بهترین راه برای Impersonation در نسخه‌های جدید استفاده از متد WindowsIdentity.RunImpersonated است. این متد یک handle بعنوان توکن کاربر و یک Action یا Func<T> که کد مورد نظر برای اجرا تحت حساب کاربری مورد نظر است، را می گیرد:

      WindowsIdentity.RunImpersonated(userHandle, () =>
{
    // کد شما به عنوان این کاربر اجرا می‌شود.
});

    

همچنین می‌توانید از متد WindowsIdentity.RunImpersonatedAsync برای کارهای نامتقارن استفاده کنید که در .NET 5+ موجود است:

      await WindowsIdentity.RunImpersonatedAsync(userHandle, async () =>
{
    // کد شما به عنوان این کاربر اجرا می‌شود.
});

    

بدست آوردن userHandle

برای اینکار باید از متد LogonUser که از APIهای Win32 است استفاده کنیم.

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

    

و کد زیر را به برنامه اضافه کنیم:

      const int LOGON32_PROVIDER_DEFAULT = 0;
.
const int LOGON32_LOGON_INTERACTIVE = 2;
SafeAccessTokenHandle userHandle;
bool returnValue = LogonUser(userName, domainName, password,
        LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
        out userHandle
);

    

برای استفاده راحت‌تر، می‌توانید از کتابخانه‌های موجود مانند SimpleImpersonation استفاده کنید که یک wrapper مدیریت‌شده برای API LogonUser ارائه می‌دهد:

      using SimpleImpersonation;

var credentials = new UserCredentials(domain, username, password);
using SafeAccessTokenHandle userHandle = credentials.LogonUser(LogonType.Interactive);

    
رای
0
ارسال نظر
مرتب سازی:
اولین نفری باشید که نظر می دهید!