Генерация подписи общего доступа служебной шины Azure

Я пытаюсь создать подпись общего доступа для очереди служебной шины Azure. Вот фрагмент кода, с помощью которого я генерирую токен SAS.

using System;
using System.Globalization;
using System.Security.Cryptography;
using System.Text;
using System.Web;

namespace SASTokenGeneration
{
    class Program
    {
        static void Main(string[] args)
        {
            string resourceUri = "sb://xxxservicequeue.servicebus.windows.net/;SharedAccessKeyName=xxxservicequeue;SharedAccessKey=xxxxxx";
            string key = "token";
            string keyName = "xxxservicequeue";
            try
            {
                TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
                var week = 60 * 60 * 24 * 7;
                var expiry = Convert.ToString((int)sinceEpoch.TotalSeconds + week);
                string stringToSign = HttpUtility.UrlEncode(resourceUri) + "\n" + expiry;
                HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key));
                var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
                var sasToken = String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
            HttpUtility.UrlEncode(resourceUri), HttpUtility.UrlEncode(signature), expiry, keyName);

            }
            catch (Exception ex)
            {

            }
        }
    }
}

Когда я использую этот токен в почтальоне, иногда он дает

MalformedToken: не удалось проанализировать простой веб-токен. лазурный автобус

и теперь я получаю

401 40103: недействительная подпись токена авторизации

Из-за ошибки я знаю, что делаю что-то не так со строкой подключения, но не могу понять, что. Не могли бы вы указать мне правильное направление? Спасибо


person Usman Javed    schedule 21.01.2019    source источник
comment
Вместо того, чтобы делиться снимком экрана с кодом, вставьте фактический код.   -  person Gaurav Mantri    schedule 21.01.2019


Ответы (1)


Проблемы могут быть найдены в

string resourceUri = "sb://xxxservicequeue.servicebus.windows.net/;SharedAccessKeyName=xxxservicequeue;SharedAccessKey=xxxxxx";
string key = "token";
string keyName = "xxxservicequeue";

ResourceUri - это полный URI ресурса служебной шины, к которому заявлен доступ, в формате sb://xxxservicequeue.servicebus.windows.net/ или с конкретным объектом, который вам нужен, как sb://xxxservicequeue.servicebus.windows.net/queueName.

Ключ должен иметь значение SharedAccessKeyKey, а keyName - это имя политики SAS, например RootManageSharedAccessKey по умолчанию.

Взгляните на doc для получения дополнительных сведений.

person Jerry Liu    schedule 25.01.2019
comment
Спасибо за быстрый ответ и очень извиняюсь за поздний ответ. Я был в ситуации. Я прочитал документ и сделал в точности так, как написано. Из общего кода выше я могу сгенерировать токен SAS, но когда я использую его в почтовом ящике, я все еще получаю 401 40103: ошибка - person Usman Javed; 30.01.2019
comment
@UsmanJaved Если вы исправили resourceUri и т. Д., Можете ли вы подтвердить, что созданная вами политика SAS имеет право делать то, что вы пробовали в почтальоне? например, имея только Listen право, мы не можем отправлять сообщения. - person Jerry Liu; 30.01.2019
comment
Да, я это тоже проверил, все права даны. - person Usman Javed; 30.01.2019
comment
@UsmanJaved Не могли бы вы уточнить, с каким API вы пытаетесь работать с SAS? Я также попробую посмотреть, смогу ли я предоставить рабочий образец. - person Jerry Liu; 30.01.2019
comment
Вы имеете в виду, что я должен отправить вам URI ресурса и токен SAS. - person Usman Javed; 30.01.2019
comment
@UsmanJaved Нет, просто скажите мне, какой rest api вы используете. например, вы пытаетесь отправить сообщение или что-то еще? - person Jerry Liu; 30.01.2019
comment
Да я пытаюсь отправить сообщение - person Usman Javed; 30.01.2019
comment
comment
@UsmanJaved Извините за задержку. Я следую руководству и вижу статус: 201 создан в почтальоне. Не очень практично, но я предлагаю вам создать новую политику, чтобы попробовать. Если вы хотите получить SAS только для использования в SDK, вам, вероятно, не нужно бороться с тестом API в почтальоне, мы могли бы просто обратиться к SDK за помощью. - person Jerry Liu; 30.01.2019
comment
Благодарю за ваш ответ. У меня есть ситуация, когда мне нужно отправить и восстановить сообщение в клиенте jquery, поэтому мне нужен API. - person Usman Javed; 30.01.2019