Control de acceso de Service Bus con Firmas de acceso compartidoService Bus access control with Shared Access Signatures

Las firmas de acceso compartido (SAS) son el mecanismo de seguridad principal de la mensajería de Service Bus.Shared Access Signatures (SAS) are the primary security mechanism for Service Bus messaging. En este artículo se tratan las firmas acceso compartido, cómo funcionan y cómo usarlas independientemente de la plataforma.This article discusses SAS, how they work, and how to use them in a platform-agnostic way.

SAS protege el acceso a Service Bus en función de las reglas de autorización.SAS guards access to Service Bus based on authorization rules. Estas se configuran en función de un espacio de nombres o una entidad de mensajería (retransmisión, cola o tema).Those are configured either on a namespace, or a messaging entity (relay, queue, or topic). Una regla de autorización tiene un nombre, se asocia con unos derechos específicos e incluye un par de claves criptográficas.An authorization rule has a name, is associated with specific rights, and carries a pair of cryptographic keys. Para generar un token de SAS, debe usar el nombre y la clave de la regla a través del SDK de Service Bus o en su propio código.You use the rule's name and key via the Service Bus SDK or in your own code to generate a SAS token. A continuación, el cliente puede pasar el token a Service Bus para demostrar la autorización para la operación solicitada.A client can then pass the token to Service Bus to prove authorization for the requested operation.

Nota

Azure Service Bus admite la autorización de acceso a un espacio de nombres de Service Bus y sus entidades mediante Azure Active Directory (Azure AD).Azure Service Bus supports authorizing access to a Service Bus namespace and its entities using Azure Active Directory (Azure AD). La autorización de usuarios o aplicaciones mediante un token de OAuth 2.0 devuelto por Azure AD proporciona una seguridad superior y facilidad de uso sobre las firmas de acceso compartido (SAS).Authorizing users or applications using OAuth 2.0 token returned by Azure AD provides superior security and ease of use over shared access signatures (SAS). Con Azure AD, no hay ninguna necesidad de almacenar los tokens en su código y arriesgarse a posibles vulnerabilidades de seguridad.With Azure AD, there is no need to store the tokens in your code and risk potential security vulnerabilities.

Microsoft recomienda usar Azure AD con las aplicaciones de Azure Service Bus cuando sea posible.Microsoft recommends using Azure AD with your Azure Service Bus applications when possible. Para más información, consulte los siguientes artículos.For more information, see the following articles:

Información general de SASOverview of SAS

Las Firmas de acceso compartido son un mecanismo de autorización basada en notificaciones que utilizan tokens simples.Shared Access Signatures are a claims-based authorization mechanism using simple tokens. Si utiliza SAS, las claves nunca se pasan en la conexión.Using SAS, keys are never passed on the wire. Las claves se utilizan para firmar criptográficamente información que más adelante pueda verificar el servicio.Keys are used to cryptographically sign information that can later be verified by the service. El uso de SAS es similar a un esquema de nombre de usuario y contraseña donde el cliente está en posesión inmediata de un nombre de regla de autorización y una clave coincidente.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. SAS también puede utilizarse de forma similar a un modelo de seguridad federado, donde el cliente recibe un token de acceso firmado y de tiempo limitado de un servicio de token de seguridad sin poseer en ningún momento la clave de firma.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.

La autenticación de SAS en Service Bus se configura con reglas de autorización de acceso compartido con nombre que tienen derechos de acceso asociados y algunas claves criptográficas principales y secundarias.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. Las claves son valores de 256 bits en representación de Base64.The keys are 256-bit values in Base64 representation. Puede configurar reglas en el nivel de espacio de nombres, en retransmisiones, colas y temas de Service Bus.You can configure rules at the namespace level, on Service Bus relays, queues, and topics.

El token Firma de acceso compartido contiene el nombre de la regla de autorización elegida, el URI del recurso al que se debe acceder, un instante de expiración y una firma criptográfica de HMAC-SHA256 calculada sobre estos campos utilizando la clave criptográfica principal o secundaria de la regla de autorización elegida.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.

Directivas de autorización de acceso compartidoShared Access Authorization Policies

Cada espacio de nombres de Service Bus y cada entidad de Service Bus tiene una directiva de autorización de acceso compartido compuesta por reglas.Each Service Bus namespace and each Service Bus entity has a Shared Access Authorization policy made up of rules. La directiva a nivel de espacio de nombres se aplica a todas las entidades del espacio de nombres, independientemente de su configuración de directiva individual.The policy at the namespace level applies to all entities inside the namespace, irrespective of their individual policy configuration.

