Contrôle d’accès Service Bus avec des signatures d’accès partagéService Bus access control with Shared Access Signatures

Les signatures d’accès partagé (SAP) constituent le mécanisme principal de sécurité de la messagerie Service Bus.Shared Access Signatures (SAS) are the primary security mechanism for Service Bus messaging. Cet article décrit les SAP, leur fonctionnement et comment les utiliser indépendamment de la plateforme.This article discusses SAS, how they work, and how to use them in a platform-agnostic way.

SAP protège l’accès à Service Bus en fonction de règles d’autorisation.SAS guards access to Service Bus based on authorization rules. Celles-ci sont configurées sur un espace de noms, ou sur une entité de messagerie (relais, file d’attente ou rubrique).Those are configured either on a namespace, or a messaging entity (relay, queue, or topic). Une règle d’autorisation a un nom, est associée à des droits spécifiques et comporte une paire de clés de chiffrement.An authorization rule has a name, is associated with specific rights, and carries a pair of cryptographic keys. Vous utilisez le nom et la clé de la règle via le Kit de développement logiciel (SDK) Service Bus ou dans votre propre code pour générer un jeton SAP.You use the rule's name and key via the Service Bus SDK or in your own code to generate a SAS token. Un client peut ensuite passer le jeton à Service Bus pour prouver l’autorisation pour l’opération demandée.A client can then pass the token to Service Bus to prove authorization for the requested operation.

Présentation des signatures d’accès partagé (SAS)Overview of SAS

Les signatures d’accès partagé sont un mécanisme d’autorisation reposant sur des revendications à l’aide de simples jetons.Shared Access Signatures are a claims-based authorization mechanism using simple tokens. À l’aide d’une SAP, les clés ne sont jamais transmises simultanément.Using SAS, keys are never passed on the wire. Les clés sont utilisées pour signer par chiffrement des informations qui peuvent être vérifiées ultérieurement par le service.Keys are used to cryptographically sign information that can later be verified by the service. Une SAP peut être utilisée de façon similaire à un schéma de nom d’utilisateur et de mot de passe où le client est en possession immédiate d’un nom de règle d’autorisation et d’une clé correspondante.SAS can be used similar to a username and password scheme where the client is in immediate possession of an authorization rule name and a matching key. Une SAP peut également être utilisée comme un modèle de sécurité fédéré, où le client reçoit un jeton d’accès signé et limité dans le temps d’un service d’émission de jeton de sécurité sans jamais être en possession de la clé de signature.SAS can also be used similar to a federated security model, where the client receives a time-limited and signed access token from a security token service without ever coming into possession of the signing key.

L’authentification SAP dans Service Bus est configurée avec des règles d’autorisation d’accès partagé nommées ayant les droits d’accès associés, ainsi qu’une paire de clés de chiffrement primaire et secondaire.SAS authentication in Service Bus is configured with named Shared Access Authorization Rules having associated access rights, and a pair of primary and secondary cryptographic keys. Les clés sont des valeurs de 256 bits dans une représentation Base64.The keys are 256-bit values in Base64 representation. Vous pouvez configurer des règles au niveau de l’espace de noms, sur les relais, files d’attente et rubriques Service Bus.You can configure rules at the namespace level, on Service Bus relays, queues, and topics.

Le jeton de signature d’accès partagé contient le nom de la règle d’autorisation choisie, l’URI de la ressource à laquelle accéder, un délai d’expiration et une signature de chiffrement HMAC-SHA256 calculé sur ces champs à l’aide de la clé de chiffrement primaire ou secondaire de la règle d’autorisation choisie.The Shared Access Signature token contains the name of the chosen authorization rule, the URI of the resource that shall be accessed, an expiry instant, and an HMAC-SHA256 cryptographic signature computed over these fields using either the primary or the secondary cryptographic key of the chosen authorization rule.

Stratégies d’autorisation d’accès partagéShared Access Authorization Policies

Chaque espace de noms Service Bus et chaque entité Service Bus ont une stratégie d’autorisation d’accès partagé constituée de règles.Each Service Bus namespace and each Service Bus entity has a Shared Access Authorization policy made up of rules. La stratégie au niveau de l’espace de noms s’applique à toutes les entités à l’intérieur de l’espace de noms, quelle que soit leur configuration de stratégie individuelle.The policy at the namespace level applies to all entities inside the namespace, irrespective of their individual policy configuration.

