2009-02-17 15 views
12

मैंने एक .net 3.0 एप्लिकेशन विकसित किया है, जिसे क्लिकऑन का उपयोग करके तैनात किया गया है।मेरे .NET एप्लिकेशन को पूर्ण विश्वास की आवश्यकता क्यों है?

मैं तैनाती को आसान बनाने के लिए पूर्ण विश्वास से आंशिक विश्वास से आगे बढ़ना चाहता हूं।

मैं दृश्य स्टूडियो के तहत अपने प्रोजेक्ट की "सुरक्षा" टैब में "गणना अनुमतियां" उपकरण की कोशिश की है, और जवाब काफी स्पष्ट है:

--------------------------- 
Microsoft Visual Studio 
--------------------------- 
This application requires full trust to run correctly. 

हालांकि, मैं करने में सक्षम नहीं किया गया है पता लगाएं कि पूर्ण विश्वास की आवश्यकता क्यों है। मैं "आंशिक विश्वास" के लिए सुरक्षा सेटिंग्स को बदलने की कोशिश की है, लेकिन आवेदन लांच के बाद तुरंत एक SecurityException को जन्म देती है:

System.Security.SecurityException {"Request failed.", Action= "System.Security.Permissions.SecurityAction.LinkDemand" 
    at MyNameSpace.Program.Main(String[] args) 
    at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
    at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args) 
    at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel) 
    at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() 
    at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData) 
    at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext) 
    at System.Activator.CreateInstance(ActivationContext activationContext) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.runTryCode(Object userData) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

मेरे सॉफ्टवेयर शायद पूर्ण विश्वास की जरूरत नहीं है (मैं केवल एक वेब सर्वर का उपयोग कर https करने के लिए कनेक्ट , और आयात/निर्यात उद्देश्यों के लिए केवल उपयोगकर्ता अनुरोध पर फ़ाइल सिस्टम का उपयोग करें)

मुझे कैसे पता चलेगा कि मेरे एप्लिकेशन को पूर्ण विश्वास की आवश्यकता क्यों है?

+0

आप अपनी मुख्य विधि में क्या कॉल कर रहे हैं? आप जो कुछ बुला रहे हैं वह समस्या पैदा कर रहा है। – leppie

+0

कुछ भी नहीं। यह एक Winform ऐप, आईई अनुप्रयोग के लिए डिफ़ॉल्ट .NET मुख्य कन्स्ट्रक्टर है। सक्षम VisualStyles(); Application.SetCompatibleTextRenderingDefault (गलत); आवेदन। रुन (नया माईफॉर्म()); और कुछ नहीं। मुझे लगता है कि समस्या पहले होती है, यानी जब clr मेरी असेंबली लोड करता है – Brann

उत्तर

2

requirePermission जोड़ना = app.config के configSections में 'गलत' विशेषता एक बहुत मदद करता है:

<sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <section requirePermission="false" name="defaultProxy" type="System.Net.Configuration.DefaultProxySection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 
    </sectionGroup> 

यह मेरे लिए चाल बनाया!

0

एचआरएम, बस एक अनुमान है, लेकिन क्या यह नेटवर्क शेयर से बाहर हो रहा है? .NET कोड को चलाने वाले स्थान के आधार पर विश्वास असाइन करना प्रतीत होता है। यदि यह कहीं से भी है लेकिन आपकी स्थानीय हार्ड ड्राइव है तो आपके पास सुरक्षा समस्याएं हैं।

+0

मुझे लगता है कि आप मेरे प्रश्न को गलत तरीके से देख रहे हैं। नेटशेयर के बजाय स्थानीय रूप से फ़ाइल को चलाने से ज़ोन बदल जाएगा, इस प्रकार डिफ़ॉल्ट अनुमतियां बढ़ाई जाएंगी। मैं नहीं चाहता कि मेरे कार्यक्रम को चलाने के लिए किसी प्रकार की उन्नति की आवश्यकता हो! – Brann

+0

आह यह प्रतीत होता है कि मैंने गलत समझा, माफ करना ब्रैन –

0

अपने आवेदन के लिए कोड देखे बिना, यह बताना असंभव है। कुछ है जो आपके ऐप में पूर्ण विश्वास की आवश्यकता है जिसे आपने अनदेखा किया हो (शायद एक निर्भरता?)।

+0

क्या सीएलआर तर्क की नकल करने का कोई तरीका नहीं है (जो यह निर्धारित करने में सक्षम है कि मुझे तुरंत लंच पर पूर्ण विश्वास की आवश्यकता है)? और क्या सीएलआर को कार्यक्रम को लॉन्च करने के लिए सीएलआर को बताना संभव नहीं है, और अपवादों को बढ़ाने के लिए जब मेरे कोड को कुछ एलिवेटियो की आवश्यकता होती है, यदि यह कभी करता है? – Brann

1

अपवाद संदेश आपको बता रहा है यही कारण है कि आप आंशिक विश्वास के साथ नहीं चल सकता: आप कॉपी करते हैं

System.Security.Permissions.SecurityAction.LinkDemand 

और पेस्ट है कि गूगल में, आप आप को खोजने के लिए मदद कर सकता है कि MSDN पर कई प्रासंगिक लेख मिलेगा आपके आवेदन को पूर्ण विश्वास की आवश्यकता क्यों है।

10

