2017-09-11 26 views
0

Je souhaite utiliser l'API C++ Azure pour générer une signature d'accès partagé pour un conteneur sur Azure et obtenir la chaîne d'accès. Mais ne peux pas trouver un bon exemple. Presque tous les exemples sont en C#. Seulement trouvé cela, https://docs.microsoft.com/en-us/azure/storage/files/storage-c-plus-plus-how-to-use-filescomment obtenir la signature d'accès partagé du conteneur Azure par C++

Voici ce que je faisais,

// Retrieve a reference to a previously created container. 
    azure::storage::cloud_blob_container container = blob_client.get_container_reference(s2ws(eventID)); 

    // Create the container if it doesn't already exist. 
    container.create_if_not_exists(); 

    // Get the current permissions for the event. 
    auto blobPermissions = container.download_permissions(); 

    // Create and assign a policy 
    utility::string_t policy_name = s2ws("Signature" + eventID); 

    azure::storage::blob_shared_access_policy policy = azure::storage::blob_shared_access_policy(); 

    // set expire date 
    policy.set_expiry(utility::datetime::utc_now() + utility::datetime::from_days(10)); 

    //give read and write permissions 
    policy.set_permissions(azure::storage::blob_shared_access_policy::permissions::read); 

    azure::storage::shared_access_policies<azure::storage::blob_shared_access_policy> policies; 
    //add the new shared policy 
    policies.insert(std::make_pair(policy_name, policy)); 

    blobPermissions.set_policies(policies); 
    blobPermissions.set_public_access(azure::storage::blob_container_public_access_type::off); 

    container.upload_permissions(blobPermissions); 

    auto token = container.get_shared_access_signature(policy, policy_name); 

Après l'exécution, je peux voir la politique est définie avec succès sur le conteneur, mais le jeton obtenu par la dernière ligne ne va pas. Et il y aura toujours une exception en quittant cette fonction, le point d'arrêt se trouve dans _Deallocate().

Quelqu'un pourrait me dire quel est le problème avec mon code? Ou quelques exemples à ce sujet? Merci beaucoup.

Edité

Le jeton je suis arrivé ressemble,

"sv=2016-05-31&si=Signature11111122222222&sig=JDW33j1Gzv00REFfr8Xjz5kavH18wme8E7vZ%2FFqUj3Y%3D&spr=https%2Chttp&se=2027-09-09T05%3A54%3A29Z&sp=r&sr=c" 

A ce titre, je ne pouvais pas accéder à mes blobs. Le jeton droit créé par « Microsoft Azure Storage Explorer » à l'aide de cette politique ressemble,

?sv=2016-05-31&si=Signature11111122222222&sr=c&sig=9tS91DUK7nkIlIFZDmdAdlNEfN2HYYbvhc10iimP1sk%3D 

A propos de l'exception, je mets tout ce code dans une fonction. Si sans la dernière ligne, tout va bien. Mais si vous ajoutez la dernière ligne, tout en quittant cette fonction, elle lèvera une exception et indiquera qu'un point d'arrêt a été déclenché. Il est arrêté à la dernière ligne de _Deallocate() dans "C: \ Microsoft Visual Studio \ 2017 \ Communauté \ VC \ Tools \ MSVC \ 14.10.25017 \ include \ xmemory0",

::operator delete(_Ptr); 

pourquoi ce n'ai aucune idée exception étant jeté et comment déboguer car il semble qu'il ne peut pas être attrapé par mon code.

sous la direction

Après changé la dernière ligne,

auto token = container.get_shared_access_signature(azure::storage::blob_shared_access_policy(), policy_name); 

Le jeton retourné est juste, je peux accéder à mes blobs en l'utilisant. Mais l'exception ennuyeux est toujours là :-(

Edité

juste trouvé l'exception a eu lieu que lors de la construction de débogage. Si dans la version, tout est ok. Alors peut-être qu'il est lié à la compilation de l'environnement.

+0

Pouvez-vous décrire ce que vous voulez dire par «mais le jeton obtenu par la dernière ligne n'est pas correct». S'il vous plaît modifier votre question et inclure cette information. Veuillez également inclure les détails de l'exception que vous recevez. –

+0

Merci pour la réponse. Modifié @GauravMantri – Harrison

+0

Avez-vous encore besoin d'une explication sur la raison pour laquelle le jeton de Microsoft Azure Explorer a fonctionné et que le jeton que vous avez reçu (avant modification) ne l'a pas fait? S'il vous plaît faites le moi savoir et je vais fournir des détails. –

Répondre

1

Lors de la création d'un Shared Access Signature (SAS), vous disposez des autorisations suivantes: SAS Start/Expiry, Autorisations, ACLing IP, Restrictions de protocole, etc. Vous pouvez créer une stratégie d'accès sur le conteneur blob avec ces éléments, créer une annonce -hoc SAS (c'est-à-dire sans politique d'accès) avec ces choses ou combiner ces deux pour créer un jeton SAS

Une chose importante à garder à l'esprit est que si quelque chose est défini dans une politique d'accès, vous ne pouvez pas les redéfinir lors de la création d'une SAS. Ainsi, par exemple, supposons que vous créez une stratégie d'accès avec la permission Read et rien d'autre, vous ne pouvez pas fournir d'autorisations lors de la création d'un jeton SAS lors de l'utilisation de cette stratégie d'accès.Vous pouvez certainement définir les éléments qui n'existent pas dans la stratégie d'accès (par exemple, vous pouvez définir une expiration SAS si elle n'est pas définie dans la stratégie d'accès). Si vous regardez votre code (avant modification), ce que vous faites est de créer une politique d'accès avec quelques permissions, puis de créer un jeton SAS en utilisant les mêmes permissions et la même politique d'accès. C'est pourquoi ça n'a pas marché. Toutefois, lorsque vous avez créé un jeton SAS à partir de l'Explorateur de stockage de Microsoft, vous remarquerez qu'il n'a inclus que la politique d'accès (si=Signature11111122222222) et aucun des autres paramètres et c'est pourquoi cela a fonctionné.

Dans votre code après modification, vous n'incluez aucune autorisation mais seulement utilisé la politique d'accès (d'une manière que vous avez fait ce que fait Storage Explorer) et c'est pourquoi les choses ont fonctionné après l'édition. J'espère que cela explique le mystère derrière les jetons SAS qui ne fonctionnent pas et qui ne fonctionnent pas.

+0

Génial, merci pour votre temps et cette explication détaillée. – Harrison