Pour chaque règle de stratégie d’autorisation, vous choisissez trois éléments d’information : le nom, l’étendue et les autorisations.For each authorization policy rule, you decide on three pieces of information: name, scope, and rights. Le nom est un nom unique au sein de cette étendue.The name is just that; a unique name within that scope. L’étendue est l’URI de la ressource en question.The scope is easy enough: it's the URI of the resource in question. Pour un espace de noms Service Bus, l’étendue est le nom de domaine complet (FQDN), tel que https://<yournamespace>.servicebus.windows.net/.For a Service Bus namespace, the scope is the fully qualified domain name (FQDN), such as https://<yournamespace>.servicebus.windows.net/.

Les droits qui sont attribués par la règle de stratégie peuvent être une combinaison de :The rights conferred by the policy rule can be a combination of:

  • « Envoyer » - donne le droit d’envoyer des messages à l’entité.'Send' - Confers the right to send messages to the entity
  • « Écouter » - donne le droit d’écouter (relais) ou de recevoir (file d’attente, abonnements et toutes les opérations de traitement de messages associées).'Listen' - Confers the right to listen (relay) or receive (queue, subscriptions) and all related message handling
  • « Gérer » - donne le droit de gérer la topologie de l’espace de noms, y compris la création et la suppression des entités.'Manage' - Confers the right to manage the topology of the namespace, including creating and deleting entities

Le droit « Gérer » inclut les droits « Envoyer » et « Recevoir ».The 'Manage' right includes the 'Send' and 'Receive' rights.

Une stratégie d’entité et d’espace de noms peut contenir 12 règles d’autorisation d’accès partagé maximum, ce qui laisse de l’espace à trois ensembles de règles, chacun couvrant les droits basiques et la combinaison des droits « Envoyer » et « Écouter ».A namespace or entity policy can hold up to 12 Shared Access Authorization rules, providing room for three sets of rules, each covering the basic rights and the combination of Send and Listen. Cette limite souligne que le magasin de stratégies SAP n’est pas destiné à être magasin de comptes de service ou d’utilisateur.This limit underlines that the SAS policy store is not intended to be a user or service account store. Si votre application doit accorder l’accès aux identités de service ou d’utilisateur basées sur Service Bus, elle doit implémenter un service d’émission de jeton de sécurité qui émet des jetons SAP après une authentification et une vérification de l’accès.If your application needs to grant access to Service Bus based on user or service identities, it should implement a security token service that issues SAS tokens after an authentication and access check.

Une clé primaire et une clé secondaire sont attribuées à une règle d’autorisation.An authorization rule is assigned a Primary Key and a Secondary Key. Il s’agit de clés de chiffrement fortes.These are cryptographically strong keys. Ne les perdez pas et ne les diffusez pas ; elles seront toujours disponibles sur le portail Azure.Don't lose them or leak them - they'll always be available in the Azure portal. Vous pouvez utiliser n’importe laquelle des clés générées et vous pouvez les régénérer à tout moment.You can use either of the generated keys, and you can regenerate them at any time. Si vous régénérez ou modifiez une clé dans la stratégie, tous les jetons précédemment émis en fonction de cette clé deviennent instantanément non valides.If you regenerate or change a key in the policy, all previously issued tokens based on that key become instantly invalid. Toutefois, les connexions en cours créées en fonction de ces jetons continuent de fonctionner jusqu’à ce que le jeton expire.However, ongoing connections created based on such tokens will continue to work until the token expires.

Lorsque vous créez un espace de noms Service Bus, une règle de stratégie nommée RootManageSharedAccessKey est automatiquement créée pour l’espace de noms.When you create a Service Bus namespace, a policy rule named RootManageSharedAccessKey is automatically created for the namespace. Cette stratégie dispose d’autorisations Gérer pour l’espace de noms complet.This policy has Manage permissions for the entire namespace. Il est recommandé de traiter cette règle comme un compte racine d’administration et de ne pas l’utiliser dans votre application.It's recommended that you treat this rule like an administrative root account and don't use it in your application. Vous pouvez créer des règles de stratégies supplémentaires sous l’onglet Configurer pour l’espace de noms dans le portail via Powershell ou Azure CLI.You can create additional policy rules in the Configure tab for the namespace in the portal, via Powershell or Azure CLI.

Configuration de l’authentification de signature d’accès partagéConfiguration for Shared Access Signature authentication

Vous pouvez configurer la règle SharedAccessAuthorizationRule sur les espaces de noms, les files d’attente ou rubriques Service Bus.You can configure the SharedAccessAuthorizationRule rule on Service Bus namespaces, queues, or topics. La configuration d’un abonnement SharedAccessAuthorizationRule sur un abonnement Service Bus n’est pas pris en charge pour l’instant, mais vous pouvez utiliser les règles configurées sur un espace de noms ou une rubrique permettant de sécuriser l’accès aux abonnements.Configuring a SharedAccessAuthorizationRule on a Service Bus subscription is currently not supported, but you can use rules configured on a namespace or topic to secure access to subscriptions. Pour obtenir un exemple fonctionnel qui illustre cette procédure, consultez l’exemple Utilisation de l’authentification de signature d’accès partagé (SAS) avec les abonnements Service Bus .For a working sample that illustrates this procedure, see the Using Shared Access Signature (SAS) authentication with Service Bus Subscriptions sample.

