2

Azure Service Bus QueueアプリケーションからアクセスしようとしていWindows Serviceます。私はこのサンプルに従っています。

Azure Service Busこれを使用して保護したいAzure Service Principal 以下は、私が実装した手順です

  1. 私の代理で名前が付けpc-shutdown-producerられたアプリケーションを登録するAzure AdWindows Service
  2. service bus namespace名前付きの Azure を作成しましたshutdowncomputer
  3. 内部に、以下の値 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たが、まだ同じ問題が発生しています。

ここに画像の説明を入力

ありがとう

4

2 に答える 2

0

私の場合、エラーは誤解を招くものでした。

その理由は、構成ファイルにパスワードが欠落していたことです (これは Jenkins テスト エージェントで発生し、パスワードが設定されていない他のファイルからパスワードを取得していました)。

パスワードが間違っていた場合、エラーは「不正な操作を実行しようとしました。」だけです。しかし、パスワードがない場合 (例: 空のプロパティ値)、エラーは「不正なアクセスです。この操作を実行するには、'Send' クレームが必要です。」 でした。

于 2021-08-18T14:04:51.920 に答える