Azure 服务总线 - 未经授权的访问。 'Send' 项声明需要执行此操作

Azure Service Bus - Unauthorized access. 'Send' claim(s) are required to perform this operation

我正在尝试从我的 Windows Service 应用程序访问 Azure Service Bus Queue。 我正在关注 this 示例。

我想使用 Azure Service Principal 来保护这个 Azure Service Bus 以下是我已经实施的步骤

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

据我所知,上述配置将使 pc-shutdown-producer 应用程序管理服务总线命名空间中的所有资源。 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 ;
        }

执行 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 但仍然有同样的问题。

谢谢

权限不足,应添加管理员同意:

就我而言,错误具有误导性

原因是配置文件中缺少密码(这发生在 Jenkins 测试代理中,它正在从其他未设置密码的文件中检索密码)。

如果我的密码有误,错误只是“试图执行未经授权的操作”。但是没有任何密码(例如空 属性 值),错误是“未经授权的访问。'Send' 声明需要执行此操作。”。