نحوه انجام Impersonation در .NET
mohsen•3 هفته قبل
ارسال شده در
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
ارسال نظر
مرتب سازی:
اولین نفری باشید که نظر می دهید!