Para cada regla de directiva de autorización, decida tres tipos de información: nombre, ámbito y derechos.For each authorization policy rule, you decide on three pieces of information: name, scope, and rights. El nombre es solo eso; un nombre único dentro de ese ámbito.The name is just that; a unique name within that scope. El ámbito es bastante sencillo: es el URI del recurso en cuestión.The scope is easy enough: it's the URI of the resource in question. Para un espacio de nombres de Service Bus, el ámbito es el nombre de dominio completo (FQDN), como 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/.

Los derechos otorgados por la regla de directiva pueden ser una combinación de:The rights conferred by the policy rule can be a combination of:

  • "Enviar": otorga el derecho a enviar mensajes a la entidad.'Send' - Confers the right to send messages to the entity
  • "Escuchar": otorga el derecho a escuchar (retransmisión) o a recibir (cola, suscripciones) y a administrar todos los mensajes relacionados.'Listen' - Confers the right to listen (relay) or receive (queue, subscriptions) and all related message handling
  • "Administrar": otorga el derecho a administrar la topología del espacio de nombres, incluidas la creación y la eliminación de entidades.'Manage' - Confers the right to manage the topology of the namespace, including creating and deleting entities

El derecho "Administrar" incluye los derechos "Enviar" y "Recibir".The 'Manage' right includes the 'Send' and 'Receive' rights.

Una directiva de espacio de nombres o entidad puede contener hasta 12 reglas de autorización de acceso compartido, lo que proporciona espacio para tres conjuntos de reglas, y cada una de ellas cubre los derechos básicos y la combinación de "Enviar" y "Escuchar".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. Este límite subraya que el almacén de directivas de SAS no pretende ser un almacén de la cuenta de usuario o servicio.This limit underlines that the SAS policy store is not intended to be a user or service account store. Si la aplicación necesita conceder acceso a Service Bus en función de las identidades de usuario o servicio, debe implementar un servicio de token de seguridad que emita tokens de SAS después de una comprobación de acceso y autenticación.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.

A la regla de autorización se le asigna una clave principal y una clave secundaria.An authorization rule is assigned a Primary Key and a Secondary Key. Son claves de alta seguridad criptográfica.These are cryptographically strong keys. No las pierda ni las revele; siempre estarán disponibles en Azure Portal.Don't lose them or leak them - they'll always be available in the Azure portal. Puede usar cualquiera de las claves generadas y regenerarlas en cualquier momento.You can use either of the generated keys, and you can regenerate them at any time. Si vuelve a generar o cambia una clave en la directiva, todos los tokens emitidos previamente en base a esa clave dejan de ser válidos inmediatamente.If you regenerate or change a key in the policy, all previously issued tokens based on that key become instantly invalid. Sin embargo, las conexiones continuas creadas de acuerdo con esos tokens seguirán funcionando hasta que el token expire.However, ongoing connections created based on such tokens will continue to work until the token expires.

Cuando se crea un espacio de nombres de Service Bus, se crea automáticamente una regla de directiva denominada RootManageSharedAccessKey para el espacio de nombres.When you create a Service Bus namespace, a policy rule named RootManageSharedAccessKey is automatically created for the namespace. Esta directiva tiene permisos de administración para todo el espacio de nombres.This policy has Manage permissions for the entire namespace. Se recomienda tratar esta regla como una cuenta raíz administrativa, así que no la use en la aplicación.It's recommended that you treat this rule like an administrative root account and don't use it in your application. Puede crear reglas de directivas adicionales en la pestaña Configurar para el espacio de nombres en el portal, a través de PowerShell o la CLI de Azure.You can create additional policy rules in the Configure tab for the namespace in the portal, via PowerShell or Azure CLI.

Configuración de la autenticación de firma de acceso compartidoConfiguration for Shared Access Signature authentication

Puede configurar la regla SharedAccessAuthorizationRule en los espacios de nombres, las colas o los temas de Service Bus.You can configure the SharedAccessAuthorizationRule rule on Service Bus namespaces, queues, or topics. La configuración de una regla SharedAccessAuthorizationRule en una suscripción de Service Bus no se admite, pero puede usar las reglas configuradas en un espacio de nombres o un tema para asegurar el acceso a las suscripciones.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. Para ver un ejemplo funcional que ilustra este procedimiento, consulte el ejemplo Uso de la autenticación de firma de acceso compartido (SAS) con suscripciones de Service Bus .For a working sample that illustrates this procedure, see the Using Shared Access Signature (SAS) authentication with Service Bus Subscriptions sample.

