使用一个令牌或密钥,向客户提供受限制的直接访问特定的资源或服务,以便由应用程序代码卸载数据传输操作。这个模式是在使用云托管的存储系统或队列的应用中特别有用,并且可以最大限度地降低成本,最大限度地提高可扩展性和性能。
客户端程序和网络浏览器经常需要读取和写入文件或数据流,并从一个应用程序的存储空间。通常,应用程序将处理的运动数据,或者通过从存储读取它,并将其传输到客户端,或通过从客户机读取该载流并将其存储在数据存储中。然而,这种方法吸收了宝贵的资源,如计算,存储和带宽。
数据存储要处理的上载和直接数据的下载,而不需要对应用程序执行任何处理移动至该数据的能力,但是这通常需要在客户端能够访问该存储区中的安全凭证。虽然这可能是一种有用的技术来减少数据传送费用的要求进行扩展的应用,并以最大化性能,这意味着应用程序不再能够管理的数据的安全性。一旦客户端已到数据存储器进行直接访问的连接,应用程序不能充当看门人。它不再是在该方法的控制,并且不能防止随后上载或下载的数据存储中。
这不是,可能需要使用不受信任的客户的现代分布式系统实事求是的态度。相反,应用程序必须能安全地控制对数据的访问是粒状的方法,但仍然通过设置此连接,然后使客户端能够直接与数据存储来执行所需的读或写操作的通信降低服务器上的负载。
要解决控制访问的数据存储在那里的商店本身无法管理身份验证和客户授权的问题,一个典型的解决方案是限制访问的数据存储的公共连接,并提供客户端用钥匙或令牌数据存储本身可以验证。
这个密钥或令牌通常被称为仆人键。它提供了对特定资源的时间限制的访问中,仅允许预定的操作,例如读取和写入到存储或队列,或上载和下载的Web浏览器。应用程序可以创建和发行代客键客户快速,方便地设备和网络浏览器,允许客户端,而无需应用程序直接处理数据传送执行所需的操作。这消除了处理开销,并且在性能和可扩展性所造成的影响,从该应用程序和该服务器。
客户端使用该令牌来访问特定资源中的数据存储为只有特定的时期,并与访问权限的特定的限制,如示于图1中指定的时间后,将键变为无效并且不会允许后续访问该资源。
另外,也可以配置具有其他依赖关系,如该数据的位置的范围的一个关键。例如,根据不同的数据存储能力,所述键可在数据存储区指定一个完整的表格,或在表中仅特定的行。在云存储系统中的密钥可以指定一个容器,或只是一个特定项目的容器内。
键,也可以由应用程序无效。这是一种有用的方法,如果客户端通知该数据传送操作完成的服务器。然后,服务器可以是无效键,以防止将其用于任何后续访问的数据存储中。
使用这种模式可以简化管理对资源的访问,因为没有要求创建和验证用户,授予权限,然后再删除用户。它也可以很容易地限制的位置,允许,和有效期,所有通过简单地产生一个合适的键在运行时。的重要因素是限制的有效期,以及资源的特别的位置,尽可能紧,以使接收方可以将其用于仅在预定的目的。
在决定如何实现这个模式时,请考虑以下几点:
其他问题要注意实现这个模式的时候是:
这种模式非常适合于以下几种情况:
这种模式可能不适合于下列情况:
微软 Azure 支持共享访问签名(SAS)对 Azure 存储的细粒度的访问控制,数据的blob,表和队列,并为服务总线队列和主题。一个 SAS 令牌可配置为提供特定的访问权限,如读,写,更新和删除特定表;一个键范围的表内;队列;一个 blob;或 BLOB 容器。有效期可以是一个指定的时间段,或没有时间限制。
天青 SAS 还支持可与特定资源相关联,如表或斑点服务器存储访问策略。这个特征提供了额外的控制和灵活性相比,应用程序生成的 SAS 令牌,并且应该尽可能使用。在服务器中存储策略中定义的设置可以在不发出新的令牌来改变,并反映在无需将发行新令牌的令牌,但在令牌本身定义的设置不能被改变。这种方法还使得有可能撤销有效的 SAS 令牌之前它已经过期。
注意: 欲了解更多信息,请参阅表介绍 SAS(共享访问签名),队列 SAS 和更新的 Blob SAS 在 Azure 存储团队博客和共享访问签名,第 1 部分:了解 SAS 型号 MSDN 上。
下面的代码演示了如何创建一个 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 项目中可用。