2012-07-18 12 views
7

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

मेरे पास "डिफ़ॉल्ट" नीति बनाने के लिए निम्न कोड है।

CloudStorageAccount account = new CloudStorageAccount(credentials, true); 

CloudBlobClient client = new CloudBlobClient(account.BlobEndpoint, credentials); 

CloudBlobContainer container = client.GetContainerReference("files"); 

SharedAccessPolicy sharedAccessPolicy = new SharedAccessPolicy(); 
sharedAccessPolicy.Permissions = SharedAccessPermissions.Read; 
sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow; 
sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1); 

BlobContainerPermissions blobContainerPermissions = new BlobContainerPermissions(); 
blobContainerPermissions.SharedAccessPolicies.Add("default", sharedAccessPolicy); 

container.SetPermissions(blobContainerPermissions); 

मैं उसके बाद निम्न के साथ एक SharedAccessSignature URL बनाएं::

CloudStorageAccount account = new CloudStorageAccount(credentials, true); 

CloudBlobClient client = new CloudBlobClient(account.BlobEndpoint, credentials); 

CloudBlobContainer container = client.GetContainerReference("files"); 

CloudBlob blob = container.GetBlobReference(path); 

string sas = blob.GetSharedAccessSignature(new SharedAccessPolicy(), "default"); 

Console.WriteLine(blob.Uri.AbsoluteUri + sas); 

यह इस कोड में नोट, मैं समाप्ति सेट कर रहा हूं अब से 1 मिनट हो सकता है, यह परीक्षण करने के लिए आसान बनाने के लिए एक यूआरएल उत्पन्न करता है, और यूआरएल अगले मिनट (या वास्तविक कोड में 7 दिन) के लिए ठीक से काम करता है। एक मिनट खत्म हो जाने के बाद, यूआरएल अमान्य है और अपेक्षित के रूप में काम नहीं करता है।

लेकिन एक बार जब समाप्ति समाप्त हो जाती है, तो मैं एक नया यूआरएल उत्पन्न करने के लिए कोड फिर से चलाता हूं। दुर्भाग्य से, यह वही यूआरएल उत्पन्न करता है, जो अभी भी अमान्य है।

कंटेनर नीतियों के लिए प्रारंभ/समाप्ति बार पूर्ण कर रहे हैं, जिसका अर्थ है जब मुझे लगता है कि नीति सेट अभी उस नीति को उपयोग करते हुए

sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow; 
sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1); 

कुछ भी 10:11 बजे तक केवल 10:10 बजे (EDT) से मान्य है (ईडीटी) आज?

+0

तो कंटेनर नीतियों के लिए प्रारंभ/समाप्ति बार पूर्ण कर रहे हैं। मैंने भी सोचा कि वे रिश्तेदार थे। – nmit026

उत्तर

9

एक चीज जो आप कर सकते हैं वह समाप्ति तिथि के बिना आपकी पहुंच नीति बना रही है। जब आप हस्ताक्षरित यूआरएल बना रहे हों तो आप समाप्ति तिथि निर्दिष्ट करें।

तो अपने कोड कुछ ऐसा दिखाई देगा:

 SharedAccessPolicy sharedAccessPolicy = new SharedAccessPolicy(); 
     sharedAccessPolicy.Permissions = SharedAccessPermissions.Read; 
     sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow; 
     //sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1); No need to define expiry time here. 

     BlobContainerPermissions blobContainerPermissions = new BlobContainerPermissions(); 
     blobContainerPermissions.SharedAccessPolicies.Add("default", sharedAccessPolicy); 

     container.SetPermissions(blobContainerPermissions); 

     Console.WriteLine("Press any key to continue...."); 
     Console.ReadLine(); 
     CloudBlob blob = container.GetBlobReference(path); 

     string sas = blob.GetSharedAccessSignature(new SharedAccessPolicy() 
     { 
      SharedAccessExpiryTime = DateTime.UtcNow.AddDays(7),//add expiry date only when you're creating the signed URL 
     } 
      , "default"); 

     Console.WriteLine(blob.Uri.AbsoluteUri + sas); 

     Process.Start(new ProcessStartInfo(blob.Uri.AbsoluteUri + sas)); 

     Console.WriteLine("Press any key to continue...."); 
     Console.ReadLine(); 