SAS

En esta ilustración, las reglas de autorización manageRuleNS, sendRuleNS y listenRuleNS se aplican tanto a la cola Q1 como al tema T1, mientras que listenRuleQ y sendRuleQ se aplican solo a la cola Q1 y sendRuleT solo al tema 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.

Generación de un token de Firmas de acceso compartidoGenerate a Shared Access Signature token

Cualquier cliente que tenga acceso al nombre de una regla de autorización y una de sus claves de firma puede generar un token de SAS.Any client that has access to name of an authorization rule name and one of its signing keys can generate a SAS token. El token se genera diseñando una cadena con el siguiente formato: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 : instante de expiración del token.se - Token expiry instant. Entero que refleja los segundos transcurridos desde la época 00:00:00 UTC del 1 de enero de 1970 (época de UNIX) cuando expira el token.Integer reflecting seconds since the epoch 00:00:00 UTC on 1 January 1970 (UNIX epoch) when the token expires.
  • skn : nombre de la regla de autorización.skn - Name of the authorization rule.
  • sr : URI del recurso al que se accede.sr - URI of the resource being accessed.
  • sig : firma.sig - Signature.

El valor de signature-string es el hash SHA-256 calculado sobre el URI del recurso (ámbito tal y como se describe en la sección anterior) y la representación de cadenas del instante de expiración del token, separados por LF.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 LF.

El cálculo del hash es similar al siguiente pseudocódigo y devuelve un valor de hash de 256 bits/32 bytes.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)

El token contiene los valores sin el hash para que el destinatario pueda volver a calcular el hash con los mismos parámetros y verificar que el emisor posee una clave de firma válida.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.

El URI de recurso es el URI completo del recurso de Service Bus al que se solicita el acceso.The resource URI is the full URI of the Service Bus resource to which access is claimed. Por ejemplo, http://<namespace>.servicebus.windows.net/<entityPath> o sb://<namespace>.servicebus.windows.net/<entityPath>; es decir, 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.

El URI debe estar codificado por porcentaje.The URI must be percent-encoded.

La regla de autorización de acceso compartido usada para firmar debe configurarse en la entidad especificada por este URI, o uno de sus primarios jerárquicos.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. Por ejemplo, http://contoso.servicebus.windows.net/contosoTopics/T1 o http://contoso.servicebus.windows.net en el ejemplo anterior.For example, http://contoso.servicebus.windows.net/contosoTopics/T1 or http://contoso.servicebus.windows.net in the previous example.

Un token SAS es válido para todos los recursos con el prefijo <resourceURI> que se usen en signature-string.A SAS token is valid for all resources prefixed with the <resourceURI> used in the signature-string.

Nota

Para obtener ejemplos de cómo generar un token de SAS con distintos lenguajes de programación, consulte Generación de un token de SAS.For examples of generating a SAS token using different programming languages, see Generate SAS token.

Regeneración de clavesRegenerating keys

Se recomienda regenerar periódicamente las claves usadas en el objeto SharedAccessAuthorizationRule .It is recommended that you periodically regenerate the keys used in the SharedAccessAuthorizationRule object. Las ranuras de las claves principales y secundarias existen para que pueda girar las claves de forma gradual.The primary and secondary key slots exist so that you can rotate keys gradually. Si la aplicación suele utilizar la clave principal, puede copiarla en la ranura de la clave secundaria y, a continuación, volver a generar la clave principal.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. Entonces podrá configurar el nuevo valor de la clave principal en las aplicaciones cliente, las cuales tienen acceso continuo mediante la clave principal antigua en la ranura secundaria.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. Una vez que se actualicen todos los clientes, puede volver a generar la clave secundaria para finalmente eliminar la clave principal antigua.Once all clients are updated, you can regenerate the secondary key to finally retire the old primary key.

Si está seguro o sospecha que una clave está en peligro y debe revocar las claves, puede volver a generar los valores de PrimaryKey y SecondaryKey de un objeto SharedAccessAuthorizationRule y reemplazarlos por las nuevas claves.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. Este procedimiento invalida todos los tokens firmados con las claves antiguas.This procedure invalidates all tokens signed with the old keys.

Autenticación con Firma de acceso compartido en Service BusShared Access Signature authentication with Service Bus

Los escenarios descritos a continuación incluyen la configuración de reglas de autorización, la generación de tokens SAS y la autorización del cliente.The scenarios described as follows include configuration of authorization rules, generation of SAS tokens, and client authorization.

