2014-07-15 6 views
5

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

मौजूदा प्रणाली सेट निम्नलिखित तरीके से अनुमतियाँ (सी #, MVC):

// Retrieve a reference to my image container 
myContainer = blobClient.GetContainerReference("myimagescontainer"); 

// Create the container if it doesn't already exist 
if (myContainer.CreateIfNotExists()) 
{ 
    // Configure container for public access 
    var permissions = myContainer.GetPermissions(); 
    permissions.PublicAccess = BlobContainerPublicAccessType.Container; 
    myContainer.SetPermissions(permissions); 
} 

नतीजतन, सभी धब्बे आप पूर्ण URL है जब तक पूरी तरह से पहुंच रहे हैं, लेकिन यह प्रतीत नहीं होता है सीधे यूआरएल के माध्यम से कंटेनर में धब्बे सूची संभव हो सकता है:

// This URL allows you to view one single image directly: 
'https://mystorageaccount.blob.core.windows.net/mycontainer/mycontainer/image_ea644f08-3263-4a7f-9be7-bc42efbf8939.jpg' 

// These URLs appear to return to nothing but an error page: 
'https://mystorageaccount.blob.core.windows.net/mycontainer/mycontainer/' 
'https://mystorageaccount.blob.core.windows.net/mycontainer/' 
'https://mystorageaccount.blob.core.windows.net/' 

मैं इसे एक मुद्दा है कि उपयोगकर्ताओं को पूरा URL साझा कर, एक ही छवि के लिए सार्वजनिक उपयोग की अनुमति देता है प्रमाणीकृत नहीं मिल रहा है; हालांकि, प्रमाणित उपयोगकर्ताओं को कोई भी अन्य छवियों को पुनर्प्राप्त करने के लिए सीधे कंटेनरों को सूचीबद्ध, ब्राउज़ या एक्सेस करने में सक्षम होना चाहिए।

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

समाधान मैं समाप्त हो गया का उपयोग :)

उत्तर

2

नीचे दी गई है यदि आप किसी सार्वजनिक कंटेनर का उपयोग कर रहे हैं तो क्या तुम सच में प्रमाणीकृत उपयोगकर्ताओं तक पहुंच को सीमित नहीं कर रहे हैं।

कल्पना ने कहा, "केवल प्रमाणीकृत उपयोगकर्ताओं पहुंच होनी चाहिए" तो मैं व्यक्तिगत रूप से एक सार्वजनिक कंटेनर का उपयोग कर स्वीकार्य नहीं कर पाते हैं तो। एसएएस बहुत कठिन नहीं है - पुस्तकालय अधिकांश काम करते हैं।

Btw: list the items in a container लिए प्रारूप है: https://myaccount.blob.core.windows.net/mycontainer?restype=container&comp=list

+0

अब देखकर कितना आसान है एक सार्वजनिक कंटेनर की सामग्री सूची है, मैं बिल्कुल आपसे सहमत हूँ। धन्यवाद! –

2

आप केवल अपने प्रमाणन चाहते हैं। उपयोगकर्ताओं को एक्सेस करने के लिए आपको कंटेनर निजी बनाना होगा। अन्यथा यह सार्वजनिक होगा और यह केवल समय की बात है कि कोई और "लगभग निजी" सामग्री प्राप्त करता है और आप एक डेवलपर के रूप में शर्मिंदा हो जाते हैं।

दृष्टिकोण 1: आप अपने अधिकृत उपयोगकर्ता के लिए एक लिंक भेज। इस मामले में आप उपयोगकर्ता को एसएएस लिंक देते हैं और वह अपनी सामग्री को सीधे ब्लॉब से डाउनलोड करता है। आप कम पहुंच खिड़की के साथ एसएएस हस्ताक्षर उत्पन्न करने के लिए इतना है कि अपने उपयोगकर्ताओं को अपनी सामग्री प्राप्त और डाउनलोड कर सकते हैं/इसे खोलने के लिए और उसके बाद वे साइट से चले गए हैं लिंक समाप्त हो जाएगा और सामग्री अब उपलब्ध नहीं हो जाएगा। यह इस मामले में है कि वे गलती से तार पर लिंक भेजते हैं और किसी और को बाद में निजी सामग्री मिल जाती है।

दृष्टिकोण 2: आपका वेब सर्वर सामग्री प्राप्त करता है और इसे आपके ग्राहकों को प्रदान करता है इस मामले में केवल आपके वेब ऐप में पहुंच होगी और कोई एसएएस हस्ताक्षर उत्पन्न नहीं होना चाहिए। आप FileContentResult (एमवीसी के मामले में) वापस करते हैं और आप तैयार हैं। नकारात्मकता यह है कि आपके वेब सर्वर को क्लाइंट को देने से पहले फ़ाइल को डाउनलोड करना होगा - डबल यातायात। वह समाप्त नहीं किया जाएगा - यहाँ आप Blob-> वेब डाउनलोड ध्यान से 3 उपयोगकर्ताओं एक साथ में 200 एमबी फ़ाइल डाउनलोड करने के लिए कोशिश करते हैं और आप अपने रैम में भंडारण कर रहे हैं क्योंकि संभाल करने की है।

+0