ऐसा लगता है कि मेरी समस्या इस तथ्य के कारण हुई है कि मेरी असेंबली पर दृढ़ता से हस्ताक्षर किए गए हैं।

msdn

से उद्धरित मजबूत नाम विधानसभाओं में, एक LinkDemand सभी सार्वजनिक रूप से सुलभ तरीकों, गुण पर लागू होता है, और घटनाओं उसमें उनकी पूरी तरह से भरोसा कॉल करने के लिए उपयोग को प्रतिबंधित करने के लिए। इस सुविधा को अक्षम करने के लिए, आपको AllowPartiallyTrustedCallersAttributeattribute को लागू करना होगा।

मैं अपने विधानसभा के लिए आवश्यक विशेषता जोड़ रहा है, और मैं तुम्हें पता है कि कैसे चीजों को बाहर कर देते हैं दूँगा:

[assembly:AllowPartiallyTrustedCallers] 

अद्यतन: मैं अपने विधानसभाओं के लिए विशेषता जोड़ दिया है, लेकिन मैं मैं कुछ .NET असेंबली का भी उपयोग कर रहा हूं।

सभी .NET असेंबली का आंशिक रूप से भरोसेमंद असेंबली (here's a list), अर्थात डब्ल्यूसीएफ असेंबली (यानी सिस्टम) द्वारा उपयोग किया जा सकता है।ServiceModel), सूची में नहीं है

हालांकि माइक्रोसॉफ्ट (see here)

मैं कोशिश की है मेरी संदर्भों से सभी अनावश्यक विधानसभाओं दूर करने के लिए, मैंने कहा गया है कि यह एक आंशिक विश्वास के माहौल में WCF उपयोग करना संभव है मेरे सभी विधानसभाओं में AllowPartiallyTrustedCallers इस्तेमाल किया, और मैं अभी भी stucked हूँ ...

+0

ब्रैन, आपको बार-बार जवाब जोड़ने के बजाय टिप्पणी का उपयोग करना और सुविधाओं को संपादित करना चाहिए। मैं आपके तीन उत्तरों को इस एकल उत्तर में विलय करने की सलाह देता हूं, और उस अद्यतन की सामग्री से पहले प्रत्येक संपादन/अद्यतन के समय नोट करता हूं। – jrista

+0

@jrista: उन तीन उत्तरों अलग हैं (और विभिन्न दिशाओं पर इंगित करें), इसलिए मैं वास्तव में नहीं देखता कि यह तथ्य कि मेरे द्वारा पोस्ट किए गए सभी तथ्य कैसे प्रासंगिक हैं ... – Brann

4

माइक्रोसॉफ्ट एक उपकरण permcalc जो एक विधानसभा का विश्लेषण कहा जाता है और एक विस्तृत एक्सएमएल आउटपुट फ़ाइल जो इस तरह दिखता है पैदा करता है:

<Type Name="MyClass"> 
<Method Sig="instance void .ctor()"> 
<Demand> 
<PermissionSet version="1" class="System.Security.PermissionSet"> 
    <IPermission version="1" class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Unrestricted="true" /> 
    <IPermission version="1" class="System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Unrestricted="true" /> 
... 
+0

परमैकसी .NET 4 – Valentin

0

आपका स्टैक-ट्रेस मांग की अनुमति के प्रकार को नहीं दिखाता है।

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

अन्यथा permcalc का उपयोग करें। यह आपको अनुमतियों को दिखाएगा जिन्हें परियोजना की सुरक्षा सेटिंग्स में सक्षम किया जाना चाहिए। हालांकि मुझे यकीन नहीं है कि उन सभी परमिटों को शामिल करने के बाद भी आपको कुछ आंशिक अनुमतियों के साथ "आंशिक विश्वास" या पूर्ण विश्वास होगा। यह इस तथ्य के कारण है कि आंशिक ट्रस्ट बहुत ही सीमित है (खुली सुरक्षा.कॉन्फिग और सक्षम अनुमतियों को देखें!), जहां तक ​​मुझे पता है कि वेबप्रमिशन वहां नहीं है (जिसे http अनुरोध भेजने की आवश्यकता है), फ़ाइलइओप्रमिशन के साथ ही।

+0

के साथ संगत नहीं है GuarantPartlyTrustedCallers, मैंने यही किया है, लेकिन मुझे लगता है कि msdn दस्तावेज़ अद्यतित नहीं है (मैंने इस थ्रेड में msdn doc और msdn नमूना के बीच एक विरोधाभास पोस्ट किया है ..) – Brann

+0

आंशिक विश्वास इतना प्रतिबंधित नहीं है कि आप कहते हैं । आंशिक ट्रस्ट का उपयोग करते समय, ऊंचाई स्तर आपके क्षेत्र पर निर्भर करता है, या अनुकूलित किया जा सकता है, इसलिए यदि आपको इसकी आवश्यकता हो तो फ़ाइल IOPermission हो सकती है (हालांकि अधिकांश मामलों में FileDialogPermission संभवतः पर्याप्त है)। – Brann

+0

निश्चित रूप से आप अनुमतियां कस्टमाइज़ कर सकते हैं, लेकिन डिफ़ॉल्ट आंशिक ट्रस्ट उनमें से 6-7 (स्थानीय इंट्रानेट कुछ और) की तरह है। एपीटीसी के लिए – liggett78

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