Para un ejemplo funcional completo de una aplicación del Bus de servicio que ilustra la configuración y usa la autorización SAS, consulte Autenticación con firma de acceso compartido en 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. Hay un ejemplo relacionado que ilustra el uso de reglas de autorización SAS configuradas en espacios de nombres o temas para proteger las suscripciones de Service Bus disponible aquí: Uso de la autenticación de firma de acceso compartido (SAS) con suscripciones de 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.

Acceso a las reglas de autorización de acceso compartido en una entidadAccess Shared Access Authorization rules on an entity

Gracias a las bibliotecas de .NET Framework de Service Bus, puede acceder a un objeto Microsoft.ServiceBus.Messaging.SharedAccessAuthorizationRule configurado en una cola o un tema de Service Bus mediante la colección AuthorizationRules en los objetos QueueDescription o TopicDescription correspondientes.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.

El código siguiente muestra cómo agregar reglas de autorización para una cola.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);

Uso de la autorización de la firma de acceso compartidoUse Shared Access Signature authorization

Las aplicaciones que usan el SDK de .NET de Azure con las bibliotecas .NET de Service Bus pueden usar la autorización SAS mediante la clase SharedAccessSignatureTokenProvider .Applications using the Azure .NET SDK with the Service Bus .NET libraries can use SAS authorization through the SharedAccessSignatureTokenProvider class. El código siguiente muestra el uso del proveedor de token para enviar mensajes a una cola de Service Bus.The following code illustrates the use of the token provider to send messages to a Service Bus queue. Como alternativa al uso que se muestra aquí, también puede pasar un token emitido anteriormente al patrón de diseño Factory Method del proveedor de tokens.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);

También puede utilizar el proveedor de tokens directamente para emitir tokens para que se pasen a otros clientes.You can also use the token provider directly for issuing tokens to pass to other clients.

Las cadenas de conexión pueden incluir un nombre de regla (SharedAccessKeyName) y una clave de regla (SharedAccessKey) o un token emitido anteriormente (SharedAccessSignature).Connection strings can include a rule name (SharedAccessKeyName) and rule key (SharedAccessKey) or a previously issued token (SharedAccessSignature). Cuando existen en la cadena de conexión que se pasó a algún método de constructor o fabricante que acepte una cadena de conexión, el proveedor de tokens de SAS se crea y rellena automáticamente.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.

Tenga en cuenta que para usar la autorización SAS con retransmisiones de Service Bus, puede usar claves SAS configuradas en el espacio de nombres de Service Bus.Note that to use SAS authorization with Service Bus relays, you can use SAS keys configured on the Service Bus namespace. Si crea explícitamente una retransmisión en el espacio de nombres NamespaceManager con un objeto RelayDescription, puede establecer las reglas SAS para dicha retransmisión.If you explicitly create a relay on the namespace (NamespaceManager with a RelayDescription) object, you can set the SAS rules just for that relay. Para usar la autorización SAS con suscripciones de Service Bus, puede usar claves SAS configuradas en un espacio de nombres de Service Bus o en un tema.To use SAS authorization with Service Bus subscriptions, you can use SAS keys configured on a Service Bus namespace or on a topic.

Uso de la firma de acceso compartido (en el nivel HTTP)Use the Shared Access Signature (at HTTP level)

Ahora que sabe cómo crear firmas de acceso compartido para cualquier entidad de Service Bus, estará listo para llevar a cabo una solicitud 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

Recuerde que esto funciona para todo.Remember, this works for everything. Puede crear SAS para una cola, un tema o una suscripción.You can create SAS for a queue, topic, or subscription.

Si le da un token de SAS a un remitente o cliente, no tiene la clave directamente y no pueden invertir el hash para obtenerla.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. Como tal, tiene control sobre a lo que pueden tener acceso y durante cuánto tiempo.As such, you have control over what they can access, and for how long. Algo importante de recordar es que si cambia la clave principal de la directiva, se invalidará cualquier Firma de acceso compartido creada a partir de ella.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.

Uso de la firma de acceso compartido (en el nivel AMQP)Use the Shared Access Signature (at AMQP level)

En la sección anterior, vimos cómo usar el token SAS con una solicitud HTTP POST para enviar datos a 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. Como sabe, puede obtener acceso a Service Bus mediante Advanced Message Queuing Protocol (AMQP), que es el protocolo preferido por motivos de rendimiento en muchos escenarios.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. El uso de tokens SAS con AMQP se describe en el documento Seguridad basada en notificaciones de AMQP, versión 1.0 que está en fase de borrador desde 2013, pero que es compatible con Azure actualmente.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 it's supported by Azure today.

