6
votes

Comment configurer le réglage Cors pour le stockage BLOB dans Windows Azure

J'ai créé plusieurs conteneurs dans un stockage d'azur et ont également téléchargé certains fichiers dans ces conteneurs. Maintenant, je dois donner accès au niveau de domaine au conteneur / blobs. Je l'ai donc essayé du niveau de code comme ci-dessous.

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


0 commentaires

3 Réponses :


4
votes

6 commentaires

Merci pour la réponse. J'ai mis le code C # dans l'événement global.asax Application_Start et essayez de définir la règle Cors pour un conteneur particulier. Mais lorsque j'ai essayé d'accéder à une URL particulière du navigateur, il téléchargait ce fichier, cela signifie que Cors Logic ne fonctionne pas. Pouvez-vous suggérer comment implémenter cela.


Je suis confus maintenant: p. Cors est utile lorsque vous souhaitez accéder ou invoquer l'API de repos à l'aide de JavaScript. Si je ne me trompe pas, vous êtes plus intéressé à restreindre l'accès au conteneur. Ai-je raison?


@ Gaurav Mantri: Oui .. tu m'as eu .. j'ai besoin de ce que tu dis exactement


Ce que vous devez faire, c'est changer le conteneur ACL en privé si vous ne voulez pas que quelqu'un d'autre télécharge directement le blob en tapant blob URL. Je crois que vous pouvez faire sur le portail lui-même.


Ouais. J'ai fait ça. Mais je veux obtenir des images blob de l'image Src. Si je le fais privé, ils ne sont pas accessibles. Peut-on avoir quelque chose comme permettre le stockage de blob pour la demande provenant d'un domaine particulier (mon webisite)?


Désolé de pousser cela, mais où puis-je ouvrir une console et entrer dans ces commandes dans par exemple, Azure Storage Explorer (version 6 Aperçu 3)?



12
votes

Les réponses ci-après répondent à la question qui a été posée dans le titre. Il semble que le questionneur savait déjà comment faire cela en grande partie de son code, mais voici ma réponse à cela. Malheureusement, les échantillons de code MS ont éteint ont été loin d'être faciles ou clairs, alors j'espère que cela aide quelqu'un d'autre. Dans cette solution, tout ce dont vous avez besoin est une instance cloudstorageaCcount code>, que vous pouvez appeler cette fonction à partir de (comme méthode d'extension).

// USAGE: P>

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


0 commentaires

-1
votes

Ce n'est pas une bonne idée de donner accès au niveau de domaine à vos conteneurs. Vous pouvez faire le conteneur privé, télécharger les fichiers (Créez BLOB), puis partagez-la à l'aide de la stratégie d'accès partagée.

Le code ci-dessous peut vous aider. P>

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>


0 commentaires