SAS

Dans cette figure, les règles d’autorisation manageRuleNS, sendRuleNS et listenRuleNS s’appliquent à la file d’attente Q1 et à la rubrique T1, tandis que listenRuleQ et sendRuleQ s’appliquent uniquement à la file d’attente Q1, et sendRuleT uniquement à la rubrique T1.In this figure, the manageRuleNS, sendRuleNS, and listenRuleNS authorization rules apply to both queue Q1 and topic T1, while listenRuleQ and sendRuleQ apply only to queue Q1 and sendRuleT applies only to topic T1.

Générer un jeton de signature d’accès partagéGenerate a Shared Access Signature token

Les clients qui ont accès au nom d’une règle d’autorisation et à celui de ses clés de signature peuvent générer un jeton SAP.Any client that has access to name of an authorization rule name and one of its signing keys can generate a SAS token. Le jeton est généré suite à l’élaboration d’une chaîne au format suivant :The token is generated by crafting a string in the following format:

SharedAccessSignature sig=<signature-string>&se=<expiry>&skn=<keyName>&sr=<URL-encoded-resourceURI>
  • se - Délai d’expiration du jeton.se - Token expiry instant. Entier reflétant les secondes depuis l’époque 00:00:00 UTC du 1er janvier 1970 (époque UNIX) lorsque le jeton expire.Integer reflecting seconds since the epoch 00:00:00 UTC on 1 January 1970 (UNIX epoch) when the token expires.
  • skn - Nom de la règle d’autorisation.skn - Name of the authorization rule.
  • sr - URI de la ressource faisant l’objet de l’accès.sr - URI of the resource being accessed.
  • sig - Signature.sig - Signature.

La signature-string est le hachage SHA-256 calculé sur l’URI de ressource (étendue comme décrit dans la section précédente) et la représentation de chaîne du délai d’expiration du jeton, séparée par CRLF.The signature-string is the SHA-256 hash computed over the resource URI (scope as described in the previous section) and the string representation of the token expiry instant, separated by CRLF.

Le calcul de hachage est similaire au code de pseudo suivant et retourne une valeur de hachage de 256 bits/32 octets.The hash computation looks similar to the following pseudo code and returns a 256-bit/32-byte hash value.

SHA-256('https://<yournamespace>.servicebus.windows.net/'+'\n'+ 1438205742)

Le jeton contient les valeurs non hachées afin que le destinataire puisse recalculer le hachage avec les mêmes paramètres, en vérifiant que l’émetteur est en possession d’une clé de signature valide.The token contains the non-hashed values so that the recipient can recompute the hash with the same parameters, verifying that the issuer is in possession of a valid signing key.

L’URI de ressource est l’URI complet de la ressource Service Bus à laquelle vous souhaitez accéder.The resource URI is the full URI of the Service Bus resource to which access is claimed. Par exemple, http://<namespace>.servicebus.windows.net/<entityPath> ou sb://<namespace>.servicebus.windows.net/<entityPath> ; qui est, http://contoso.servicebus.windows.net/contosoTopics/T1/Subscriptions/S3.For example, http://<namespace>.servicebus.windows.net/<entityPath> or sb://<namespace>.servicebus.windows.net/<entityPath>; that is, http://contoso.servicebus.windows.net/contosoTopics/T1/Subscriptions/S3.

L’URI doit être encodés en pourcentage.The URI must be percent-encoded.

La règle de l’autorisation d’accès partagé utilisée pour la signature doit être configurée sur l’entité spécifiée par cette URI, ou par un de ses parents hiérarchiques.The shared access authorization rule used for signing must be configured on the entity specified by this URI, or by one of its hierarchical parents. Par exemple, http://contoso.servicebus.windows.net/contosoTopics/T1 ou http://contoso.servicebus.windows.net dans l’exemple précédent.For example, http://contoso.servicebus.windows.net/contosoTopics/T1 or http://contoso.servicebus.windows.net in the previous example.

Un jeton SAP est valable pour toutes les ressources avec le préfixe <resourceURI> utilisé dans signature-string.A SAS token is valid for all resources prefixed with the <resourceURI> used in the signature-string.

Régénération des clésRegenerating keys