Antes de comenzar a enviar datos a Service Bus, el publicador debe enviar el token de SAS de un mensaje de AMQP a un nodo de AMQP bien definido con el nombre $cbs (puede verlo como una cola especial usada por el servicio para adquirir y validar todos los tokens de SAS).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). El publicador debe especificar el campo ReplyTo en el mensaje de AMQP. Este es el nodo en el que el servicio contestará al publicador con el resultado de la validación del token (un patrón sencillo de solicitud/respuesta entre el publicador y el servicio).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). Este nodo de respuesta se crea "sobre la marcha" en lo que respecta a la "creación dinámica de nodo remoto", tal como describe la especificación de 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. Después de comprobar que el token SAS es válido, el publicador puede avanzar y comenzar a enviar datos al servicio.After checking that the SAS token is valid, the publisher can go forward and start to send data to the service.

Los pasos siguientes muestran cómo enviar el token de SAS con protocolo AMQP mediante la biblioteca AMQP.NET Lite.The following steps show how to send the SAS token with AMQP protocol using the AMQP.NET Lite library. Esto es útil si no puede usar el SDK oficial de Service Bus (por ejemplo, en WinRT, .NET Compact Framework, .NET Micro Framework y Mono) al desarrollar 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#. Por supuesto, esta biblioteca es útil para comprender cómo funciona la seguridad basada en notificaciones en el nivel AMQP, como pudo observar en el nivel HTTP (con una solicitud HTTP POST y el token de SAS enviado en el encabezado "Autorización").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 no necesita un conocimiento tan profundo sobre AMQP, puede usar el SDK oficial de Service Bus con aplicaciones de .NET Framework, que lo hará por usted.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;
}

El método PutCbsToken() recibe la conexión (instancia de clase de conexión de AMQP, proporcionada por la biblioteca .NET Lite de AMQP) que representa la conexión TCP al servicio y el parámetro sasToken que es el token de SAS que se va a enviar.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.

Nota

Es importante que la conexión se cree con el mecanismo de autenticación SASL establecido en ANONYMOUS (y no con el valor PLAIN predeterminado con el nombre de usuario y la contraseña usados cuando no tiene que enviar el token de SAS).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).

A continuación, el publicador crea dos vínculos de AMQP para el envío del token de SAS y la recepción de la respuesta (resultado de validación del token) del servicio.Next, the publisher creates two AMQP links for sending the SAS token and receiving the reply (the token validation result) from the service.

El mensaje de AMQP contiene una serie de propiedades y más información que un mensaje simple.The AMQP message contains a set of properties, and more information than a simple message. El token de SAS es el cuerpo del mensaje (mediante su constructor).The SAS token is the body of the message (using its constructor). La propiedad "ReplyTo" se establece en el nombre del nodo para recibir el resultado de la validación en el vínculo del receptor (puede cambiar su nombre si lo desea y el servicio lo creará dinámicamente).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). El servicio usa las últimas tres propiedades personalizadas/de aplicación para indicar qué tipo de operación tiene que ejecutar.The last three application/custom properties are used by the service to indicate what kind of operation it has to execute. Como describe la especificación del borrador de CBS, deben ser el nombre de la operación ("put-token"), el tipo de token (en este caso, servicebus.windows.net:sastoken) y el "nombre" de la audiencia a la que se aplica el token (toda la entidad).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).

Después de enviar el token de SAS en el vínculo del remitente, el publicador debe leer la respuesta en el vínculo del receptor.After sending the SAS token on the sender link, the publisher must read the reply on the receiver link. La respuesta es un mensaje de AMQP simple con una propiedad de la aplicación denominada "status-code" que puede contener los mismos valores que un código de estado 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.

Derechos necesarios para realizar operaciones de Service BusRights required for Service Bus operations

La siguiente tabla muestra los derechos de acceso necesarios para realizar diversas operaciones en recursos de Service Bus.The following table shows the access rights required for various operations on Service Bus resources.

