.NET स्पेस में "प्रतिरूपण" का अर्थ आम तौर पर किसी विशिष्ट उपयोगकर्ता खाते के अंतर्गत कोड चलाना है। यह उपयोगकर्ता नाम और पासवर्ड के माध्यम से उस उपयोगकर्ता खाते तक पहुंचने की तुलना में एक अलग अवधारणा है, हालांकि ये दोनों विचार एक साथ अक्सर मिलते हैं। मैं उन दोनों का वर्णन करूंगा, और फिर समझाऊंगा कि मेरी SimpleImpersonation लाइब्रेरी का उपयोग कैसे करें , जो उन्हें आंतरिक रूप से उपयोग करता है।
वेष बदलने का कार्य
प्रतिरूपण के लिए एपीआई System.Security.Principalनामस्थान के माध्यम से .NET में दिए गए हैं :
नए कोड (.NET 4.6+, .NET कोर, आदि) को आम तौर पर उपयोग करना चाहिए 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.
}
जबकि यह एपीआई अभी भी .NET फ्रेमवर्क में मौजूद है, इसे आम तौर पर टाला जाना चाहिए, और यह .NET कोर या .NET मानक में उपलब्ध नहीं है।
उपयोगकर्ता खाते तक पहुँचना
विंडोज में उपयोगकर्ता खाते तक पहुंचने के लिए उपयोगकर्ता नाम और पासवर्ड का उपयोग करने के लिए LogonUserएपीआई है - जो कि एक Win32 देशी एपीआई है। वर्तमान में इसे कॉल करने के लिए अंतर्निहित .NET API नहीं है, इसलिए किसी को P / Invoke का सहारा लेना चाहिए।
[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);
यह मूल कॉल परिभाषा है, हालांकि उत्पादन में वास्तव में इसका उपयोग करने पर विचार करने के लिए बहुत कुछ है:
- "सुरक्षित" एक्सेस पैटर्न के साथ एक हैंडल प्राप्त करना।
- मूल हैंडल को उचित रूप से बंद करना
- कोड पहुंच सुरक्षा (CAS) विश्वास स्तर (केवल .NET फ्रेमवर्क में)
SecureStringजब आप उपयोगकर्ता कीस्ट्रोक्स के माध्यम से एक को सुरक्षित रूप से एकत्र कर सकते हैं तो पासिंग ।
इस सब को स्पष्ट करने के लिए लिखने के लिए कोड की मात्रा एक StackOverflow उत्तर, IMHO में क्या होना चाहिए, इससे परे है।
एक संयुक्त और आसान दृष्टिकोण
यह सब स्वयं लिखने के बजाय, मेरी SimpleImpersonation लाइब्रेरी का उपयोग करने पर विचार करें , जो एक एकल API में प्रतिरूपण और उपयोगकर्ता अभिगम को जोड़ती है। यह आधुनिक और पुराने कोड बेस दोनों में समान सरल एपीआई के साथ अच्छी तरह से काम करता है:
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इसी तरह के पैटर्न के साथ एक एपीआई का उपयोग किया गया था WindowsIdentity.Impersonate। नया संस्करण बहुत सुरक्षित है, और दोनों अभी भी आंतरिक रूप से उपयोग किए जाते हैं।