Azure 服务总线 - 未经授权的访问。执行此操作需要“发送”声明

use*_*747 9 servicebus azureservicebus azure-servicebus-queues azure-servicebus-topics azure-rbac

Azure Service Bus Queue我正在尝试从我的应用程序访问Windows Service。我正在关注这个样本。

我想Azure Service Bus使用Azure Service Principal 下面是我已实施的步骤来保护它

  1. 注册一个名为pc-shutdown-producer代表Azure Ad 我的应用程序Windows Service
  2. 我创建了我的 Azure,service bus namespace名为shutdowncomputer
  3. 在里面Access control (IAM),我添加了Role Assignment以下值
    • 角色 -Azure Service Bus Data Owner
    • 分配访问权限 -pc-shutdown-producer

据我所知,上述配置将让pc-shutdown-producer应用程序管理 servicebus 命名空间中的所有资源。4. 除此之外,我还提供了pc-shutdown-producer访问服务总线命名空间的委托 API 权限。

在此输入图像描述

下面是我的 C# 代码。

        public async Task Init()
        {
            string authority = $"https://login.windows.net/{TenantId}";

            ITokenProvider tokenProvider = TokenProvider.CreateAzureActiveDirectoryTokenProvider(AuthenticationCallback, authority);
            var endpoint = new Uri($"sb://shutdowncomputer.servicebus.windows.net/");
            var entityPath = "shutdownrequest";

            var qc = new QueueClient(endpoint.ToString(), entityPath, tokenProvider);

            Message m = new Message();
            m.Body = Encoding.ASCII.GetBytes("{id: 1, name: 'hemant'}");
            m.ContentType = "application/json";
            try
            {
                await qc.SendAsync(m);
            }
            catch (Exception ex)
            {
                //I am getting exception here. 
                //Unauthorized access. 'Send' claim(s) are required to perform this operation.
                throw ex;
            }
        }

        private async Task<string> AuthenticationCallback(string audience, string authority, object state)
        {
            string accessToken = string.Empty;
            IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(AppId)
                .WithAuthority(authority)
                .WithClientSecret(Password)
                .Build();

            var serviceBusAudience = new Uri("https://servicebus.azure.net");

            List<string> claims = new List<string>();
            claims.Add($"{serviceBusAudience}/.default");
            try
            {
                var result = await app.AcquireTokenForClient(claims.ToArray()).ExecuteAsync();
                accessToken = result.AccessToken;
            }
            catch (Exception ex)
            {
                //No issue here.
                Console.WriteLine(ex.Message);
            }
            //Successfully able to retrieve a token.
            return accessToken ;
        }
Run Code Online (Sandbox Code Playgroud)

执行后Init(),我收到以下异常消息。

Unauthorized access. 'Send' claim(s) are required to perform this operation. Resource: 'sb://shutdowncomputer.servicebus.windows.net/shutdownrequest'. TrackingId:52c0eedcf19d4513a8ec105943859764_G12, SystemTracker:gateway7, Timestamp:2020-05-11T06:59:01

更新1

根据 @Carl Zhao 的建议,我已提供管理员同意,pc-shutdown-producer但仍然遇到同样的问题。

在此输入图像描述

谢谢

Car*_*hao 5

权限不足,需添加管理员同意: 在此输入图像描述

  • 这是我的错。我没有添加“Azure 服务总线数据所有者”,而是添加了“所有者”角色。在我的 Azure 服务总线命名空间中更正此问题后,我能够发送消息。谢谢 (3认同)