2010-06-29 13 views
6

रहा है मैं प्रोग्राम के NetworkService अनुमति देने के लिए एक प्रयास में निम्नलिखित कोड का उपयोग कर रहा खाता त्रुटि, लेकिन कुंजी कंटेनर की अनुमतियों पर कोई प्रभाव नहीं पड़ता है।प्रयास एक प्रमुख का उपयोग करने की कोई प्रभाव नहीं

हालांकि, कमांडलाइन उपकरण का उपयोग कर एक ही बात करने के लिए aspnet_regiis, पूरी तरह से काम करता है:

aspnet_regiis -pa "MyEncryptionKey" "NetworkService" 

मैं पूर्ण व्यवस्थापक अधिकार के साथ चल रहा हूँ - अगर मैं उन अधिकारों के साथ चलाने के नहीं है, तो एक अपवाद है फेंक दिया। मैं उस उपयोगकर्ता के रूप में भी चल रहा हूं जिसने शुरुआत में कुंजी बनाई थी। सिड, एस-1-5-20 इस सूची में जोड़ा जाता है

S-1-5-18   -> LocalSystem 
S-1-5-32-544  -> Administrators 
S-1-5-5-0-135377 -> MyUser 
aspnet_regiis साथ

,:

कुंजी कंटेनर हमेशा निम्न पहुँच नियम हैं। मैं कोड से इसे प्रभावित नहीं कर सकता।

मैंने स्ट्रिंग प्रारूप में एसआईडी से सुरक्षा पहचानकर्ता बनाने के साथ-साथ AddAccessRule के बजाय SetAccessRule का उपयोग करने का प्रयास किया है।

कोई विचार कैसे कोड से इस एसीएल सूची को वास्तव में प्रभावित करने के लिए?

उत्तर

10

आप पर्सिस्ट को कॉल करने के लिए प्रतीत नहीं होते हैं। CryptoKeySecurity में आपके द्वारा किए गए परिवर्तन वास्तव में तुरंत सहेजे नहीं जाते हैं। वास्तव में परिवर्तनों को सहेजने के लिए आपको Persist(...) विधियों में से एक का उपयोग करने की आवश्यकता है।

NativeObjectSecurity.Persist Method (String, AccessControlSections)

ऐसा लगता है इन एपीआई एक नहीं बल्कि जटिल दृष्टिकोण संशोधन के पालन करें। आपको पहले एक सीएसपी पैरामीटर बनाने की आवश्यकता है, आवश्यक परिवर्तन लागू करें, फिर उन पैरामीटर से प्रदाता का निर्माण करें। निर्माण कंटेनर पर एक अद्यतन आमंत्रित करता है।

var params = new CspParameters 
{ 
    KeyContainerName = "MyEncryptionKey", 
    Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore  
}; 

params.CryptoKeySecurity.AddAccessRule(
    new System.Security.AccessControl.CryptoKeyAccessRule(
    new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null), 
    CryptoKeyRights.GenericAll, 
    AccessControlType.Allow 
) 
); 

var RSA = new RSACryptoServiceProvider(params); 
+0

दुख की बात है कि सभी दृढ़ विधियों की रक्षा की जाती है। –

+0

ऐसा लगता है कि आपको CspParameters का उपयोग कर प्रदाता बनाने से पहले सुरक्षा को संशोधित करने की आवश्यकता है। सीएसपी पैरामीटर, जब RSACryptoServiceProvider को पास किया जाता है, तो लगातार बने रहें। एक एपीआई बनाने के लिए बहुत ही अजीब तरीका है, लेकिन दस्तावेज़ीकरण के अनुसार, ऐसा लगता है कि यह कैसे काम करता है। प्रतिबिंबित करने के लिए अद्यतन उत्तर। – jrista

+4

मुझे सही रास्ते पर मिला। ऊपर इस्तेमाल किए गए CryptoKey सुरक्षा संपत्ति शून्य है, तो फेंकता है। आप एक नया बना सकते हैं, लेकिन यह पहले से मौजूद किसी भी अनुमति को मिटा देता है (यह पहला वास्तविक प्रभाव था, इसलिए अब मैं अपने मुख्य कीस्टोर से बंद हूं;)। लेकिन ... यदि आपको कीस्टोर से कुंजी मिलती है, तो RSA.CspKeyContainerInfo (प्रदाता नाम और प्रकार, कंटेनर नाम और CryptoKeySecurity सहित) से मूल्यों की प्रतिलिपि बनाकर एक नया CspParamters बनाएं, फिर आप इसे संशोधित कर सकते हैं, एक और आरएसए बना सकते हैं cspparameters, और voila का उपयोग कर मुख्य वस्तु, सब कुछ किया। सिमल्स ...? –

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