आज हमने सर्वर पर हमारे नव निर्मित एएसपी.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
पर भी जाता है, जो मुझे लगता है कि सीएलआर ओएस को प्रस्तुत करने से पहले संदर्भ को मान्य नहीं कर रहा है।
कोई विचार यह क्यों हो रहा है? क्या यह एक ज्ञात मुद्दा/बग है?
लेकिन वास्तव में यह एक पैटर्न क्यों प्रतीत नहीं होता है? – abatishchev
मुझे भी यकीन नहीं है। मैंने पहले इस तरीके से प्रश्नों को देखा है। एक ऐसी सुविधा की तरह लगता है जिसे * लागू किया जाना चाहिए क्योंकि यह * अपेक्षित * व्यवहार है। –
हां मैं 'WindowsIdentity.GetCurrent() का उपयोग कर रहा हूं। एक कामकाज के रूप में प्रतिरूपण()' लेकिन मुझे अभी भी समझ में नहीं आता है कि धागे के बीच एक विसंगति क्यों है। यदि 'SecurityContext' पर कब्जा नहीं किया जा रहा है, तो कुछ धागे अभी भी प्रतिरूपित पहचान के रूप में कैसे आते हैं? मुझे लगता है कि इसके लिए और भी कुछ है। – PoweredByOrange