2011-12-12 16 views
5

मेरे पास एक एएसपीनेट प्रोजेक्ट है जहां अनुरोध पृष्ठभूमि में (quartz.net के माध्यम से) काम करेगा। वेब अनुप्रयोग विंडोज प्रमाणीकरण और प्रतिरूपण का उपयोग कर रहा है।विंडोज प्रतिरूपण और डुप्लिकेट टोकन

मैं पृष्ठभूमि उपयोगकर्ता पर भी वर्तमान उपयोगकर्ता का प्रतिरूपण करना चाहूंगा। मैंने पढ़ा है कि उपयोगकर्ता को एक आपूर्ति डोमेन नाम, उपयोगकर्ता नाम और पासवर्ड के साथ प्रतिरूपण कैसे करना है और कर्नेल को कॉल करना है। वह विधि काम करता है।

IntPtr token; 
var successfullLogon = LogonUser(userName, password, domain, logonType, logonProvider, out token); 
if(successfullLogon == false) 
{ 
    var errorCode = Marshal.GetHRForLastWin32Error(); 
    Marshal.ThrowExceptionForHR(errorCode); 
} 

काम करता है यही कारण है कि है, लेकिन यह मुझे की आवश्यकता है चाहे किसी विशिष्ट उपयोगकर्ता नाम/पासवर्ड प्रदान करते हैं या उपयोगकर्ता अपना पासवर्ड डाल करने के लिए। न तो स्थिति आदर्श है।

मुझे क्या चाहिए कि उपयोगकर्ता की पहचान से टोकन को पृष्ठभूमि से अनुरोध से पास करना है और फिर उपयोगकर्ता को इस मौजूदा टोकन से प्रतिरूपित करना है। मैंने पढ़ा है कि मैं, DuplicateHandle कॉल करने के लिए सक्षम होना चाहिए

var token = ((WindowsIdentity)Request.User.Identity).GetToken().ToInt64(); 
var token = new IntPrt(token from request); 
IntPtr duplicate; 
try 
{ 
    if(NaviteMethod.DuplicateToken(token, SecurityImpersonationLevel.Impersonate, out duplicate) == false) 
    { 
     var errorCode = Marshal.GetHRForLastWin32Error(); 
     Marshal.ThrowExceptionForHR(errorCode); 
    } 

    using(var identity = new WindowsIdentity(duplicate)) 
    using(var context = identity.Impersonate()) 
    { 
     //do work 
     context.Undo(); 
    } 
} 
finally 
{ 
    if(duplicate != IntPtr.Zero) 
    { 
     NaviteMethod.CloseHandler(duplicate); 
    } 
} 

लेकिन मैं

NativeMethod कॉल इस पोस्ट से आते हैं एक अपवाद पर छा आई/ओ कार्रवाई जारी है मिलती है: How do I pass credentials to a machine so I can use Microsoft.Win32.RegistryKey.OpenRemoteBaseKey() on it?

क्या वर्तमान उपयोगकर्ता के टोकन का उपयोग करना संभव है और पृष्ठभूमि उपयोगकर्ता पर उस उपयोगकर्ता का प्रतिरूपण करना संभव है? यदि ऐसा है तो यह कैसे किया जा सकता है और क्या ऐसा होने के लिए कोई उपयोगकर्ता पहुंच अधिकार आवश्यक है?

उत्तर

1

दुर्भाग्य से आप "लॉगऑनसर" को बाईपास नहीं कर सकते हैं। एक विकल्प ASP.NET Impersonation का उपयोग करना है। यदि आप पहले ब्लॉक कोड के साथ अपने दूसरे कोड ब्लॉक की पहली दो पंक्तियों को प्रतिस्थापित करते हैं तो दूसरा आपके पास पहले से है।

+0

मैं पहले से ही http अनुरोधों के प्रतिरूपण का उपयोग कर रहा हूं। यह कोड पृष्ठभूमि में निष्पादित करता है, इसलिए यह एएसपीनेट प्रतिरूपण से स्वतंत्र है। दूसरा विकल्प वह है जो मेरे पास वर्तमान में है और यह उस समाधान के रूप में दिखता है जिसके साथ मैं रहूंगा। –

+0

उत्कृष्ट विकल्प। यह आपका समय बचाएगा। –

संबंधित मुद्दे