2010-08-30 13 views
6

निम्नलिखित कोड उद्यम लाइब्रेरी की लॉगिंग आवेदन ब्लॉक में LogEntry.cs में मौजूद है:UnmanagedCode अनुमति। यह क्या है?

private bool UnmanagedCodePermissionAvailable 
{ 
    get 
    { 
    if (!unmanagedCodePermissionAvailableInitialized) 
    { 
     // check whether the unmanaged code permission is available to avoid three potential stack walks 
     bool internalUnmanagedCodePermissionAvailable = false; 
     SecurityPermission unmanagedCodePermission = 
        new SecurityPermission(SecurityPermissionFlag.UnmanagedCode); 
     // avoid a stack walk by checking for the permission on the current assembly. this is safe because there are no 
     // stack walk modifiers before the call. 
     if (SecurityManager.IsGranted(unmanagedCodePermission)) 
     { 
     try 
     { 
      unmanagedCodePermission.Demand(); 
      internalUnmanagedCodePermissionAvailable = true; 
     } 
     catch (SecurityException) 
     { } 
     } 

     this.UnmanagedCodePermissionAvailable = 
      internalUnmanagedCodePermissionAvailable; 
    } 

    return this.unmanagedCodePermissionAvailable; 
    } 
    set 
    { 
    this.unmanagedCodePermissionAvailable = value; 
    unmanagedCodePermissionAvailableInitialized = true; 
    } 
} 

समारोह कई पी में से किसी से पहले कहा जाता है/आह्वान कॉल मदद करने के लिए LogEntry संरचना में भरने के विभिन्न जानकारी प्राप्त कर सके बना रहे हैं । यदि "UnmanagedCodePermission" उपलब्ध नहीं है, तो संबंधित LogEntry प्रॉपर्टी ऐसी स्ट्रिंग पर सेट की गई है जो इंगित करती है ("XXX उपलब्ध नहीं है")।

उदाहरण के लिए, लॉगइन्ट्री Win32 थ्रेड आईडी प्राप्त करना चाहता है और यह Win32 फ़ंक्शन, GetCurrentThreadId का उपयोग करता है, जिसे इसे प्राप्त करने के लिए पी/Invoke द्वारा बुलाया जाता है। GetCurrentThreadId को कॉल करने से पहले, यह देखने के लिए जांच करता है कि "असम्बद्ध कोड अनुमति" उपलब्ध है या नहीं। यदि ऐसा है, तो यह कॉल करता है, अगर नहीं, तो यह नहीं करता है। कुछ इस तरह:

private void InitializeWin32ThreadId() 
{ 
    if (this.UnmanagedCodePermissionAvailable) 
    { 
    try 
    { 
     this.Win32ThreadId = LogEntryContext.GetCurrentThreadId(); 
    } 
    catch (Exception e) 
    { 
     this.Win32ThreadId = string.Format(
            CultureInfo.CurrentCulture, 
            Properties.Resources.IntrinsicPropertyError, 
            e.Message); 
    } 
    } 
    else 
    { 
    this.Win32ThreadId = string.Format(CultureInfo.CurrentCulture, 
       Properties.Resources.IntrinsicPropertyError, 
       Properties.Resources. 
       LogEntryIntrinsicPropertyNoUnmanagedCodePermissionError); 
    } 
} 

मैं क्या समझ है, जो, बेशक, बहुत ज्यादा नहीं, अप्रबंधित कोड को कॉल कर रहा है (जैसे पी/आह्वान) है से हमेशा सुरक्षा/अनुमतियाँ/विश्वास की वजह से ही संभव है। यह जांचने के लिए कि अप्रबंधित कोड कॉल संभव है या नहीं, सभी अप्रबंधित कॉलों को एक समान तरीके से सुरक्षित करना संभव बनाता है।

मुझे इस कोड संकलन, मैं इस लाइन पर एक चेतावनी मिलती है:

System.Security.SecurityManager.IsGranted (System.Security.IPermission) ':

  if (SecurityManager.IsGranted(unmanagedCodePermission)) 

यहाँ चेतावनी है अप्रचलित है: 'IsGranted अप्रचलित है और .NET Framework की भावी रिलीज में हटा दिया जाएगा। कृपया ऐपडोमेन या असेंबली की अनुमति अनुमति संपत्ति का उपयोग करें।

(ध्यान दें कि मैं इसे वीएस -2010 का उपयोग कर नेट 4.0 पर बना रहा हूं)।

तो, ऐसा लगता है कि IsGranted अप्रचलित है। मैंने AppDomain और असेंबली के लिए PermissionSet प्रॉपर्टी को देखा, और यह बिल्कुल स्पष्ट नहीं था कि एक ही चेक कैसे करें।

लॉगइन्ट्री के मामले में, ऐसा लगता है कि यह जानकारी महत्वपूर्ण नहीं है, इसलिए अगर अप्रबंधित अनुमति उपलब्ध नहीं है तो इसे महत्वपूर्ण विफलता नहीं माना जाता है। एक ही बिंदु से निम्नलिखित प्रश्नों पर विचार करें। यही है, अगर अप्रबंधित कोड अनुमति उपलब्ध नहीं है, तो यह एक बड़ा सौदा नहीं है, मैं जानकारी के बिना रह सकता हूं।

अंत में, सवालों की एक जोड़ी:

  1. यह एक अच्छा विचार अप्रबंधित कोड (जैसे पी/आह्वान) के लिए कॉल की रक्षा के लिए प्रयास करने के लिए है? कभी-कभी, हमेशा, कभी नहीं?

  2. यदि इन कॉलों की रक्षा करना एक अच्छा विचार है, तो क्या ऐसा करने के लिए यह एक उचित पैटर्न है? क्या कोई बेहतर तरीका है?

  3. नेट 4.0 में समकक्ष चेक करने के लिए सही (यानी अप्रचलित नहीं) तरीका क्या होगा?

उत्तर

8

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

आईएमओ, यदि आप कोड लिख रहे हैं जो आंशिक रूप से भरोसेमंद वातावरण में चलाने की संभावना नहीं है तो आप इसके बारे में ज्यादा चिंता नहीं कर सकते हैं। हालांकि आंशिक रूप से भरोसा विधानसभाओं के लिए,

  1. वे अपने मेजबान (उदाहरण के IE के लिए) बता सकते हैं, तो कौन-सी अनुमति यह तो कर सकते हैं की मेजबानी की जरूरत है कि क्या सुरक्षा नीति आदि या मेजबान के आधार पर उन अनुदान करने के लिए संकेत है और उसे अनुमति दे सकता है फैसला करता है उल्लंघन करने के लिए। या व्यवस्थापक असेंबली का निरीक्षण करके अनुमति सेट को जान लेगा और वह इसे अनुमति देने के लिए नीति अपडेट करने का निर्णय ले सकता है।
  2. यदि होस्ट कोड को आवश्यक अनुमति नहीं देता है तो कोड इसे जांच सकता है और इसे सुरक्षा अपवाद में उत्पन्न करने के बजाय इसे सुंदर तरीके से संभाल सकता है।

तो उपर्युक्त कोड .NET 4 से पहले इसे प्राप्त करने के तरीकों को दिखाता है। .NET 4 में, नया सुरक्षा मॉडल है जो उपयोग करने के लिए अधिक आसान है। अधिक जानकारी के लिए this & this आलेख देखें।