Использование токена SAS с Azure ServiceBus - PullRequest
0 голосов
/ 18 февраля 2020

Я использую новый Azure ServiceBus SDK, который является NET Standard 2.0, и мне трудно использовать SAS Token. Раньше это был MessagingFactory, но в новом SDK его там нет. ServiceBusConnectionStringBuilder имеет токен SAS, но также ожидает connectionString.

По сути, я хочу отправлять и получать, используя политику SAS (правило отправки для отправки и правило получения для получения) и токен SAS, созданный из строки подключения этих политик.

Я могу сгенерировать токен SAS, но не могу найти способ создания QueueClient с использованием этого токена.

1 Ответ

2 голосов
/ 18 февраля 2020

В итоге я использовал следующее переопределение ServiceBusConnectionStringBuilder, в котором используется подпись SharedAccess:

public ServiceBusConnectionStringBuilder (string endpoint, string entityPath, string sharedAccessSignature);

Исходя из этого, вот код, который я написал. Сначала генерируется токен SAS с использованием RootManagedAccessKey, действительный в течение часа, а затем этот токен используется для отправки сообщения в очередь.

using System;
using System.Text;
using Microsoft.Azure.ServiceBus;
using Microsoft.Azure.ServiceBus.Primitives;

namespace SO60273377
{
    class Program
    {
        static void Main(string[] args)
        {
            var endpoint = "sb://<namespace>.servicebus.windows.net/";
            var queueName = "test";
            var keyName = "RootManageSharedAccessKey";
            var keyValue = "<key>";
            var validityDuration = TimeSpan.FromHours(1);

            TokenScope tokenScope = TokenScope.Entity;

            var provider = (SharedAccessSignatureTokenProvider) TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, keyValue, validityDuration, tokenScope);

            var token = provider.GetTokenAsync(endpoint+queueName, validityDuration).GetAwaiter().GetResult();
            var sasToken = token.TokenValue;
            Console.WriteLine("SAS Token: " + sasToken);
            var serviceBusConnectionStringBuilder = new ServiceBusConnectionStringBuilder(endpoint, queueName, sasToken);
            QueueClient client = new QueueClient(serviceBusConnectionStringBuilder, ReceiveMode.PeekLock);
            client.SendAsync(new Message(Encoding.UTF8.GetBytes("This is a test"))).GetAwaiter().GetResult();


            Console.WriteLine("Press any key to continue");
            Console.ReadLine();
        }
    }
}
...