Как создать политику SAS в служебной шине Azure с помощью строки подключения политики общего доступа

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

Я могу создать его с помощью пакета Microsoft.Azure.Management.ServiceBus NuGet следующим образом.

private static async Task<string> GetToken()
    {
        try
        {
            // Check to see if the token has expired before requesting one.
            // We will go ahead and request a new one if we are within 2 minutes of the token expiring.
            if (tokenExpiresAtUtc < DateTime.UtcNow.AddMinutes(-2))
            {
                Console.WriteLine("Renewing token...");

                var tenantId = appOptions.TenantId;
                var clientId = appOptions.ClientId;
                var clientSecret = appOptions.ClientSecret;

                var context = new AuthenticationContext($"https://login.microsoftonline.com/{tenantId}");

                var result = await context.AcquireTokenAsync(
                    "https://management.core.windows.net/",
                    new ClientCredential(clientId, clientSecret)
                );

                // If the token isn't a valid string, throw an error.
                if (string.IsNullOrEmpty(result.AccessToken))
                {
                    throw new Exception("Token result is empty!");
                }

                tokenExpiresAtUtc = result.ExpiresOn.UtcDateTime;
                tokenValue = result.AccessToken;
                Console.WriteLine("Token renewed successfully.");
            }

            return tokenValue;
        }
        catch (Exception e)
        {
            Console.WriteLine("Could not get a new token...");
            Console.WriteLine(e.Message);
            throw e;
        }
    }
private static async Task CreateSASPolicy()
    {
        try
        {
            if (string.IsNullOrEmpty(namespaceName))
            {
                throw new Exception("Namespace name is empty!");
            }

            var token = await GetToken();

            var creds = new TokenCredentials(token);
            var sbClient = new ServiceBusManagementClient(creds)
            {
                SubscriptionId = appOptions.SubscriptionId,
            };

            List<AccessRights?> list = new List<AccessRights?> { AccessRights.Send };
            var AuthRule = new SBAuthorizationRule { Rights = list };
            var authorizationRuleName = "SendRule"; //policy name
              
            Console.WriteLine("Creating SAS policy...");
            var result = sbClient.Namespaces.CreateOrUpdateAuthorizationRuleAsync(resourceGroupName, namespaceName, authorizationRuleName, AuthRule).Result;
            Console.WriteLine("Created SAS policy successfully.");
        }
        catch (Exception e)
        {
            Console.WriteLine("Could not create a SAS policy...");
            Console.WriteLine(e.Message);
            throw e;
        }
    }

Но для приведенного выше кода мне нужно предоставить хотя бы «Владелец данных служебной шины Azure» приложению, которое мы используем для создания токена.

Я также пытался использовать http-клиент следующим образом

using (HttpClient httpclient = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }))
        {
            httpclient.DefaultRequestHeaders.Accept.Add(
                new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

            httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                Convert.ToBase64String(
                    System.Text.ASCIIEncoding.ASCII.GetBytes(
                        string.Format("{0}:{1}", "", accessToken))));

            string baseAddress = @"https://management.core.windows.net/<subscriptionId>/services/ServiceBus/namespaces/<namespace>/AuthorizationRules/";

            var sendRule = new SharedAccessAuthorizationRule("contosoSendAll",
                new[] { AccessRights.Send });
            
            var result = await httpclient.GetAsync(baseAddress).ConfigureAwait(false);
            if (result.IsSuccessStatusCode)
            {
                var response = await result.Content.ReadAsStringAsync().ConfigureAwait(false);
              
            }
        }

Он возвращает 403 (запрещено).

Вопрос :-

  • Есть ли способ создать политику SAS, не предоставляя приложению разрешение «Владелец данных служебной шины Azure»? Как?
  • Можно ли создать политику SAS, используя строку подключения политики общего доступа? Как?
  • Можно ли создать политику SAS, используя текущие учетные данные пользователя? Как?

Не могли бы вы подробно описать Q3?

Jim Xu 22.12.2020 07:33

@JimXu О Q3. В моем приложении мы используем AAD SSO для входа в систему. В лазурной служебной шине пользователь входа в систему имеет право управлять служебной шиной. Итак, мой вопрос: могу ли я использовать учетные данные пользователя для входа в систему для создания токена и, используя этот токен, могу ли я создать политику SAS на уровне пространства имен?

Harish 22.12.2020 07:43

По этой проблеме обратитесь к learn.microsoft.com/en-us/azure/active-directory/develop/…

Jim Xu 22.12.2020 07:54
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
1 491
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
Можно ли создать политику SAS, используя строку подключения политики общего доступа? Как?

Если вы используете строку подключения политики общего доступа для создания политики SAS, мы можем просто создать политику для темы или подписки. Для пространства имен нам нужно реализовать его с помощью API поставщика ресурсов Azure. Это то, как вы сейчас используете. Для получения более подробной информации, пожалуйста, обратитесь к здесь.

Что касается того, как создать политику для темы или очереди, мы можем использовать пакет Azure.Messaging.ServiceBus.Administration.

Например

ServiceBusAdministrationClient client = new ServiceBusAdministrationClient(connectionString);
   
            QueueProperties queue =await client.GetQueueAsync("myqueue");
            queue.AuthorizationRules.Add( new SharedAccessAuthorizationRule(
                 "manage",
                 new[] { AccessRights.Manage, AccessRights.Send, AccessRights.Listen })
            );
            queue= await client.UpdateQueueAsync(queue);

            foreach (var rule in queue.AuthorizationRules) {
                Console.WriteLine(rule.KeyName);
            }

Есть ли способ создать политику SAS, не предоставляя приложению разрешение «Владелец данных служебной шины Azure»? Как?

Когда мы используем API поставщика ресурсов Azure для создания ресурса, у нас должны быть правильные разрешения Azure RABC. Что касается создания политики, нам нужны разрешения Microsoft.ServiceBus/namespaces/authorizationRules/action и Microsoft.ServiceBus/namespaces/authorizationRules/write. Если вы не хотите использовать Azure Service Bus Data Owner, вы можете создать собственную роль с этими разрешениями. Для получения более подробной информации, пожалуйста, обратитесь к здесь и здесь.

Другие вопросы по теме