使用共用存取簽章來委派 Azure 儲存體的存取權

已完成

透過使用共用存取簽章 (SAS),您可以委派資源的存取權。 用戶端無法直接存取儲存體帳戶憑證,且在細微層級中,您可以控制其存取的內容。

在調查完所有授權選項之後,您決定更詳細地查看 SAS。 您想在 C# .NET Web 應用程式中建立和使用 SAS。 您也想要遵循 Microsoft 使用 SAS 的最佳時機與最佳做法。

在本單元中,您會複習 SAS 在技術層級的運作方式,以及要使用 SAS 您必須撰寫的 C# 程式碼內容。

共用存取簽章的運作方式

SAS 有兩個元件: 指向一或多個儲存體資源的 URI,以及指出用戶端如何存取資源的權杖。

https://medicalrecords.blob.core.windows.net/patient-images/patient-116139-nq8z7f.jpg?sp=r&st=2020-01-20T11:42:32Z&se=2020-01-20T19:42:32Z&spr=https&sv=2019-02-02&sr=b&sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D 這樣的單一 URI 中,您可以將 URI 與 SAS 權杖分開,如下所示:

URI SAS 權杖
https://medicalrecords.blob.core.windows.net/patient-images/patient-116139-nq8z7f.jpg? sp=r&st=2020-01-20T11:42:32Z&se=2020-01-20T19:42:32Z&spr=https&sv=2019-02-02&sr=b&sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D

SAS 權杖包含下列元件或查詢參數。

查詢參數 欄位名稱 範例 描述
sp 已簽署的權限 sp=r 指出用戶端可以執行的一或多個作業。 值可以是複合式:a (新增)、c (建立)、d (刪除)、l (列出)、r (讀取) 和 w (寫入)。 sp=r 是唯獨;sp=acdlrw 授與所有可用權限。
st 開始時間 st=2020-01-20T11:42:32Z 存取開始的日期和時間。
se 到期時間 se=2020-01-20T19:42:32Z 存取結束的日期和時間。 根據開始日期,本範例會授與八小時的存取權。
spr 已簽署的通訊協定 spr=https 針對使用 SAS 所提出要求允許的通訊協定。 選擇性欄位,其可能值為 HTTPS 與 HTTP (預設值),或僅限 HTTPS。
sv 已簽署的版本 sv=2019-02-02 要使用的儲存體 API 服務版本。
sr 資源範圍 sr=b 要存取的儲存體類型。 可用的值包括 b (blob)、c (容器)、d (目錄)、f (檔案)、s (共用)
sig 簽章 sig=SrW1...wVZs%3D 密碼編譯簽章。

當您建立服務或帳戶共用存取簽章時,簽章會使用儲存體帳戶金鑰簽署。 如果使用具有儲存體存取權的 Microsoft Entra 安全性主體,則會建立使用者委派共用存取簽章。 您也會將 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 動作授與主體。

在 .NET 中建立 SAS

因為公司會提供協力廠商存取權,所以您無法使用 Microsoft Entra ID 為每位需要存取醫療影像的協力廠商建立服務主體。 應用程式會針對每個個別檔案使用儲存體帳戶金鑰。 下列步驟示範如何使用 C# 程式碼建立 SAS。

建立 Blob 容器用戶端以連線到 Azure 上的儲存體帳戶

BlobContainerClient container = new BlobContainerClient( "ConnectionString", "Container" );

擷取要建立 SAS 權杖的 Blob,並建立 BlobClient

foreach (BlobItem blobItem in container.GetBlobs())
{
    BlobClient blob = container.GetBlobClient(blobItem.Name);
}

針對要用來產生 SAS 權杖的 Blob 建立 BlobSasBuilder 物件

BlobSasBuilder sas = new BlobSasBuilder
{
    BlobContainerName = blob.BlobContainerName,
    BlobName = blob.Name,
    Resource = "b",
    ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(1)
};

// Allow read access
sas.SetPermissions(BlobSasPermissions.Read);

驗證對 BlobSasBuilder 物件 ToSasQueryParameters 方法的呼叫

StorageSharedKeyCredential storageSharedKeyCredential = new StorageSharedKeyCredential( "AccountName", "AccountKey");

sasToken = sas.ToSasQueryParameters(storageSharedKeyCredential).ToString();

最佳作法

為了降低使用 SAS 的潛在風險,Microsoft 提供一些指導方針:

  • 若要安全散發 SAS 並協助防止中間人攻擊,請一律使用 HTTPS。
  • 最安全的 SAS 是使用者委派。 請盡可能使用這種 SAS,因為其讓儲存體金鑰不必再儲存在程式碼中。 管理認證必須使用 Microsoft Entra ID;您的解決方案可能無法使用此選項。
  • 請嘗試將到期時間設為最小的實用值。 如果 SAS 金鑰遭到入侵,也只會在短時間內遭到惡意探索。
  • 套用最低必要權限的規則。 只授與必要的存取權。 例如,在應用程式中,唯讀存取權就已足夠。
  • 有些情況不適用 SAS。 當您無法承受使用 SAS 的風險時,請建立中介層服務來管理使用者及其對儲存體的存取權。

使用服務或帳戶 SAS,是建立 SAS 權杖與預存存取原則兩者關聯,最富有彈性且安全的方式。 在後續單元中,您會探索這些優勢及其運作方式。