.NET স্পেসে "ছদ্মবেশ" অর্থ সাধারণত একটি নির্দিষ্ট ব্যবহারকারীর অ্যাকাউন্টের অধীনে চলমান কোড। ব্যবহারকারীর নাম এবং পাসওয়ার্ডের মাধ্যমে সেই ব্যবহারকারীর অ্যাকাউন্টে অ্যাক্সেস পাওয়ার চেয়ে এটি কিছুটা আলাদা ধারণা, যদিও এই দুটি ধারণা প্রায়শই একসাথে জুড়ে। আমি তাদের উভয়ই বর্ণনা করব, এবং তারপরে কীভাবে আমার সিম্পিপিমারসনেশন লাইব্রেরি ব্যবহার করব , যা তাদের অভ্যন্তরীণভাবে ব্যবহার করে।
মূর্তরূপ
ছদ্মবেশ জন্য API গুলি নাম স্পেস মাধ্যমে .NET সরবরাহ করা হয় System.Security.Principal:
নবীনতর কোড (.NET 4.6+, .নেট কোর, ইত্যাদি) সাধারণত ব্যবহার করা উচিত WindowsIdentity.RunImpersonatedহয় একটি, যা ব্যবহারকারী অ্যাকাউন্টের টোকেন করার জন্য একটি হাতল গ্রহণ, এবং তারপর Actionবা Func<T>চালানো কোডের জন্য।
WindowsIdentity.RunImpersonated(tokenHandle, () =>
{
// do whatever you want as this user.
});
অথবা
var result = WindowsIdentity.RunImpersonated(tokenHandle, () =>
{
// do whatever you want as this user.
return result;
});
পুরানো কোড WindowsIdentity.Impersonateকোনও WindowsImpersonationContextঅবজেক্ট পুনরুদ্ধার করতে পদ্ধতিটি ব্যবহার করেছিল । এই অবজেক্টটি প্রয়োগ করে IDisposable, তাই সাধারণত একটি usingব্লক থেকে কল করা উচিত ।
using (WindowsImpersonationContext context = WindowsIdentity.Impersonate(tokenHandle))
{
// do whatever you want as this user.
}
এই এনপিআই এখনও। নেট ফ্রেমওয়ার্কে বিদ্যমান থাকলেও এটি সাধারণত এড়ানো উচিত, এবং। নেট কোর বা। নেট স্ট্যান্ডার্ডে উপলব্ধ নয়।
ব্যবহারকারী অ্যাকাউন্টে অ্যাক্সেস করা হচ্ছে
উইন্ডোজের কোনও ব্যবহারকারীর অ্যাকাউন্টে অ্যাক্সেস পেতে ব্যবহারকারীর নাম এবং পাসওয়ার্ড ব্যবহারের জন্য LogonUserএপিআই - এটি একটি উইন 32 নেটিভ এপিআই API এটি কল করার জন্য বর্তমানে কোনও অন্তর্নির্মিত। নেট এপিআই নেই, সুতরাং অবশ্যই একজনকে পি / ইনভোক করতে হবে।
[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);
এটি বেসিক কল সংজ্ঞা, তবে এটি উত্পাদনে আসলে এটি ব্যবহার করার জন্য আরও অনেক কিছু বিবেচনা করা উচিত:
- "নিরাপদ" অ্যাক্সেস প্যাটার্ন সহ একটি হ্যান্ডেল প্রাপ্ত।
- স্থানীয় হ্যান্ডলগুলি যথাযথভাবে বন্ধ করা হচ্ছে
- কোড অ্যাক্সেস সুরক্ষা (সিএএস) বিশ্বাসের মাত্রা (কেবলমাত্র নেট ফ্রেমওয়ার্কে)
SecureStringব্যবহারকারীর কীস্ট্রোকের মাধ্যমে আপনি নিরাপদে কোনও সংগ্রহ করতে পারবেন এমন সময় পার হচ্ছে।
এই সমস্ত চিত্রের জন্য লেখার জন্য কোডের পরিমাণ স্ট্যাকওভারফ্লো উত্তর, আইএমএইচওর বাইরে থাকা উচিত।
একটি সম্মিলিত এবং সহজ পদ্ধতি
এগুলি নিজেই লেখার পরিবর্তে, আমার সিম্পিলিপ্সারসনেশন লাইব্রেরিটি বিবেচনা করুন , যা একক এপিআইতে ছদ্মবেশ এবং ব্যবহারকারী অ্যাক্সেসকে একত্রিত করে। এটি একই সাধারণ এপিআই সহ আধুনিক এবং পুরাতন উভয় কোড ঘাঁটিতে ভাল কাজ করে:
var credentials = new UserCredentials(domain, username, password);
Impersonation.RunAsUser(credentials, logonType, () =>
{
// do whatever you want as this user.
});
অথবা
var credentials = new UserCredentials(domain, username, password);
var result = Impersonation.RunAsUser(credentials, logonType, () =>
{
// do whatever you want as this user.
return something;
});
মনে রাখবেন এটি WindowsIdentity.RunImpersonatedএপিআই এর সাথে খুব মিল , তবে টোকেন হ্যান্ডলগুলি সম্পর্কে আপনার কিছু জানা দরকার নেই।
এটি 3.0.0 সংস্করণ হিসাবে এপিআই। আরও তথ্যের জন্য প্রকল্পের রেডমি দেখুন। এছাড়াও নোট করুন যে লাইব্রেরির আগের সংস্করণটিতে IDisposableঅনুরূপ প্যাটার্ন সহ একটি API ব্যবহৃত হয়েছিল WindowsIdentity.Impersonate। নতুন সংস্করণটি অনেক বেশি নিরাপদ এবং উভয়ই অভ্যন্তরীণভাবে ব্যবহৃত হয়।