Il est recommandé de régénérer régulièrement les clés utilisées dans l’objet SharedAccessAuthorizationRule .It is recommended that you periodically regenerate the keys used in the SharedAccessAuthorizationRule object. Les emplacements des clés primaires et secondaires existent afin que vous puissiez permuter progressivement les clés.The primary and secondary key slots exist so that you can rotate keys gradually. Si votre application utilise généralement la clé primaire, vous pouvez copier la clé primaire dans l’emplacement de la clé secondaire et alors seulement régénérer la clé primaire.If your application generally uses the primary key, you can copy the primary key into the secondary key slot, and only then regenerate the primary key. La nouvelle valeur de clé primaire peut ensuite être configurée dans les applications clientes, qui bénéficient d’un accès continu à l’aide de l’ancienne clé primaire dans l’emplacement secondaire.The new primary key value can then be configured into the client applications, which have continued access using the old primary key in the secondary slot. Une fois que tous les clients sont mis à jour, vous pouvez régénérer la clé secondaire pour enfin mettre hors service l’ancienne clé primaire.Once all clients are updated, you can regenerate the secondary key to finally retire the old primary key.

Si vous avez connaissance ou suspectez qu’une clé est compromise et si vous devez révoquer les clés, vous pouvez régénérer les éléments PrimaryKey et SecondaryKey d’une règle SharedAccessAuthorizationRule, et les remplacer par de nouvelles clés.If you know or suspect that a key is compromised and you have to revoke the keys, you can regenerate both the PrimaryKey and the SecondaryKey of a SharedAccessAuthorizationRule, replacing them with new keys. Cette procédure annule tous les jetons signés avec les anciennes clés.This procedure invalidates all tokens signed with the old keys.

Authentification par signature d’accès partagé avec Service BusShared Access Signature authentication with Service Bus

Les scénarios décrits ci-après incluent la configuration des règles d’autorisation, la génération de jetons SAP et l’autorisation de client.The scenarios described as follows include configuration of authorization rules, generation of SAS tokens, and client authorization.

Pour visionner un exemple fonctionnel d’application Service Bus qui illustre la configuration et l’autorisation SAP, consultez Authentification de la Signature d’accès partagé avec Service Bus.For a full working sample of a Service Bus application that illustrates the configuration and uses SAS authorization, see Shared Access Signature authentication with Service Bus. Un exemple d’utilisation de règles d’autorisation SAS configuré sur les espaces de noms ou des rubriques pour sécuriser les abonnements Service Bus est disponible ici : Utilisation de l’authentification de signature d’accès partagé (SAS) avec les abonnements Service Bus.A related sample that illustrates the use of SAS authorization rules configured on namespaces or topics to secure Service Bus subscriptions is available here: Using Shared Access Signature (SAS) authentication with Service Bus Subscriptions.

Accès aux règles d’autorisation d’accès partagé sur une entitéAccess Shared Access Authorization rules on an entity

Avec les bibliothèques .NET Framework Service Bus, vous pouvez accéder à un objet Microsoft.ServiceBus.Messaging.SharedAccessAuthorizationRule configuré sur une file d’attente ou une rubrique Service Bus, par le biais de la collection AuthorizationRules dans les objets QueueDescription ou TopicDescription correspondants.With Service Bus .NET Framework libraries, you can access a Microsoft.ServiceBus.Messaging.SharedAccessAuthorizationRule object configured on a Service Bus queue or topic through the AuthorizationRules collection in the corresponding QueueDescription or TopicDescription.

Le code suivant montre comment ajouter des règles d’autorisation à une file d’attente.The following code shows how to add authorization rules for a queue.

// Create an instance of NamespaceManager for the operation
NamespaceManager nsm = NamespaceManager.CreateFromConnectionString(
    <connectionString> );
QueueDescription qd = new QueueDescription( <qPath> );

// Create a rule with send rights with keyName as "contosoQSendKey"
// and add it to the queue description.
qd.Authorization.Add(new SharedAccessAuthorizationRule("contosoSendKey",
    SharedAccessAuthorizationRule.GenerateRandomKey(),
    new[] { AccessRights.Send }));

// Create a rule with listen rights with keyName as "contosoQListenKey"
// and add it to the queue description.
qd.Authorization.Add(new SharedAccessAuthorizationRule("contosoQListenKey",
    SharedAccessAuthorizationRule.GenerateRandomKey(),
    new[] { AccessRights.Listen }));