मुझे विश्वास है कि आप सही हो सकते हैं: मैं बस अपने कंटेनरों को निजी होना पसंद करूंगा। एक कंटेनर निजी कैसे बनाते हैं? बस सार्वजनिक एक्सेस को बंद करना? आपके उत्तर के लिए धन्यवाद। –

+1

Azure में ब्लॉब कंटेनर डिफ़ॉल्ट रूप से निजी हैं। _By डिफ़ॉल्ट, एक कंटेनर और इसके भीतर किसी भी ब्लॉब्स को केवल स्टोरेज खाते के मालिक द्वारा एक्सेस किया जा सकता है। यदि आप अज्ञात उपयोगकर्ताओं को किसी कंटेनर और उसके ब्लॉब्स को अनुमतियां पढ़ना चाहते हैं, तो आप सार्वजनिक पहुंच की अनुमति देने के लिए कंटेनर अनुमतियां सेट कर सकते हैं। बेनामी उपयोगकर्ता अनुरोध को प्रमाणीकृत किए बिना सार्वजनिक रूप से सुलभ कंटेनर के भीतर ब्लब्स पढ़ सकते हैं ._ यहां पूर्ण पढ़ें [http://msdn.microsoft.com/en-us/library/azure/dd179354.aspx) –

+0

तो, दूसरे में शब्द, PublicAccess.Off को सेट करना - या किसी भी * अनुमतियों को सेट नहीं करना - एक निजी कंटेनर देगा। क्या मैं इसे सही ढंग से समझ रहा हूं? –

2

तो, यहाँ मैं क्या कर समाप्त हो गया है। मुझे वहां लाने के लिए नील और ओग्नान के लिए धन्यवाद।

यह निम्नलिखित के रूप में काम करता है:

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

मैं पहली बार स्पष्ट रूप से कंटेनर अनुमतियों निजी करने के लिए सेट (यह भी डिफ़ॉल्ट सेटिंग, Ognyan के अनुसार है): तो फिर

// Connect to storage account 
... 

// Retrieve reference to a container. 
myContainer= blobClient.GetContainerReference("mycontainer"); 

// Create the container if it doesn't already exist. 
if (myContainer.CreateIfNotExists()) 
{ 
    // Explicitly configure container for private access 
    var permissions = myContainer.GetPermissions(); 
    permissions.PublicAccess = BlobContainerPublicAccessType.Off; 
    myContainer.SetPermissions(permissions); 
} 

बाद, जब छवि प्रदर्शित करना चाहते हैं, मैं जोड़ा एक ब्लॉब के मूल भंडारण पथ के लिए एसएएस स्ट्रिंग:

public string GetBlobPathWithSas(string myBlobName) 
{ 
    // Get container reference 
    ... 

    // Get the blob, in my case an image 
    CloudBlockBlob blob = myContainer.GetBlockBlobReference(myBlobName);   

    // Generate a Shared Access Signature that expires after 1 minute, with Read and List access 
    // (A shorter expiry might be feasible for small files, while larger files might need a 
    // longer access period) 
    string sas = myContainer.GetSharedAccessSignature(new SharedAccessBlobPolicy() 
    { 
     SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1), 
     Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.List 
    }); 
    return (blob.Uri.ToString() + sas).ToString(); 
} 

मैं तो GetBlobPathWithSas कहा जाता है() के साथ से समारोह उस्तरा ध्यान में रखते हुए, ताकि प्रत्येक पृष्ठ ताज़ा एक वैध पथ + sas छवि प्रदर्शित करने के लिए देना होगा:

http://msdn.microsoft.com/en-us/library/ee758387.aspx

आशा:

<img src="@GetPathWithSas("myImage")" /> 

सामान्य तौर पर, मैं इस संदर्भ उपयोगी पाया जो किसी की मदद करता है!

+1

"अगर (myContainer.CreateIfNotExists()) ...." एक सिंगलटन या अन्य में स्टार्टअप पर इसे निष्पादित करने के लिए कोड डालना सुनिश्चित करें। अन्यथा आप प्रत्येक अनुरोध पर जुर्माना राउंडट्रिप्स का भुगतान करेंगे। –

3

मैं Ognyan दिमित्रोव के "दृष्टिकोण 2" का उपयोग इस तरह एक ब्राउज़र विंडो के अंदर एक निजी ब्लॉब कंटेनर ("कोई सार्वजनिक उपयोग पढ़ें") में संग्रहीत छोटे पीडीएफ़ सेवा करने के लिए:

कॉन्फ़िग फ़ाइल के साथ
public ActionResult ShowPdf() 
{ 
    string fileName = "fileName.pdf"; 

    var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 
    var blobClient = storageAccount.CreateCloudBlobClient(); 
    var container = blobClient.GetContainerReference("containerName"); 
    var blockBlob = container.GetBlockBlobReference(fileName); 

    Response.AppendHeader("Content-Disposition", "inline; filename=" + fileName); 
    return File(blockBlob.DownloadByteArray(), "application/pdf"); 
} 

<configuration> 
    <appSettings> 
     <add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=account-name;AccountKey=account-key" /> 
    </appSettings> 
</configuration> 

... जो मेरे लिए सही काम करता है!