विल आप के लिए यह काम करता है? जाहिर है आपको 7 दिनों के बाद यूआरएल को पुन: उत्पन्न करना होगा, लेकिन आपको अपनी एक्सेस पॉलिसी में कोई बदलाव नहीं करना है।

उम्मीद है कि इससे मदद मिलती है।

+1

उत्तर के लिए धन्यवाद। दुर्भाग्यवश यदि आप कंटेनर एक्सेस नीतियों का उपयोग कर रहे हैं, तो आप साझा एक्सेस हस्ताक्षर बनाते समय कोई अतिरिक्त पैरामीटर निर्दिष्ट नहीं कर सकते हैं। त्रुटि यह है कि "एक्सेस पॉलिसी फ़ील्ड हस्ताक्षर या एसएएस पहचानकर्ता से जुड़ी हो सकती है लेकिन दोनों नहीं"। – mfanto

+0

मैं सहमत हूं। यही कारण है कि मैंने एक्सेस पॉलिसी से SharedAccessExpiryTime को बाहर रखा (मैंने कोड की उस पंक्ति पर टिप्पणी की) और इसे हस्ताक्षरित यूआरएल में शामिल किया। –

+0

माफी माँगता हूं, मैंने टिप्पणी को याद किया। यह काम करता है, और मुझे कोड के एक बड़े हिस्से को फिर से लिखने से बचाता है। धन्यवाद, बहुत अच्छा किया। – mfanto

0

1 मिनट की समाप्ति के साथ आप एसएएस पीढ़ी के बॉक्स और विंडोज़ एज़ूर स्टोरेज के बीच घड़ी के प्रभाव को मार सकते हैं। आपको एक लंबे अंतराल का उपयोग करना चाहिए। मैंने post साझा एक्सेस हस्ताक्षर की गहरी गहराई में जाकर किया, ताकि आपको मदद मिल सके।

+0

पोस्ट के लिए धन्यवाद। दुर्भाग्यवश यह समय अंतराल पर ध्यान दिए बिना होता है। मैंने मूल रूप से इसकी खोज की क्योंकि मेरे पास समय 7 दिनों तक सेट था, और प्रतिबद्ध लॉग को देखकर, मैंने 7 दिन पहले एक्सेस पॉलिसी सेट की थी। मुझे लगता है कि समस्या यह है कि कंटेनर नीति के समय का मतलब है कि पॉलिसी बनाई गई थी, समय यूआरएल उत्पन्न नहीं हुआ था।जो समझ में आता है, चूंकि GetSharedAccessSignature() कोई नेटवर्क कॉल नहीं करता है, यह नीतियों के लिए अद्वितीय हस्ताक्षर उत्पन्न नहीं कर सकता – mfanto

0

आप अधिकतम कंटेनर स्तर पहुंच नीतियों पर अधिकतम मार सकते हैं।

एक संग्रहीत एक्सेस नीति में 64 अक्षरों तक का नाम शामिल है जो कंटेनर के भीतर अद्वितीय है। यह नाम साझा एक्सेस हस्ताक्षर पर हस्ताक्षरित फ़ील्ड में दिखाई देता है जो संग्रहीत एक्सेस नीति से लिंक होता है। एक कंटेनर में 5 संग्रहीत एक्सेस नीतियां शामिल हो सकती हैं। प्रत्येक पॉलिसी का उपयोग किसी भी साझा एक्सेस हस्ताक्षर द्वारा किया जा सकता है।

Using a Stored Access Policy

+0

मेरे पास केवल एक कंटेनर स्तर पहुंच नीति है। मुझे लगता है कि उत्तर मेरे पास एक गलतफहमी है, और यही है, जब नीति बनाई जाती है, तो यूआरएल उत्पन्न होने पर कंटेनर पॉलिसी का समय निर्धारित होता है। – mfanto

+0

मैं आपको सुनता हूं। एक पहुंच लेकिन उन दो लाइनों में एक नई नीति पैदा हो सकती है। गणना के लिए संग्रह की जांच करें। फिर एक पहुंच। – Paparazzi

+0

@ ब्लाम यह अनिवार्य रूप से आपके ब्लॉब कंटेनर पर मौजूद किसी भी मौजूदा नीतियों को ओवरराइट करेगा। अपनी मौजूदा पहुंच नीतियों को संरक्षित करने के लिए, आपको उन्हें अपने "SharedAccessPolicies" संग्रह में पास करना होगा। –

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