2015-02-19 15 views
5

Tôi đã tạo một số vùng chứa trong bộ nhớ xanh và cũng đã tải lên một số tệp vào các vùng chứa này. Bây giờ tôi cần cấp quyền truy cập cấp miền cho vùng chứa/blobs. Vì vậy, tôi đã thử nó từ cấp mã như dưới đây.Cách định cấu hình cài đặt CORS cho lưu trữ Blob trong windows azure

 CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
     CloudConfigurationManager.GetSetting("StorageConnectionString")); 

     CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
     ServiceProperties blobServiceProperties = new ServiceProperties(); 
      blobServiceProperties.Cors.CorsRules.Add(new CorsRule(){ 
       AllowedHeaders = new List<string>() {"*"}, 
       ExposedHeaders = new List<string>() {"*"}, 
       AllowedMethods = CorsHttpMethods.Post | CorsHttpMethods.Put | CorsHttpMethods.Get | CorsHttpMethods.Delete , 
       AllowedOrigins = new List<string>() { "http://localhost:8080/"}, 
       MaxAgeInSeconds = 3600, 
      }); 

      blobClient.SetServiceProperties(GetBlobServiceProperties()); 

Nhưng mã trên dường như hoạt động nếu tôi tạo mọi thứ từ mã (Sửa lỗi nếu tôi sai). Tôi cũng tìm thấy các cài đặt như bên dưới Here,

<CorsRule> 
    <AllowedOrigins>http://www.contoso.com, http://www.fabrikam.com</AllowedOrigins> 
    <AllowedMethods>PUT,GET</AllowedMethods> 
    <AllowedHeaders>x-ms-meta-data*,x-ms-meta-target,x-ms-meta-source</AllowedHeaders> 
    <ExposedHeaders>x-ms-meta-*</ExposedHeaders> 
    <MaxAgeInSeconds>200</MaxAgeInSeconds> 
</CorsRule> 

Nhưng tôi không nhận được mã này ở đâu. Tôi có nghĩa là trong đó tập tin. Hoặc là có bất kỳ thiết lập cho CORS trong khi tạo container hoặc blob từ cổng thông tin. Xin vui lòng giúp đỡ. Bất kỳ sự trợ giúp nào cũng sẽ được đánh giá cao. Cảm ơn!

Trả lời

4

Hãy để tôi cố gắng trả lời câu hỏi của bạn. Như bạn biết, Azure Storage cung cấp API REST để quản lý nội dung lưu trữ. Một hoạt động có Set Blob Service Properties và một trong những điều bạn làm ở đó là quản lý các quy tắc CORS cho dịch vụ blob. XML bạn đã đưa vào câu hỏi là trọng tải yêu cầu cho hoạt động này. Mã C# bạn đã đề cập thực sự là thư viện máy khách lưu trữ, về bản chất là một trình bao bọc trên REST API này được viết bằng .Net. Vì vậy, khi bạn sử dụng đoạn mã trên, nó thực sự gọi API REST và gửi XML.

Bây giờ, bạn sẽ có một số cách để đạt được điều đó. Nếu bạn quan tâm đến việc thiết lập chúng theo lập trình, thì bạn có thể viết một số mã tiêu thụ REST API hoặc bạn có thể trực tiếp sử dụng thư viện máy khách lưu trữ .Net như bạn đã làm ở trên. Bạn có thể chỉ cần tạo một ứng dụng giao diện điều khiển, đặt mã trong đó và thực hiện điều đó để thiết lập quy tắc CORS. Nếu bạn đang tìm kiếm một số công cụ để làm điều đó, thì bạn có thể thử một trong những công cụ sau đây:

+0

Cảm ơn bạn đã trả lời. Tôi đã đặt mã C# trong sự kiện global_asax application_start và cố gắng thiết lập quy tắc CORS cho vùng chứa cụ thể. Nhưng khi tôi cố gắng truy cập bất kỳ URL cụ thể nào từ trình duyệt, nó đã tải xuống tệp này, điều đó có nghĩa là logic CORS không hoạt động. Bạn có thể đề xuất cách thực hiện điều này không. –

+0

Tôi đang bối rối bây giờ: P. CORS rất hữu ích khi bạn muốn truy cập hoặc gọi REST API bằng JavaScript. Nếu tôi không nhầm, bạn quan tâm nhiều hơn đến việc hạn chế quyền truy cập vào vùng chứa. Tôi có đúng không? –

+0

@ Gaurav Mantri: Vâng .. bạn có tôi .. Tôi cần chính xác những gì bạn nói –

11

