2

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

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

  1. 注册一个 代表我pc-shutdown-producer的应用程序Azure AdWindows Service
  2. 我创建了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 ;
        }

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

在此处输入图像描述

谢谢

4

2 回答 2

2

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

于 2020-05-11T07:45:02.770 回答
0

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

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

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

于 2021-08-18T14:04:51.920 回答