// Create a rule with manage rights with keyName as "contosoQManageKey"
// and add it to the queue description.
// A rule with manage rights must also have send and receive rights.
qd.Authorization.Add(new SharedAccessAuthorizationRule("contosoQManageKey",
    SharedAccessAuthorizationRule.GenerateRandomKey(),
    new[] {AccessRights.Manage, AccessRights.Listen, AccessRights.Send }));

// Create the queue.
nsm.CreateQueue(qd);

Utilisation de l’autorisation de la signature d’accès partagé (SAP)Use Shared Access Signature authorization

Les applications utilisant le kit de développement logiciel (SDK) avec les bibliothèques.NET Service BUS peuvent utiliser les autorisations SAP via la classe SharedAccessSignatureTokenProvider classe.Applications using the Azure .NET SDK with the Service Bus .NET libraries can use SAS authorization through the SharedAccessSignatureTokenProvider class. Le code suivant montre comment utiliser le fournisseur de jeton pour envoyer des messages à une file d’attente Service Bus.The following code illustrates the use of the token provider to send messages to a Service Bus queue. Comme alternative à l’utilisation présentée ici, vous pouvez également transmettre un jeton préalablement émis à la méthode de fabrique du fournisseur de jetons.Alternative to the usage shown here, you can also pass a previously issued token to the token provider factory method.

Uri runtimeUri = ServiceBusEnvironment.CreateServiceUri("sb",
    <yourServiceNamespace>, string.Empty);
MessagingFactory mf = MessagingFactory.Create(runtimeUri,
    TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, key));
QueueClient sendClient = mf.CreateQueueClient(qPath);

//Sending hello message to queue.
BrokeredMessage helloMessage = new BrokeredMessage("Hello, Service Bus!");
helloMessage.MessageId = "SAS-Sample-Message";
sendClient.Send(helloMessage);

Vous pouvez aussi utiliser le fournisseur de jetons directement pour l’émission de jetons à transmettre à d’autres clients.You can also use the token provider directly for issuing tokens to pass to other clients.

Les chaînes de connexion peuvent inclure un nom de règle (SharedAccessKeyName) et la clé de la règle (SharedAccessKey) ou un jeton émis précédemment (SharedAccessSignature).Connection strings can include a rule name (SharedAccessKeyName) and rule key (SharedAccessKey) or a previously issued token (SharedAccessSignature). Lorsque ceux-ci sont présents dans la chaîne de connexion transmise à un constructeur ou une méthode de fabrique acceptant une chaîne de connexion, le fournisseur de jetons SAP est automatiquement créé et renseigné.When those are present in the connection string passed to any constructor or factory method accepting a connection string, the SAS token provider is automatically created and populated.

Pour utiliser une autorisation SAS avec les relais Service Bus, vous pouvez utiliser des clés SAS configurées sur un espace de noms Service Bus.Note that to use SAS authorization with Service Bus relays, you can use SAS keys configured on the Service Bus namespace. Si vous créez explicitement un relais sur l’espace de noms (NamespaceManager avec un objet RelayDescription), vous pouvez définir les règles SAP pour ce relais.If you explicitly create a relay on the namespace (NamespaceManager with a RelayDescription) object, you can set the SAS rules just for that relay. Pour utiliser une autorisation SAS avec des abonnements Service Bus, vous pouvez utiliser des clés SAS configurées sur un espace de noms Service Bus ou sur une rubrique.To use SAS authorization with Service Bus subscriptions, you can use SAS keys configured on a Service Bus namespace or on a topic.

Utilisation de la signature d’accès partagé (au niveau de HTTP)Use the Shared Access Signature (at HTTP level)

Maintenant que vous savez comment créer des signatures d’accès partagé pour les entités dans Service Bus, vous êtes prêt à effectuer une requête HTTP POST :Now that you know how to create Shared Access Signatures for any entities in Service Bus, you are ready to perform an HTTP POST:

POST https://<yournamespace>.servicebus.windows.net/<yourentity>/messages
Content-Type: application/json
Authorization: SharedAccessSignature sr=https%3A%2F%2F<yournamespace>.servicebus.windows.net%2F<yourentity>&sig=<yoursignature from code above>&se=1438205742&skn=KeyName
ContentType: application/atom+xml;type=entry;charset=utf-8

N’oubliez pas que cela fonctionne pour tout.Remember, this works for everything. Vous pouvez créer une signature d’accès partagé pour une file d’attente, une rubrique ou un abonnement.You can create SAS for a queue, topic, or subscription.

Si vous donnez un jeton SAS à un expéditeur ou un client, celui-ci ne dispose pas directement de la clé et il ne peut pas inverser le hachage pour l’obtenir.If you give a sender or client a SAS token, they don't have the key directly, and they cannot reverse the hash to obtain it. Ainsi, vous contrôlez le contenu auquel il peut accéder et pour quelle durée.As such, you have control over what they can access, and for how long. Il est important de ne pas oublier que si vous modifiez la clé primaire dans la stratégie, les signatures d’accès partagé créées à partir de celle-ci ne sont plus valides.An important thing to remember is that if you change the primary key in the policy, any Shared Access Signatures created from it are invalidated.

Utilisation de la signature d’accès partagé (au niveau d’AMQP)Use the Shared Access Signature (at AMQP level)

Dans la section précédente, vous avez vu comment utiliser le jeton SAS avec une requête HTTP POST pour envoyer des données au Service Bus.In the previous section, you saw how to use the SAS token with an HTTP POST request for sending data to the Service Bus. Comme vous le savez, vous pouvez accéder au Service Bus à l’aide du protocole AMQP (Advanced Message Queuing Protocol) qui est le protocole privilégié pour des raisons de performances dans de nombreux scénarios.As you know, you can access Service Bus using the Advanced Message Queuing Protocol (AMQP) that is the preferred protocol to use for performance reasons, in many scenarios. L’utilisation de jetons SAP avec AMQP est décrite dans le document AMQP Claim-Based Security Version 1.0. Bien qu’au stade d’ébauche depuis 2013, elle est bien prise en charge par Azure aujourd’hui.The SAS token usage with AMQP is described in the document AMQP Claim-Based Security Version 1.0 that is in working draft since 2013 but well-supported by Azure today.

Avant de commencer à envoyer des données vers Service Bus, le serveur de publication doit envoyer le jeton SAP dans un message AMQP à un nœud AMQP bien défini nommé $cbs (il s’agit d’une sorte de file d’attente « spéciale » que le service utilise pour acquérir et valider tous les jetons SAP).Before starting to send data to Service Bus, the publisher must send the SAS token inside an AMQP message to a well-defined AMQP node named $cbs (you can see it as a "special" queue used by the service to acquire and validate all the SAS tokens). Le serveur de publication doit spécifier le champ ReplyTo dans le message AMQP. Il s’agit du nœud sur lequel le service répond au serveur de publication avec le résultat de la validation du jeton (système de demande/réponse simple entre le serveur de publication et le service).The publisher must specify the ReplyTo field inside the AMQP message; this is the node in which the service replies to the publisher with the result of the token validation (a simple request/reply pattern between publisher and service). Ce nœud de réponse est créé « à la volée » en ce qui concerne la « création dynamique du nœud à distance », comme le décrit la spécification AMQP 1.0. This reply node is created "on the fly," speaking about "dynamic creation of remote node" as described by the AMQP 1.0 specification. Après avoir vérifié que le jeton SAS est valide, le serveur de publication peut continuer et commencer à envoyer des données au service.After checking that the SAS token is valid, the publisher can go forward and start to send data to the service.

Les étapes suivantes montrent comment envoyer le jeton SAP avec à l’aide du protocole AMQP le AMQP.NET Lite bibliothèque.The following steps show how to send the SAS token with AMQP protocol using the AMQP.NET Lite library. Cela est utile si vous ne pouvez pas utiliser le développement du SDK de Bus de Service (par exemple sur WinRT, .NET Compact Framework, .NET Micro Framework et Mono) officielle en C#.This is useful if you can't use the official Service Bus SDK (for example on WinRT, .NET Compact Framework, .NET Micro Framework and Mono) developing in C#. Bien évidemment, cette bibliothèque est utile pour comprendre comment la sécurité basée sur les revendications fonctionne au niveau AMQP, tout comme vous avez pu voir comment cela fonctionne au niveau HTTP (avec une demande HTTP POST et le jeton SAP envoyé dans l’en-tête « Autorisation »).Of course, this library is useful to help understand how claims-based security works at the AMQP level, as you saw how it works at the HTTP level (with an HTTP POST request and the SAS token sent inside the "Authorization" header). Si vous n’avez pas besoin ces connaissances aussi approfondies concernant AMQP, vous pouvez utiliser le Kit de développement logiciel officiel Service Bus avec les applications .NET Framework qui seront en occuperont pour vous.If you don't need such deep knowledge about AMQP, you can use the official Service Bus SDK with .NET Framework applications, which will do it for you.

C#C#