Sau đây trả lời cho câu hỏi đó đã thực sự hỏi trong tiêu đề. Có vẻ như người hỏi đã biết cách làm điều này phần lớn từ mã của anh ta, nhưng đây là câu trả lời của tôi cho điều này. Thật không may các mẫu mã MS đã đưa ra đã được xa dễ dàng hoặc rõ ràng, vì vậy tôi hy vọng điều này sẽ giúp người khác. Trong giải pháp này tất cả những gì bạn cần là một cá thể CloudStorageAccount, mà bạn có thể gọi hàm này từ đó (như một phương thức mở rộng).

// SỬ DỤNG:

 // -- example usage (in this case adding a wildcard CORS rule to this account -- 

     CloudStorageAccount acc = getYourStorageAccount(); 

     acc.SetCORSPropertiesOnBlobService(cors => { 
      var wildcardRule = new CorsRule() { AllowedMethods = CorsHttpMethods.Get, AllowedOrigins = { "*" } }; 
      cors.CorsRules.Add(wildcardRule); 
      return cors; 
     }); 

// Mã sản phẩm:

/// <summary> 
    /// Allows caller to replace or alter the current CorsProperties on a given CloudStorageAccount. 
    /// </summary> 
    /// <param name="storageAccount">Storage account.</param> 
    /// <param name="alterCorsRules">The returned value will replace the 
    /// current ServiceProperties.Cors (ServiceProperties) value. </param> 
    public static void SetCORSPropertiesOnBlobService(this CloudStorageAccount storageAccount, 
     Func<CorsProperties, CorsProperties> alterCorsRules) 
    { 
     if (storageAccount == null || alterCorsRules == null) throw new ArgumentNullException(); 

     CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 

     ServiceProperties serviceProperties = blobClient.GetServiceProperties(); 

     serviceProperties.Cors = alterCorsRules(serviceProperties.Cors) ?? new CorsProperties(); 

     blobClient.SetServiceProperties(serviceProperties); 
    } 

Có thể hữu ích để xem xét các thuộc tính của lớp CorsRule:

 CorsRule corsRule = new CorsRule() { 
      AllowedMethods = CorsHttpMethods.Get,  // Gets or sets the HTTP methods permitted to execute for this origin 
      AllowedOrigins = { "*" },     // (IList<string>) Gets or sets domain names allowed via CORS. 
      //AllowedHeaders = { "*" },     // (IList<string>) Gets or sets headers allowed to be part of the CORS request 
      //ExposedHeaders = null,     // (IList<string>) Gets or sets response headers that should be exposed to client via CORS 
      //MaxAgeInSeconds = 33333     // Gets or sets the length of time in seconds that a preflight response should be cached by browser 
     }; 
-1

của nó không phải là một tốt ý tưởng cấp quyền truy cập cấp miền cho vùng chứa của bạn. Bạn có thể đặt vùng chứa riêng tư, tải tệp lên (tạo blob) và sau đó chia sẻ tệp bằng cách sử dụng Chính sách truy cập được chia sẻ.

Mã bên dưới có thể giúp bạn.

static void Main(string[] args) 
     { 
      var account = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["AzureStorageAccount"].ConnectionString); 
      var bClient = account.CreateCloudBlobClient(); 
      var container = bClient.GetContainerReference("test-share-container-1"); 
      container.CreateIfNotExists(); 

      // clear all existing policy 
      ClearPolicy(container); 

      string newPolicy = "blobsharepolicy"; 
      CreateSharedAccessPolicyForBlob(container, newPolicy); 
      var bUri = BlobUriWithNewPolicy(container, newPolicy); 

      Console.ReadLine(); 
     } 

     static void ClearPolicy(CloudBlobContainer container) 
     { 
      var perms = container.GetPermissions(); 
      perms.SharedAccessPolicies.Clear(); 
      container.SetPermissions(perms); 
     }  

     static string BlobUriWithNewPolicy(CloudBlobContainer container, string policyName) 
     { 
      var blob = container.GetBlockBlobReference("testfile1.txt"); 
      string blobContent = "Hello there !!"; 
      MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(blobContent)); 
      ms.Position = 0; 
      using (ms) 
      { 
       blob.UploadFromStream(ms); 
      } 

      return blob.Uri + blob.GetSharedAccessSignature(null, policyName); 
     } 

     static void CreateSharedAccessPolicyForBlob(CloudBlobContainer container, string policyName) 
     { 
      SharedAccessBlobPolicy sharedPolicy = new SharedAccessBlobPolicy() 
      { 
       SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24), 
       Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Read 
      }; 
      var permissions = container.GetPermissions();    
      permissions.SharedAccessPolicies.Add(policyName, sharedPolicy); 
      container.SetPermissions(permissions); 
     } 


<connectionStrings> 
    <add name="AzureStorageAccount" connectionString="DefaultEndpointsProtocol=https;AccountName=[name];AccountKey=[key]" /> 
    </connectionStrings> 
Các vấn đề liên quan