使用預存存取原則來委派 Azure 儲存體的存取權

已完成

共用存取簽章 (SAS) 是無須分享您的 Azure 認證,卻可將存取權授與用戶端的安全方式。 這種易用性具有缺點。 就是只要有正確的 SAS,任何人都可以在此權杖仍然有效時存取檔案。 撤銷儲存體存取權的唯一方法就是重新產生存取金鑰。 重新產生作業需要更新所有使用舊有共用金鑰的應用程式,以使用新的存取金鑰。 另一個選項是建立 SAS 與預存存取原則的關聯。

在您將 SAS 功能新增至應用程式時,就會突顯以應用程式到期與存取控制為每個影像建立 SAS 的僵化。 您希望更新應用程式,以在儲存體容器上使用「預存存取原則」。 原則備妥之後,您想要測試可否更新到期日,並影響所有已建立的 SAS 權杖。

在本課程模組中,您會了解如何:

  • 使用預存存取原則。
  • 請使用 C# 儲存體 API 建立與新存取原則相關聯的 SAS 權杖。
  • 更新 Azure 入口網站中的預存存取原則,測試 SAS 權杖可否全部變更。

什麼是預存存取原則?

您可以在四種儲存體資源上建立預存存取原則:

  • Blob 容器
  • 檔案共用
  • 佇列
  • 資料表

您為 Blob 容器建立的預存存取原則,可用於此容器包含的所有 Blob 與容器本身。 預存存取原則是以下列屬性建立:

  • 識別碼:將用以參考預存存取原則的名稱。
  • 開始時間:原則可能開始使用之日期和時間的 DateTimeOffset 值。 這個值可以是 Null。
  • 到期時間:原則到期之日期和時間的 DateTimeOffset 值。 在這段時間之後,對儲存體的要求將會失敗,並顯示 403 錯誤碼訊息。
  • 權限:可為一個或所有 acdlrw 字串的權限清單。

Screenshot of the Azure portal showing a stored access policy.

建立預存存取原則

您可以使用 Azure 入口網站或 Azure CLI 命令來建立使用 C# 程式碼的共用存取原則。

使用 C# .NET 程式碼

BlobSignedIdentifier identifier = new BlobSignedIdentifier
{
    Id = "stored access policy identifier",
    AccessPolicy = new BlobAccessPolicy
    {
        ExpiresOn = DateTimeOffset.UtcNow.AddHours(1),
        Permissions = "rw"
    }
};

blobContainer.SetAccessPolicy(permissions: new BlobSignedIdentifier[] { identifier });

使用入口網站

在入口網站中,前往儲存體帳戶,然後移至 Blob 儲存體容器。 在左側,選取 [存取原則]。 若要新增預存存取原則,請選取 [+ 新增原則]

接著,您可以輸入所有必要參數。

Screenshot of the options for adding an access policy.

使用 Azure CLI 命令

az storage container policy create \
    --name <stored access policy identifier> \
    --container-name <container name> \
    --start <start time UTC datetime> \
    --expiry <expiry time UTC datetime> \
    --permissions <(a)dd, (c)reate, (d)elete, (l)ist, (r)ead, or (w)rite> \
    --account-key <storage account key> \
    --account-name <storage account name> \

建立 SAS 權杖並建立其與預存存取原則的關聯

讓我們建立預存存取原則與任何所需新 SAS 權杖的關聯。 針對公司患者診斷影像 Web 應用程式,您要更新現有程式碼以新增先前的程式碼。 然後,在建立 SAS 權杖的方法中,參考新的預存存取原則。

建立 SAS 權杖所需的所有現有程式碼:

BlobSasBuilder sas = new BlobSasBuilder
{
    BlobContainerName = blob.BlobContainerName,
    BlobName = blob.Name,
    Resource = "b",
    ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(1)
};
// Allow read access
sas.SetPermissions(BlobSasPermissions.Read);

參考新的存取原則即可更換原有程式碼。

// Create a user SAS that only allows reading for a minute
BlobSasBuilder sas = new BlobSasBuilder
{
    Identifier = "stored access policy identifier"
};

每個 Blob 容器最多可以儲存 5 項存取原則。