/// <summary>
/// Send claim-based security (CBS) token
/// </summary>
/// <param name="shareAccessSignature">Shared access signature (token) to send</param>
private bool PutCbsToken(Connection connection, string sasToken)
{
    bool result = true;
    Session session = new Session(connection);

    string cbsClientAddress = "cbs-client-reply-to";
    var cbsSender = new SenderLink(session, "cbs-sender", "$cbs");
    var cbsReceiver = new ReceiverLink(session, cbsClientAddress, "$cbs");

    // construct the put-token message
    var request = new Message(sasToken);
    request.Properties = new Properties();
    request.Properties.MessageId = Guid.NewGuid().ToString();
    request.Properties.ReplyTo = cbsClientAddress;
    request.ApplicationProperties = new ApplicationProperties();
    request.ApplicationProperties["operation"] = "put-token";
    request.ApplicationProperties["type"] = "servicebus.windows.net:sastoken";
    request.ApplicationProperties["name"] = Fx.Format("amqp://{0}/{1}", sbNamespace, entity);
    cbsSender.Send(request);

    // receive the response
    var response = cbsReceiver.Receive();
    if (response == null || response.Properties == null || response.ApplicationProperties == null)
    {
        result = false;
    }
    else
    {
        int statusCode = (int)response.ApplicationProperties["status-code"];
        if (statusCode != (int)HttpStatusCode.Accepted && statusCode != (int)HttpStatusCode.OK)
        {
            result = false;
        }
    }

    // the sender/receiver may be kept open for refreshing tokens
    cbsSender.Close();
    cbsReceiver.Close();
    session.Close();

    return result;
}

La méthode PutCbsToken() reçoit la connexion (instance de classe de connexion AMQP telle que fournie par la bibliothèque AMQP .NET Lite) qui représente la connexion TCP au service et le paramètre sasToken correspondant au jeton SAP à envoyer.The PutCbsToken() method receives the connection (AMQP connection class instance as provided by the AMQP .NET Lite library) that represents the TCP connection to the service and the sasToken parameter that is the SAS token to send.

Notes

Il est important que la connexion soit créée avec le mécanisme d’authentification SASL défini sur ANONYMOUS (et non sur le paramètre par défaut PLAIN avec le nom d’utilisateur et le mot de passe utilisés lorsque vous n’avez pas besoin d’envoyer le jeton SAP).It's important that the connection is created with SASL authentication mechanism set to ANONYMOUS (and not the default PLAIN with username and password used when you don't need to send the SAS token).

Le serveur de publication crée ensuite deux liens AMQP pour envoyer le jeton SAP et recevoir la réponse (résultat de validation du jeton) depuis le service.Next, the publisher creates two AMQP links for sending the SAS token and receiving the reply (the token validation result) from the service.

Le message AMQP inclut un ensemble de propriétés et plus d’informations qu’un simple message.The AMQP message contains a set of properties, and more information than a simple message. Le jeton SAP est le corps du message (à l’aide de son constructeur).The SAS token is the body of the message (using its constructor). La propriété « ReplyTo » est définie sur le nom du nœud permettant de recevoir le résultat de validation sur le lien du récepteur (vous pouvez modifier son nom si vous le souhaitez, il sera créé dynamiquement par le service).The "ReplyTo" property is set to the node name for receiving the validation result on the receiver link (you can change its name if you want, and it will be created dynamically by the service). Les trois dernières propriétés personnalisées / application sont utilisées par le service pour indiquer le type d’opération à exécuter.The last three application/custom properties are used by the service to indicate what kind of operation it has to execute. Comme l’indique le projet de spécification CBS, il doit s’agir du nom de l’opération (« put-token »), du type de jeton (dans ce cas, servicebus.windows.net:sastoken) et du « nom » de l’audience à laquelle le jeton s’applique (entité entière).As described by the CBS draft specification, they must be the operation name ("put-token"), the type of token (in this case, a servicebus.windows.net:sastoken), and the "name" of the audience to which the token applies (the entire entity).

Après avoir envoyé le jeton SAP sur le lien de l’expéditeur, le serveur de publication doit lire la réponse sur le lien du récepteur.After sending the SAS token on the sender link, the publisher must read the reply on the receiver link. La réponse est un simple message AMQP avec une propriété d’application nommée « status-code » qui peut contenir les mêmes valeurs qu’un code d’état HTTP.The reply is a simple AMQP message with an application property named "status-code" that can contain the same values as an HTTP status code.

Droits requis pour les opérations Service BusRights required for Service Bus operations

Le tableau suivant affiche les droits d’accès requis pour effectuer diverses opérations sur les ressources Service Bus.The following table shows the access rights required for various operations on Service Bus resources.

