5

आज हमने सर्वर पर हमारे नव निर्मित एएसपी.NET एप्लिकेशन को तैनात किया और जल्द ही हमें एहसास हुआ कि एक अजीब सुरक्षा-संबंधित समस्या थी जो एप्लिकेशन को क्रैश करने का कारण बन रही थी। यह एक आंतरिक अनुप्रयोग है और हम संसाधनों तक पहुंचने के तरीके का प्रबंधन करने के लिए प्रतिरूपण का उपयोग करते हैं। हालांकि, एप्लिकेशन "एक्सेस अस्वीकृत" अपवाद फेंकता है जब उपयोगकर्ता उस फ़ोल्डर तक पहुंचने का प्रयास करता है जिस पर उनका पूर्ण नियंत्रण होता है।समांतर। फॉरएच() परिवर्तन प्रतिरूपण संदर्भ

अपवाद तथ्य एक AggregateException में था और एक तरीका है जिसके Parallel.ForEach का उपयोग करता है एक सूची से अधिक की गणना करने और शरीर के अंदर, यह फ़ोल्डर को एक्सेस करने का प्रयास में फेंक दिया जा रहा था, लेकिन इस बिंदु पर प्रतिरूपण संदर्भ बदल जाती है और कार्यकर्ता थ्रेड एप्लिकेशन पूल की पहचान के रूप में चलता है, जिसके पास अपवाद के कारण फ़ोल्डर तक पहुंच नहीं है।

इस बात की पुष्टि करने के लिए, मैं पहले और Parallel.ForEach के शरीर के अंदर प्रक्रिया पहचान को देखा:

Before Loop: MyDomain\ImpersonatedUser 

Inside Loop: NT AUTHORITY\SYSTEM (Worker Thread 8) 
Inside Loop: MyDomain\ImpersonatedUser (Worker Thread 6) 
Inside Loop: MyDomain\ImpersonatedUser (Worker Thread 7) 
Inside Loop: NT AUTHORITY\SYSTEM (Worker Thread 9) 
Inside Loop: NT AUTHORITY\SYSTEM (Worker Thread 10) 
Inside Loop: MyDomain\ImpersonatedUser (Worker Thread 7) 
Inside Loop: MyDomain\ImpersonatedUser (Worker Thread 6) 
Inside Loop: MyDomain\ImpersonatedUser (Worker Thread 7) 

के रूप में:

string before = WindowsIdentity.GetCurrent().Name; 
Debug.WriteLine("Before Loop: {0}", before); 

Parallel.ForEach(myList, currentItem => 
{ 
    string inside = WindowsIdentity.GetCurrent().Name; 
    Debug.WriteLine("Inside Loop: {0} (Worker Thread {1})", inside, Thread.CurrentThread.ManagedThreadId); 
}); 

जब मैं अनुप्रयोग चलाने, यह क्या बाहर प्रिंट हो जाती है आप देख सकते हैं, कुछ धागे प्रतिरूपित पहचान के रूप में चल रहे हैं और कुछ एप्लिकेशन पूल के रूप में चल रहे हैं (इस मामले में, LocalSystem) और ऐसा कोई प्रतीत नहीं होता है। Call Stack विंडो में पिछला फ्रेम अप्रबंधित kernel32.dll पर भी जाता है, जो मुझे लगता है कि सीएलआर ओएस को प्रस्तुत करने से पहले संदर्भ को मान्य नहीं कर रहा है।

कोई विचार यह क्यों हो रहा है? क्या यह एक ज्ञात मुद्दा/बग है?

उत्तर

3

Task वर्ग के विपरीत, ParallelExecutionContext पर कब्जा किए जाने की आप वर्तमान में चल रहे हैं (बदल जाता है में कब्जा जो SecurityContext जो WindowsIdentity रखती है) नहीं लगता है। यह वर्तमान थ्रेड के अंदर उपलब्ध एक का उपयोग करता है।

आप स्पष्ट रूप से वांछित संदर्भ कब्जा करने के लिए है:

IntPtr token = WindowsIdentity.GetCurrent().Token; 

Parallel.ForEach(myList, currentItem => 
{ 
    using (WindowsIdentity.Impersonate(token)) 
    { 
     string inside = WindowsIdentity.GetCurrent().Name; 
     Debug.WriteLine("Inside Loop: {0} (Worker Thread {1})", inside, Thread.CurrentThread.ManagedThreadId); 
    } 
}); 
+0

लेकिन वास्तव में यह एक पैटर्न क्यों प्रतीत नहीं होता है? – abatishchev

+0

मुझे भी यकीन नहीं है। मैंने पहले इस तरीके से प्रश्नों को देखा है। एक ऐसी सुविधा की तरह लगता है जिसे * लागू किया जाना चाहिए क्योंकि यह * अपेक्षित * व्यवहार है। –

+0

हां मैं 'WindowsIdentity.GetCurrent() का उपयोग कर रहा हूं। एक कामकाज के रूप में प्रतिरूपण()' लेकिन मुझे अभी भी समझ में नहीं आता है कि धागे के बीच एक विसंगति क्यों है। यदि 'SecurityContext' पर कब्जा नहीं किया जा रहा है, तो कुछ धागे अभी भी प्रतिरूपित पहचान के रूप में कैसे आते हैं? मुझे लगता है कि इसके लिए और भी कुछ है। – PoweredByOrange

0

Windows में पूरे प्रतिरूपण अवधारणा एक प्रति धागा अवधारणा है। आप देखते हैं, जब कोई नया धागा बनाया जाता है, तो यह प्रक्रिया 'विशेषाधिकार टोकन' प्राप्त करता है। लेकिन धागे, प्रक्रियाओं के विपरीत, एक प्रतिरूपण टोकन भी है। जब आप WindowsIdentity.Impersonate (टोकन) को कॉल करते हैं तो आप पर थ्रेड पर प्रतिरूपण टोकन सेट करते हैं।

जब भी आप प्रतिरूपण कहते हैं तो आप थ्रेड के प्राथमिक टोकन पॉइंटर को 'प्राथमिक टोकन' की बजाय प्रतिरूपण टोकन को इंगित करने के लिए सेट करते हैं, जो डिफ़ॉल्ट है।

WinAPI में थोड़ा और समझ और ज्ञान आपको यह जानने के लिए प्रेरित करेगा कि आपकी सेवा में क्या हुआ अपेक्षित व्यवहार है।

+2

और थोड़ा सा स्नैंक दुनिया को एक बेहतर स्थान बनाता है, और अपेक्षित व्यवहार होना चाहिए। – Loofer

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