使用一個(gè)令牌或密鑰,向客戶提供受限制的直接訪問(wèn)特定的資源或服務(wù),以便由應(yīng)用程序代碼卸載數(shù)據(jù)傳輸操作。這個(gè)模式是在使用云托管的存儲(chǔ)系統(tǒng)或隊(duì)列的應(yīng)用中特別有用,并且可以最大限度地降低成本,最大限度地提高可擴(kuò)展性和性能。
客戶端程序和網(wǎng)絡(luò)瀏覽器經(jīng)常需要讀取和寫(xiě)入文件或數(shù)據(jù)流,并從一個(gè)應(yīng)用程序的存儲(chǔ)空間。通常,應(yīng)用程序?qū)⑻幚淼倪\(yùn)動(dòng)數(shù)據(jù),或者通過(guò)從存儲(chǔ)讀取它,并將其傳輸?shù)娇蛻舳?,或通過(guò)從客戶機(jī)讀取該載流并將其存儲(chǔ)在數(shù)據(jù)存儲(chǔ)中。然而,這種方法吸收了寶貴的資源,如計(jì)算,存儲(chǔ)和帶寬。
數(shù)據(jù)存儲(chǔ)要處理的上載和直接數(shù)據(jù)的下載,而不需要對(duì)應(yīng)用程序執(zhí)行任何處理移動(dòng)至該數(shù)據(jù)的能力,但是這通常需要在客戶端能夠訪問(wèn)該存儲(chǔ)區(qū)中的安全憑證。雖然這可能是一種有用的技術(shù)來(lái)減少數(shù)據(jù)傳送費(fèi)用的要求進(jìn)行擴(kuò)展的應(yīng)用,并以最大化性能,這意味著應(yīng)用程序不再能夠管理的數(shù)據(jù)的安全性。一旦客戶端已到數(shù)據(jù)存儲(chǔ)器進(jìn)行直接訪問(wèn)的連接,應(yīng)用程序不能充當(dāng)看門(mén)人。它不再是在該方法的控制,并且不能防止隨后上載或下載的數(shù)據(jù)存儲(chǔ)中。
這不是,可能需要使用不受信任的客戶的現(xiàn)代分布式系統(tǒng)實(shí)事求是的態(tài)度。相反,應(yīng)用程序必須能安全地控制對(duì)數(shù)據(jù)的訪問(wèn)是粒狀的方法,但仍然通過(guò)設(shè)置此連接,然后使客戶端能夠直接與數(shù)據(jù)存儲(chǔ)來(lái)執(zhí)行所需的讀或?qū)懖僮鞯耐ㄐ沤档头?wù)器上的負(fù)載。
要解決控制訪問(wèn)的數(shù)據(jù)存儲(chǔ)在那里的商店本身無(wú)法管理身份驗(yàn)證和客戶授權(quán)的問(wèn)題,一個(gè)典型的解決方案是限制訪問(wèn)的數(shù)據(jù)存儲(chǔ)的公共連接,并提供客戶端用鑰匙或令牌數(shù)據(jù)存儲(chǔ)本身可以驗(yàn)證。
這個(gè)密鑰或令牌通常被稱(chēng)為仆人鍵。它提供了對(duì)特定資源的時(shí)間限制的訪問(wèn)中,僅允許預(yù)定的操作,例如讀取和寫(xiě)入到存儲(chǔ)或隊(duì)列,或上載和下載的Web瀏覽器。應(yīng)用程序可以創(chuàng)建和發(fā)行代客鍵客戶快速,方便地設(shè)備和網(wǎng)絡(luò)瀏覽器,允許客戶端,而無(wú)需應(yīng)用程序直接處理數(shù)據(jù)傳送執(zhí)行所需的操作。這消除了處理開(kāi)銷(xiāo),并且在性能和可擴(kuò)展性所造成的影響,從該應(yīng)用程序和該服務(wù)器。
客戶端使用該令牌來(lái)訪問(wèn)特定資源中的數(shù)據(jù)存儲(chǔ)為只有特定的時(shí)期,并與訪問(wèn)權(quán)限的特定的限制,如示于圖1中指定的時(shí)間后,將鍵變?yōu)闊o(wú)效并且不會(huì)允許后續(xù)訪問(wèn)該資源。
圖1 - 模式概述
另外,也可以配置具有其他依賴(lài)關(guān)系,如該數(shù)據(jù)的位置的范圍的一個(gè)關(guān)鍵。例如,根據(jù)不同的數(shù)據(jù)存儲(chǔ)能力,所述鍵可在數(shù)據(jù)存儲(chǔ)區(qū)指定一個(gè)完整的表格,或在表中僅特定的行。在云存儲(chǔ)系統(tǒng)中的密鑰可以指定一個(gè)容器,或只是一個(gè)特定項(xiàng)目的容器內(nèi)。
鍵,也可以由應(yīng)用程序無(wú)效。這是一種有用的方法,如果客戶端通知該數(shù)據(jù)傳送操作完成的服務(wù)器。然后,服務(wù)器可以是無(wú)效鍵,以防止將其用于任何后續(xù)訪問(wèn)的數(shù)據(jù)存儲(chǔ)中。
使用這種模式可以簡(jiǎn)化管理對(duì)資源的訪問(wèn),因?yàn)闆](méi)有要求創(chuàng)建和驗(yàn)證用戶,授予權(quán)限,然后再刪除用戶。它也可以很容易地限制的位置,允許,和有效期,所有通過(guò)簡(jiǎn)單地產(chǎn)生一個(gè)合適的鍵在運(yùn)行時(shí)。的重要因素是限制的有效期,以及資源的特別的位置,盡可能緊,以使接收方可以將其用于僅在預(yù)定的目的。
在決定如何實(shí)現(xiàn)這個(gè)模式時(shí),請(qǐng)考慮以下幾點(diǎn):
其他問(wèn)題要注意實(shí)現(xiàn)這個(gè)模式的時(shí)候是:
這種模式非常適合于以下幾種情況:
這種模式可能不適合于下列情況:
微軟 Azure 支持共享訪問(wèn)簽名(SAS)對(duì) Azure 存儲(chǔ)的細(xì)粒度的訪問(wèn)控制,數(shù)據(jù)的blob,表和隊(duì)列,并為服務(wù)總線隊(duì)列和主題。一個(gè) SAS 令牌可配置為提供特定的訪問(wèn)權(quán)限,如讀,寫(xiě),更新和刪除特定表;一個(gè)鍵范圍的表內(nèi);隊(duì)列;一個(gè) blob;或 BLOB 容器。有效期可以是一個(gè)指定的時(shí)間段,或沒(méi)有時(shí)間限制。
天青 SAS 還支持可與特定資源相關(guān)聯(lián),如表或斑點(diǎn)服務(wù)器存儲(chǔ)訪問(wèn)策略。這個(gè)特征提供了額外的控制和靈活性相比,應(yīng)用程序生成的 SAS 令牌,并且應(yīng)該盡可能使用。在服務(wù)器中存儲(chǔ)策略中定義的設(shè)置可以在不發(fā)出新的令牌來(lái)改變,并反映在無(wú)需將發(fā)行新令牌的令牌,但在令牌本身定義的設(shè)置不能被改變。這種方法還使得有可能撤銷(xiāo)有效的 SAS 令牌之前它已經(jīng)過(guò)期。
注意:欲了解更多信息,請(qǐng)參閱表介紹 SAS(共享訪問(wèn)簽名),隊(duì)列 SAS 和更新的 Blob SAS 在 Azure 存儲(chǔ)團(tuán)隊(duì)博客和共享訪問(wèn)簽名,第 1 部分:了解 SAS 型號(hào) MSDN 上。
下面的代碼演示了如何創(chuàng)建一個(gè) SAS 的有效期為 5 分鐘。該 GetSharedAccessReferenceForUpload 方法返回一個(gè)SAS可用于將文件上傳到 Azure 的 Blob 存儲(chǔ)。
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 解決方案提供下載本指導(dǎo)意見(jiàn)提供包含此代碼的完整樣本。在此溶液中 ValetKey.Web 項(xiàng)目包含一個(gè) Web 應(yīng)用程序,包括如上所示的 ValuesController 類(lèi)。使用該 Web 應(yīng)用程序檢索 SAS 鍵,將文件上傳到 Blob 存儲(chǔ)的樣本客戶端應(yīng)用程序是在 ValetKey.Client 項(xiàng)目中可用。
更多建議: