使用一個令牌或密鑰,向客戶提供受限制的直接訪問特定的資源或服務,以便由應用程序代碼卸載數(shù)據(jù)傳輸操作。這個模式是在使用云托管的存儲系統(tǒng)或隊列的應用中特別有用,并且可以最大限度地降低成本,最大限度地提高可擴展性和性能。
客戶端程序和網(wǎng)絡瀏覽器經(jīng)常需要讀取和寫入文件或數(shù)據(jù)流,并從一個應用程序的存儲空間。通常,應用程序將處理的運動數(shù)據(jù),或者通過從存儲讀取它,并將其傳輸?shù)娇蛻舳?,或通過從客戶機讀取該載流并將其存儲在數(shù)據(jù)存儲中。然而,這種方法吸收了寶貴的資源,如計算,存儲和帶寬。
數(shù)據(jù)存儲要處理的上載和直接數(shù)據(jù)的下載,而不需要對應用程序執(zhí)行任何處理移動至該數(shù)據(jù)的能力,但是這通常需要在客戶端能夠訪問該存儲區(qū)中的安全憑證。雖然這可能是一種有用的技術來減少數(shù)據(jù)傳送費用的要求進行擴展的應用,并以最大化性能,這意味著應用程序不再能夠管理的數(shù)據(jù)的安全性。一旦客戶端已到數(shù)據(jù)存儲器進行直接訪問的連接,應用程序不能充當看門人。它不再是在該方法的控制,并且不能防止隨后上載或下載的數(shù)據(jù)存儲中。
這不是,可能需要使用不受信任的客戶的現(xiàn)代分布式系統(tǒng)實事求是的態(tài)度。相反,應用程序必須能安全地控制對數(shù)據(jù)的訪問是粒狀的方法,但仍然通過設置此連接,然后使客戶端能夠直接與數(shù)據(jù)存儲來執(zhí)行所需的讀或寫操作的通信降低服務器上的負載。
要解決控制訪問的數(shù)據(jù)存儲在那里的商店本身無法管理身份驗證和客戶授權的問題,一個典型的解決方案是限制訪問的數(shù)據(jù)存儲的公共連接,并提供客戶端用鑰匙或令牌數(shù)據(jù)存儲本身可以驗證。
這個密鑰或令牌通常被稱為仆人鍵。它提供了對特定資源的時間限制的訪問中,僅允許預定的操作,例如讀取和寫入到存儲或隊列,或上載和下載的Web瀏覽器。應用程序可以創(chuàng)建和發(fā)行代客鍵客戶快速,方便地設備和網(wǎng)絡瀏覽器,允許客戶端,而無需應用程序直接處理數(shù)據(jù)傳送執(zhí)行所需的操作。這消除了處理開銷,并且在性能和可擴展性所造成的影響,從該應用程序和該服務器。
客戶端使用該令牌來訪問特定資源中的數(shù)據(jù)存儲為只有特定的時期,并與訪問權限的特定的限制,如示于圖1中指定的時間后,將鍵變?yōu)闊o效并且不會允許后續(xù)訪問該資源。
圖1 - 模式概述
另外,也可以配置具有其他依賴關系,如該數(shù)據(jù)的位置的范圍的一個關鍵。例如,根據(jù)不同的數(shù)據(jù)存儲能力,所述鍵可在數(shù)據(jù)存儲區(qū)指定一個完整的表格,或在表中僅特定的行。在云存儲系統(tǒng)中的密鑰可以指定一個容器,或只是一個特定項目的容器內(nèi)。
鍵,也可以由應用程序無效。這是一種有用的方法,如果客戶端通知該數(shù)據(jù)傳送操作完成的服務器。然后,服務器可以是無效鍵,以防止將其用于任何后續(xù)訪問的數(shù)據(jù)存儲中。
使用這種模式可以簡化管理對資源的訪問,因為沒有要求創(chuàng)建和驗證用戶,授予權限,然后再刪除用戶。它也可以很容易地限制的位置,允許,和有效期,所有通過簡單地產(chǎn)生一個合適的鍵在運行時。的重要因素是限制的有效期,以及資源的特別的位置,盡可能緊,以使接收方可以將其用于僅在預定的目的。
在決定如何實現(xiàn)這個模式時,請考慮以下幾點:
其他問題要注意實現(xiàn)這個模式的時候是:
這種模式非常適合于以下幾種情況:
這種模式可能不適合于下列情況:
微軟 Azure 支持共享訪問簽名(SAS)對 Azure 存儲的細粒度的訪問控制,數(shù)據(jù)的blob,表和隊列,并為服務總線隊列和主題。一個 SAS 令牌可配置為提供特定的訪問權限,如讀,寫,更新和刪除特定表;一個鍵范圍的表內(nèi);隊列;一個 blob;或 BLOB 容器。有效期可以是一個指定的時間段,或沒有時間限制。
天青 SAS 還支持可與特定資源相關聯(lián),如表或斑點服務器存儲訪問策略。這個特征提供了額外的控制和靈活性相比,應用程序生成的 SAS 令牌,并且應該盡可能使用。在服務器中存儲策略中定義的設置可以在不發(fā)出新的令牌來改變,并反映在無需將發(fā)行新令牌的令牌,但在令牌本身定義的設置不能被改變。這種方法還使得有可能撤銷有效的 SAS 令牌之前它已經(jīng)過期。
注意:欲了解更多信息,請參閱表介紹 SAS(共享訪問簽名),隊列 SAS 和更新的 Blob SAS 在 Azure 存儲團隊博客和共享訪問簽名,第 1 部分:了解 SAS 型號 MSDN 上。
下面的代碼演示了如何創(chuàng)建一個 SAS 的有效期為 5 分鐘。該 GetSharedAccessReferenceForUpload 方法返回一個SAS可用于將文件上傳到 Azure 的 Blob 存儲。
public class ValuesController : ApiController
{
private readonly CloudStorageAccount account;
private readonly string blobContainer;
...
/// <summary>
/// Return a limited access key that allows the caller to upload a file
/// to this specific destination for a defined period of time.
/// </summary>
private StorageEntitySas GetSharedAccessReferenceForUpload(string blobName)
{
var blobClient = this.account.CreateCloudBlobClient();
var container = blobClient.GetContainerReference(this.blobContainer);
?
var blob = container.GetBlockBlobReference(blobName);
?
var policy = new SharedAccessBlobPolicy
{
Permissions = SharedAccessBlobPermissions.Write,
?
// Specify a start time five minutes earlier to allow for client clock skew.
SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5),
?
// Specify a validity period of five minutes starting from now.
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(5)
};
?
// Create the signature.
var sas = blob.GetSharedAccessSignature(policy);
?
return new StorageEntitySas
{
BlobUri = blob.Uri,
Credentials = sas,
Name = blobName
};
}
?
public struct StorageEntitySas
{
public string Credentials;
public Uri BlobUri;
public string Name;
}
}
注意:
在 ValetKey 解決方案提供下載本指導意見提供包含此代碼的完整樣本。在此溶液中 ValetKey.Web 項目包含一個 Web 應用程序,包括如上所示的 ValuesController 類。使用該 Web 應用程序檢索 SAS 鍵,將文件上傳到 Blob 存儲的樣本客戶端應用程序是在 ValetKey.Client 項目中可用。
更多建議: