2015-02-19 11 views
5

Ho creato diversi contenitori in uno spazio di archiviazione azzurro e caricato anche alcuni file in questi contenitori. Ora ho bisogno di dare accesso a livello di dominio al contenitore/BLOB. Così ho provato dal livello di codice come di seguito.Come configurare l'impostazione CORS per la memoria BLOB in 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()); 

Ma soprattutto il codice sembra essere il lavoro se sto creando tutto da codice (correggetemi se sbaglio). Trovo anche impostare come qui di seguito 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> 

ma non ho arrivare dove questo codice deve mettere. Intendo in quale file. Oppure c'è qualche impostazione per CORS durante la creazione di container o BLOB dal portale azzurro. Si prega di aiutare. Qualsiasi aiuto sarebbe apprezzabile. Grazie!

risposta

4

Lasciami provare a rispondere alla tua domanda. Come sai, Azure Storage offre un'API REST per la gestione dei contenuti di archiviazione. Un'operazione è Set Blob Service Properties e una delle cose che fai è gestire le regole CORS per il servizio BLOB. L'XML che hai incluso nella domanda è il carico utile della richiesta per questa operazione. Il codice C# che hai menzionato è in realtà una libreria client di archiviazione che è essenzialmente un wrapper su questa API REST scritta in .Net. Quindi, quando si utilizza il codice sopra, in realtà richiama l'API REST e invia l'XML.

Ora che arrivano alle opzioni sulla configurazione delle regole CORS, ci sono alcuni modi per ottenerlo. Se sei interessato a configurarli a livello di codice, puoi scrivere del codice che utilizza l'API REST oppure puoi utilizzare direttamente la libreria del client di archiviazione .Net come hai fatto sopra. Potresti semplicemente creare un'applicazione console, inserire il codice e eseguirla per impostare la regola CORS. Se siete alla ricerca di alcuni strumenti per farlo, allora si può provare uno dei seguenti strumenti:

+0

Grazie per la risposta. Ho inserito il codice C# nell'evento application_start global.asax e provo a impostare la regola CORS per un determinato contenitore. Ma quando ho provato ad accedere ad un particolare URL dal browser, è stato il download di questo file, il che significa che la logica CORS non funziona. Puoi suggerire come implementarlo. –

+0

Ora sono confuso: P. CORS è utile quando si desidera accedere o richiamare API REST utilizzando JavaScript. Se non sbaglio, sei più interessato a limitare l'accesso al contenitore. Ho ragione? –

+0

@ Gaurav Mantri: Sì .. mi hai preso .. Mi serve esattamente quello che dici –

11

Di seguito risponde alla domanda che è stato effettivamente chiesto nel titolo. Sembra che l'interrogante sapesse già come farlo in gran parte dal suo codice, ma ecco la mia risposta a questo. Sfortunatamente i campioni di codice che MS ha messo fuori è stato tutt'altro che facile o chiaro, quindi spero che questo aiuti qualcun altro. In questa soluzione tutto ciò di cui hai bisogno è un'istanza CloudStorageAccount, che puoi chiamare da questa funzione (come metodo di estensione).

// USO:

 // -- 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; 
     }); 

// CODICE:

/// <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); 
    } 

Può essere utile considerare le proprietà della classe 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

La sua non è una buona idea di fornire l'accesso a livello di dominio ai contenitori. È possibile rendere privato il contenitore, caricare i file (creare blob) e quindi condividerlo utilizzando i criteri di accesso condiviso.

Il seguente codice può essere d'aiuto.

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> 
Problemi correlati