Azure Сервисная шина Restful Api Get - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь создать доступ Azure API Resftul служебной шины с помощью SAS. Насколько я понимаю, мне нужно сгенерировать заголовок authorization примерно со следующим: -

SharedAccessSignature sig=<sig>&
se=<epochexpirydate>&skn=RootManageSharedAccessKey&
sr=<urlToQueue>

Используя почтальон, я пытаюсь запустить запрос на https://service-bus-namespace.servicebus.windows.net/queuename

Я генерирую подпись моего SAS с использованием URL-адреса из sr & \n & epoch-time, зашифрованного до SHA256 с использованием онлайн-генератора sha256.

Однако я всегда получаю 401 SubCode: 40103 Недействительная подпись токена авторизации. Надеюсь, что кто-то может мне помочь, чтобы я мог получать сообщения из очереди.

пример:

SharedAccessSignature sig=ab5c0a1b42b96af5ef9cbc85c7088651e9ebf8785d1eeffe6c4955be2c70ca2b&se=7270650090&skn=MyAccessKey&sr=https%3A%2F%2Fnamespace.servicebus.windows.net%2Fqueuename

1 Ответ

0 голосов
/ 26 мая 2020

Согласно ошибке 401 означает, что токен недействителен.

Используйте приведенный ниже код, чтобы сгенерировать правильный токен SAS, а затем передать сгенерированный токен в Авторизация Заголовок:

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

namespace App1
{
    class Program
    {
        static readonly string queueUrl = "TODO"; // Format: "https://<service bus namespace>.servicebus.windows.net/<queue name>";
        static readonly string signatureKeyName = "TODO";
        static readonly string signatureKey = "TODO";
        static readonly TimeSpan timeToLive = TimeSpan.FromDays(1);
        static void Main(string[] args)
        {
            var token = GetSasToken(queueUrl, signatureKeyName, signatureKey, timeToLive);
            Console.WriteLine("Authorization: " + token);
            Console.WriteLine("Press any key to exit.");
            Console.ReadLine();
        }
        public static string GetSasToken(string resourceUri, string keyName, string key, TimeSpan ttl)
        {
            var expiry = GetExpiry(ttl);
            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);
            return sasToken;
        }

        private static string GetExpiry(TimeSpan ttl)
        {
            TimeSpan expirySinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1) + ttl;
            return Convert.ToString((int)expirySinceEpoch.TotalSeconds);
        }
    }
}
...