0

関数アプリと BLOB ストレージ アカウントの両方に、ユーザー割り当て ID を "ストレージ BLOB データ共同作成者" ロールとして追加しました。ストレージ アカウントに関数アプリの送信 IP アドレスを追加すると、コードは正常に機能します。ただし、ユーザー割り当て ID を使用したい。

「1 つ以上のエラーが発生しました。(この要求は、この操作を実行する権限がありません。)」というエラーが表示されます。

以前にこの問題に直面した人はいますか? あらかじめご了承ください。

            StorageCredentials storageCredential = new StorageCredentials(AccountName, AccessKey);
            CloudStorageAccount storageAccount = new CloudStorageAccount(storageCredential, true);

            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer blobContainer = blobClient.GetContainerReference("rawzone");
            BlobRequestOptions requestOptions = new BlobRequestOptions() { RetryPolicy = new NoRetry() };
            CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference("test");

            string result = "writing test file " + DateTime.Now.ToString();
            blockBlob.UploadTextAsync(result).Wait();
4

1 に答える 1

0

私は自分のサイトでテストしましたが、非常にうまく機能します。それを行うには、次の手順を参照してください。

1. ユーザー割り当てマネージド ID を作成Storage Blob Data Contributorし、ID に追加します。

ここに画像の説明を入力

2.Azure 関数で、ユーザー割り当てのマネージド ID を有効にし、以前に作成したユーザー ID を追加します。

3. Azure 関数 http トリガー内、およびユーザー マネージド ID を使用する関数内の次のコード。あなたが提供したコードはストレージ資格情報を使用しており、常にうまく機能します。

AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://storage.azure.com/");
TokenCredential tokenCredential = new TokenCredential(accessToken);
StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);
CloudBlobClient blobClient = new CloudBlobClient(new Uri("https://xxxxx.blob.core.windows.net"), storageCredentials);

CloudBlobContainer blobContainer = blobClient.GetContainerReference("container");
BlobRequestOptions requestOptions = new BlobRequestOptions() { RetryPolicy = new NoRetry() };
CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference("hello.txt");

string result = "writing test file " + DateTime.Now.ToString();
blockBlob.UploadTextAsync(result).Wait();

4.プロセスを制御するには、AzureServiceTokenProviderコンストラクターに渡されるか、AzureServicesAuthConnectionString環境変数で指定された接続文字列を使用します。

ユーザー ID をクリックして、そのアプリケーション ID を取得します。

RunAs=App;AppId={ClientId of user-assigned identity}

ここに画像の説明を入力

5.その後、azure 関数を実行すると、テキストが BLOB に書き込まれます。

ここに画像の説明を入力

于 2020-06-22T07:17:21.990 に答える