OpérationOperation Revendication obligatoireClaim Required Étendue de la revendicationClaim Scope
Espace de nomsNamespace
Configure une règle d’autorisation dans un espace de nomsConfigure authorization rule on a namespace gérerManage N’importe quelle adresse d’espace de nomsAny namespace address
Registre de serviceService Registry
Énumération des stratégies privéesEnumerate Private Policies gérerManage N’importe quelle adresse d’espace de nomsAny namespace address
Commencer à écouter sur un espace de nomsBegin listening on a namespace ÉcouterListen N’importe quelle adresse d’espace de nomsAny namespace address
Envoyer des messages à un écouteur sur un espace de nomsSend messages to a listener at a namespace EnvoyerSend N’importe quelle adresse d’espace de nomsAny namespace address
File d'attenteQueue
Créer une file d’attenteCreate a queue gérerManage N’importe quelle adresse d’espace de nomsAny namespace address
Suppression d'une file d'attenteDelete a queue gérerManage N’importe quelle adresse de file d’attente valideAny valid queue address
Énumérer les files d’attenteEnumerate queues gérerManage /$Resources/Queues/$Resources/Queues
Obtenir la description de file d’attenteGet the queue description gérerManage N’importe quelle adresse de file d’attente valideAny valid queue address
Configure une règle d’autorisation pour une file d’attenteConfigure authorization rule for a queue gérerManage N’importe quelle adresse de file d’attente valideAny valid queue address
Envoyer dans la file d’attenteSend into to the queue EnvoyerSend N’importe quelle adresse de file d’attente valideAny valid queue address
Réception des messages d'une file d'attenteReceive messages from a queue ÉcouterListen N’importe quelle adresse de file d’attente valideAny valid queue address
Abandonner ou terminer des messages après la réception du message en mode de verrouillageAbandon or complete messages after receiving the message in peek-lock mode ÉcouterListen N’importe quelle adresse de file d’attente valideAny valid queue address
Différer un message pour une récupération ultérieureDefer a message for later retrieval ÉcouterListen N’importe quelle adresse de file d’attente valideAny valid queue address
Mettre un message au rebutDeadletter a message ÉcouterListen N’importe quelle adresse de file d’attente valideAny valid queue address
Obtenir l’état associé à une session de file d’attenteGet the state associated with a message queue session ÉcouterListen N’importe quelle adresse de file d’attente valideAny valid queue address
Obtenir l’état associé à une session de file d’attente de messageSet the state associated with a message queue session ÉcouterListen N’importe quelle adresse de file d’attente valideAny valid queue address
Planifiez un message pour une remise ultérieure ; par exemple, ScheduleMessageAsync()Schedule a message for later delivery; for example, ScheduleMessageAsync() ÉcouterListen N’importe quelle adresse de file d’attente valideAny valid queue address
RubriqueTopic
Création d'une rubriqueCreate a topic gérerManage N’importe quelle adresse d’espace de nomsAny namespace address
Supprimer une rubriqueDelete a topic gérerManage N’importe quelle adresse de rubrique valideAny valid topic address
Énumérer les rubriquesEnumerate topics gérerManage /$Resources/Topics/$Resources/Topics
Obtenir la description de la rubriqueGet the topic description gérerManage N’importe quelle adresse de rubrique valideAny valid topic address
Configure une règle d’autorisation pour une rubriqueConfigure authorization rule for a topic gérerManage N’importe quelle adresse de rubrique valideAny valid topic address
Envoyer à la rubriqueSend to the topic EnvoyerSend N’importe quelle adresse de rubrique valideAny valid topic address
AbonnementSubscription
Création d’un abonnementCreate a subscription gérerManage N’importe quelle adresse d’espace de nomsAny namespace address
Supprimer l’abonnementDelete subscription gérerManage ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Énumérer les abonnementsEnumerate subscriptions gérerManage ../myTopic/Subscriptions../myTopic/Subscriptions
Obtenir la description de l’abonnementGet subscription description gérerManage ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Abandonner ou terminer des messages après la réception du message en mode de verrouillageAbandon or complete messages after receiving the message in peek-lock mode ÉcouterListen ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Différer un message pour une récupération ultérieureDefer a message for later retrieval ÉcouterListen ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Mettre un message au rebutDeadletter a message ÉcouterListen ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Obtenir l’état associé à une session de rubriqueGet the state associated with a topic session ÉcouterListen ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Définir l’état associé à une session de rubriqueSet the state associated with a topic session ÉcouterListen ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
RèglesRules
Créer une règleCreate a rule gérerManage ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Supprimer une règleDelete a rule gérerManage ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Énumérer des règlesEnumerate rules Gérer ou écouterManage or Listen .. /myTopic/Subscriptions/mySubscription/Rules../myTopic/Subscriptions/mySubscription/Rules

Étapes suivantesNext steps

Pour en savoir plus sur la messagerie Service Bus, voir les rubriques suivantes.To learn more about Service Bus messaging, see the following topics.