演習 - 保存されているアクセス ポリシーを使用して Azure Storage へのアクセスを委任する
SAS (Shared Access Signature)を個別に作成するのではなく、それぞれに独自のアクセス許可と有効期限を設定して、保存されているアクセス ポリシーに関連付けることができます ポリシーを変更すると、それに関連付けられているすべての SAS に影響します。
これで、会社の SAS を作成して管理するための、より優れた方法があることがわかりました。 新しいテスト ページを更新すると、保存されているアクセス ポリシーを使用することができます。
この演習では、Web アプリを更新して、格納されているアクセス ポリシーを使用して SAS を作成します。 次に、Azure CLI コマンドを使用してポリシーを変更し、アクセスが取り消されることをテストします。
保存されているアクセス ポリシーを作成するメソッドを追加する
Azure Cloud Shell で、PatientRecordController.cs ファイルを編集します。
code ~/sas/Controllers/PatientRecordController.cs
クラスの下部にある
GetBlobSas
メソッドの下に、保存されているアクセス ポリシーを作成するメソッドを記述します。// Use a stored access policy for the SAS private void CreateStoredAccessPolicy() { // Create a stored access policy for our blobs BlobSignedIdentifier identifier = new BlobSignedIdentifier { Id = _storedPolicyID, AccessPolicy = new BlobAccessPolicy { ExpiresOn = DateTimeOffset.UtcNow.AddHours(1), Permissions = "r" } }; _container.SetAccessPolicy(permissions: new BlobSignedIdentifier[] { identifier }); }
このメソッドは、アクセス ポリシー識別子にグローバル変数を使用します。 この変数を、
_container
という名前のBlobContainerClient
変数の宣言の下にあるクラスの先頭に追加します。private String _storedPolicyID = "patient-images-policy";
保存されているアクセス ポリシーは、生成された各 SAS トークンに使用されるため、クラスのインスタンス化で新しいメソッドを呼び出します。 メソッドの下部に呼び出しを追加します。
public PatientRecordsController(ILogger<PatientRecordsController> logger, IConfiguration iconfiguration) { _logger = logger; _iconfiguration = iconfiguration; _container = new BlobContainerClient( _iconfiguration.GetValue<string>("StorageAccount:ConnectionString"), _iconfiguration.GetValue<string>("StorageAccount:Container") ); CreateStoredAccessPolicy(); }
これで、アクセス ポリシーを使用するための
GetBlobSas
を簡素化できます。 それを使用するようメソッドを変更します。// Build a SAS token for the given blob private string GetBlobSas() { // Create a user SAS that only allows reading for a minute BlobSasBuilder sas = new BlobSasBuilder { Identifier = _storedPolicyID, BlobContainerName = _iconfiguration.GetValue<string>("StorageAccount:Container") }; // Use the shared key to access the blob var storageSharedKeyCredential = new StorageSharedKeyCredential( _iconfiguration.GetValue<string>("StorageAccount:AccountName"), _iconfiguration.GetValue<string>("StorageAccount:AccountKey") ); return '?' + sas.ToSasQueryParameters(storageSharedKeyCredential).ToString(); }
SAS トークン要求を処理するコードには、更新されたメソッドを呼び出すための小さな修正が必要です。
// GET PatientRecord/patient-nnnnnn/secure [HttpGet("{Name}/{secure}")] public PatientRecord Get(string name, string flag) { BlobClient blob = _container.GetBlobClient(name); return new PatientRecord { name=blob.Name, imageURI=blob.Uri.AbsoluteUri, sasToken=GetBlobSas() }; }
Ctrl+S に続けて Ctrl+Q を選択して、コードの変更を保存します。
新しいコードをテストする
Cloud Shell で、アプリをビルドします。
cd ~/sas/ dotnet build
前の演習を完了した後にポートが閉じている場合でも、
curl
コマンドを実行してもう一度開きます。curl -X POST http://localhost:8888/openPort/8000;
Web アプリの更新を実行します。
dotnet run
Web アプリの URL にアクセスし、末尾がスラッシュ (/) になっていることを確認します。
ホーム ページで、[Get all patients](すべての患者を取得) を選択します。
画像ファイル名をコピーします。 たとえば、patient-32589.jpg です。
ページの一番上にある [External companies](外部企業) メニュー リンクを選択します。
[Patient image filename](患者の画像ファイル名) フィールドに画像ファイル名を貼り付けます。
SAS トークンを設定するには [Gey Key](キーの取得) を選択します。
画像を表示するには、[View scan](スキャンの表示) を選択します。
保存されているアクセス ポリシーを編集する
サンドボックスのアクティブ化に使用したものと同じ資格情報を使って、Azure portal にサインインします。
Azure portal のリソース メニューで、[すべてのリソース] を選択します。
リソースの一覧で、[medical records] ストレージ アカウントを選択します。
概要ペインで、[コンテナー]、[patient-images] の順に選択します。
患者の画像メニューの [設定] の下で、[アクセス ポリシー] を選択します。
Web アプリによって、patient-images-policy という保存されているアクセス ポリシーが作成されていることに注目してください。
右側の [...] メニューを選択し、ポップアップ メニューから [編集] を選択します。
[ポリシーの編集] で、[アクセス許可] を [読み取り] から [リスト] に変更し、[OK] を選択して確定します。
[patient-images - アクセス ポリシー] ウィンドウで [保存] を選択します。
新しい SAS をテストする
Web アプリに戻ります。 [External companies](外部企業) ページで、[Get Key](キーの取得) を選択して新しい SAS トークンを作成します。
[View scan](スキャンの表示) を選択します。
Azure Storage から画像が返されず、403 認証エラーになります。