security - DataAnnotations.ValidationAttribute से प्राप्त करने के लिए कैसे(यह दृश्य स्टूडियो डिबगिंग होस्ट के अंतर्गत सुरक्षित क्रिएटिकल NET 4 में प्रकट होता है!)




.net-4.0 code-access-security (2)

मुझे क्यों यह व्यवहार है जब ValidationAttribute से विरासत में मिली है, लेकिन जब System.Attribute से इनहेरिट करना नहीं है? (प्रतिक्षेपक का उपयोग करके मुझे सत्यापन सेटिंग वर्ग या इसकी विधानसभा पर विशेष सेटिंग्स नहीं मिलती हैं)

यह इसलिए है क्योंकि System.ComponentModel.DataAnnotations विधानसभा सशर्त APTCA है, अर्थात् यह निम्नलिखित विशेषता के साथ चिह्नित है।

[assembly: AllowPartiallyTrustedCallers(PartialTrustVisibilityLevel = PartialTrustVisibilityLevel.NotVisibleByDefault)]

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

और मैं इसे हल करने के लिए क्या कर सकता हूँ? मैं एक MySpaceTrustedCallers विधानसभा में मान्यकरण से ValidationAttribute से MyValidationAttribute इनहेरिटिंग कैसे रख सकता हूं, यह बिना अंकन के बिना SecurityCritical, अभी भी नए .NET 4 स्तर 2 सुरक्षा मॉडल का उपयोग कर रहा है और अभी भी इसे VS.NET डीबग होस्ट (या अन्य होस्ट) का उपयोग करते हुए काम करते हैं ??

ऐसा लगता है कि यह वी.एस. मेजबान के साथ एक बग है, जो आपकी स्थिति के लिए दुर्भाग्यपूर्ण है। दूसरी ओर, आपको वास्तव में यह सुनिश्चित करना चाहिए कि आप चाहते हैं कि आपकी विधानसभा APTCA हो। यदि यह आवश्यक है, तो आपके पास कुछ विकल्प हैं

  • आप अपनी विधानसभा को जैसे ही छोड़ सकते हैं यह फायदेमंद है क्योंकि सबसे विशिष्ट आंशिक विश्वास वातावरण में, एएसपी.नेट, डेटाएनेटेशन असेंबली को हमेशा एपीटीसीए माना जाएगा। बेशक, आप वी.एस. होस्टिंग प्रक्रिया में डीबगर का प्रयोग करने की क्षमता खो देते हैं।
  • आप अपने विधानसभा सी- APTCA को भी चिह्नित कर सकते हैं। आप वीएस होस्टिंग प्रक्रिया में डीबगर का उपयोग करने में सक्षम होंगे, लेकिन एएसपी.नेट में आपकी असेंबली के उपभोक्ताओं को अपने असेंबली को <partialTrustVisibleAssemblies> तत्व में वेब। कॉन्फ़िग में जोड़ने की आवश्यकता होगी ताकि यह एपीटीसीए हो।
  • आप अपनी विशेषता सुरक्षा क्रिटिकल बना सकते हैं, इसलिए आप डीबगर का उपयोग करने में सक्षम होंगे और एएसपी.नेट में किसी विशेष कॉन्फ़िगरेशन की आवश्यकता नहीं होगी, लेकिन आपकी विशेषता का उपयोग करने वाली सभी कक्षाओं को भी महत्वपूर्ण होना चाहिए।

मेरे पास [AllowPartiallyTrustedCallers] क्लास लाइब्रेरी है, जिसमें सिस्टम। डेटा एंटीशन। ValidationAttribute के उप-प्रकार हैं। पुस्तकालय WCF सेवाओं के अनुबंध प्रकारों पर उपयोग किया जाता है।

.NET 2 / 3.5 में, यह ठीक काम किया। .NET 4.0 के बाद से, विज़ुअल स्टूडियो डिबगर परिणामों में क्लाइंट के अपवाद में " वंशानुक्रम सुरक्षा नियमों का उल्लंघन किया गया प्रकार: '(मेरा उपप्रकार-मान्यकरणअट्रिब्यूट) में चल रहा है। व्युत्पन्न प्रकार या तो आधार प्रकार की सुरक्षा पहुंच से मेल खाते चाहिए या कम सुलभ हो। "(System.TypeLoadException)

त्रुटि तब घटित होती है जब निम्नलिखित सभी स्थितियां पूरी होती हैं:

  1. मान्यकरण के एक उप-वर्ग की अनुमति एक अनुमति बहु-विश्वसनीय कलेड़ विधानसभा में है
  2. प्रतिबिंब विशेषता के लिए जाँच करने के लिए प्रयोग किया जाता है
  3. दृश्य स्टूडियो होस्टिंग प्रक्रिया सक्षम है (परियोजना गुणों पर चेकबॉक्स, डीबग टैब)

तो मूल रूप से, Visual Studio.NET 2010 में:

  • एक नया कंसोल प्रोजेक्ट बनाएं,
  • "System.ComponentModel.DataAnnotations" 4.0.0.0 के लिए एक संदर्भ जोड़ें,
  • निम्न कोड लिखें:

using System;

[assembly: System.Security.AllowPartiallyTrustedCallers()]

namespace TestingVaidationAttributeSecurity
{
    public class MyValidationAttribute : System.ComponentModel.DataAnnotations.ValidationAttribute
    { }

    [MyValidation]
    public class FooBar
    { }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("ValidationAttribute IsCritical: {0}",
                typeof(System.ComponentModel.DataAnnotations.ValidationAttribute).IsSecurityCritical);

            FooBar fb = new FooBar();
            fb.GetType().GetCustomAttributes(true);

            Console.WriteLine("Press enter to end.");
            Console.ReadLine();
        }
    }
}
  • प्रेस F5 और आप अपवाद मिलता है!

Ctrl-F5 दबाएं (डिबगिंग के बिना शुरू करें), और यह सब बिना अपवाद के ठीक काम करता है ...

अजीब बात यह है कि सत्यापन के लिए जिस तरह से आप प्रोग्राम (एफ 5 या Ctrl + F5) चलाते हैं, उसके आधार पर मान्यकरण विशेषता होगी या सुरक्षित नहीं होगी। जैसे कंसोल द्वारा सचित्र। ऊपर लिखे गए कोड में। लेकिन फिर, यह अन्य विशेषताओं (और प्रकारों) के साथ भी हो सकता है?

अब सवाल ...

मुझे क्यों यह व्यवहार है जब ValidationAttribute से विरासत में मिली है, लेकिन जब System.Attribute से इनहेरिट करना नहीं है? (प्रतिक्षेपक का उपयोग करके मुझे सत्यापन सेटिंग वर्ग या इसकी विधानसभा पर विशेष सेटिंग्स नहीं मिलती हैं)

और मैं इसे हल करने के लिए क्या कर सकता हूँ? मैं एक MySpaceTrustedCallers विधानसभा में मान्यकरण से ValidationAttribute से MyValidationAttribute इनहेरिटिंग कैसे रख सकता हूं, यह बिना अंकन के बिना SecurityCritical, अभी भी नए .NET 4 स्तर 2 सुरक्षा मॉडल का उपयोग कर रहा है और अभी भी इसे VS.NET डीबग होस्ट (या अन्य होस्ट) का उपयोग करते हुए काम करते हैं ??

आपका बहुत बहुत धन्यवाद! रूडी


किसी कारण के लिए साइट ने उस पाठ से एक पूरी तरह से भिन्न प्रश्न पोस्ट किया था, जब मैं लिख रहा था - अजीब