OperaciónOperation Solicitud necesariaClaim Required Ámbito de solicitudClaim Scope
Espacio de nombresNamespace
Configurar la regla de autorización en un espacio de nombresConfigure authorization rule on a namespace AdministraciónManage Cualquier dirección de espacio de nombresAny namespace address
Registro del servicioService Registry
Enumerar directivas privadasEnumerate Private Policies AdministraciónManage Cualquier dirección de espacio de nombresAny namespace address
Empezar a escuchar en un espacio de nombresBegin listening on a namespace EscucharListen Cualquier dirección de espacio de nombresAny namespace address
Enviar mensajes a un agente de escucha en un espacio de nombresSend messages to a listener at a namespace EnvíoSend Cualquier dirección de espacio de nombresAny namespace address
ColaQueue
Creación de una colaCreate a queue AdministraciónManage Cualquier dirección de espacio de nombresAny namespace address
Eliminación de una colaDelete a queue AdministraciónManage Cualquier dirección de cola válidaAny valid queue address
Enumerar colasEnumerate queues AdministraciónManage /$Resources/Queues/$Resources/Queues
Obtener la descripción de la colaGet the queue description AdministraciónManage Cualquier dirección de cola válidaAny valid queue address
Configurar la regla de autorización para una colaConfigure authorization rule for a queue AdministraciónManage Cualquier dirección de cola válidaAny valid queue address
Enviar a la colaSend into to the queue EnvíoSend Cualquier dirección de cola válidaAny valid queue address
mensajes de una colaReceive messages from a queue EscucharListen Cualquier dirección de cola válidaAny valid queue address
Abandone o complete los mensajes después de recibir el mensaje en el modo de bloqueo de informaciónAbandon or complete messages after receiving the message in peek-lock mode EscucharListen Cualquier dirección de cola válidaAny valid queue address
Aplazar un mensaje para su recuperación posteriorDefer a message for later retrieval EscucharListen Cualquier dirección de cola válidaAny valid queue address
Mensaje fallidoDeadletter a message EscucharListen Cualquier dirección de cola válidaAny valid queue address
Obtener el estado asociado a una sesión de cola de mensajesGet the state associated with a message queue session EscucharListen Cualquier dirección de cola válidaAny valid queue address
Establecer el estado asociado a una sesión de cola de mensajesSet the state associated with a message queue session EscucharListen Cualquier dirección de cola válidaAny valid queue address
Programe un mensaje para entregarlo más tarde; por ejemplo, ScheduleMessageAsync()Schedule a message for later delivery; for example, ScheduleMessageAsync() EscucharListen Cualquier dirección de cola válidaAny valid queue address
Tema.Topic
de un temaCreate a topic AdministraciónManage Cualquier dirección de espacio de nombresAny namespace address
Eliminación de un temaDelete a topic AdministraciónManage Cualquier dirección de tema válidaAny valid topic address
Enumerar temasEnumerate topics AdministraciónManage /$Resources/Topics/$Resources/Topics
Obtener la descripción del temaGet the topic description AdministraciónManage Cualquier dirección de tema válidaAny valid topic address
Configurar la regla de autorización para un temaConfigure authorization rule for a topic AdministraciónManage Cualquier dirección de tema válidaAny valid topic address
Enviar al temaSend to the topic EnvíoSend Cualquier dirección de tema válidaAny valid topic address
SuscripciónSubscription
una suscripciónCreate a subscription AdministraciónManage Cualquier dirección de espacio de nombresAny namespace address
Eliminar suscripciónDelete subscription AdministraciónManage ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Enumerar suscripcionesEnumerate subscriptions AdministraciónManage ../myTopic/Subscriptions../myTopic/Subscriptions
Obtener la descripción de la suscripciónGet subscription description AdministraciónManage ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Abandone o complete los mensajes después de recibir el mensaje en el modo de bloqueo de informaciónAbandon or complete messages after receiving the message in peek-lock mode EscucharListen ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Aplazar un mensaje para su recuperación posteriorDefer a message for later retrieval EscucharListen ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Mensaje fallidoDeadletter a message EscucharListen ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Obtener el estado asociado a una sesión de temaGet the state associated with a topic session EscucharListen ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Establecer el estado asociado a una sesión de temaSet the state associated with a topic session EscucharListen ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
ReglasRules
Crear una reglaCreate a rule AdministraciónManage ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Eliminar una reglaDelete a rule AdministraciónManage ../myTopic/Subscriptions/mySubscription../myTopic/Subscriptions/mySubscription
Enumerar reglasEnumerate rules Administrar o escucharManage or Listen ../myTopic/Subscriptions/mySubscription/Rules../myTopic/Subscriptions/mySubscription/Rules

Pasos siguientesNext steps

Para obtener más información sobre la mensajería de Service Bus, consulte los siguientes temas:To learn more about Service Bus messaging, see the following topics.