我试图让第三方访问我的天蓝色Blob容器.我希望他们能够读取容器中的任何文件.
我按照http://www.windowsazure.com/en-us/documentation/articles/storage-dotnet-shared-access-signature-part-2/的指导使用以下代码
但是我想为不同的第三方创建不同的密钥.
例如,我将与之分享的一把钥匙说公司A我将与公司B分享的另一个关键
无论如何我可以命名这些键,例如keyCompanyA,keyCompanyB
我想给他们合理的名字的原因是,如果我们与CompanyA的协议到期,我可以进入并删除该密钥.
public Void CreateAccessKeyBlob() { const string accountName = "myAccountName"; const string primaryAccessKey = "myAccessKey"; var conn = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", accountName, primaryAccessKey); var storageAccount = CloudStorageAccount.Parse(conn); //Create the blob client object. var blobClient = storageAccount.CreateCloudBlobClient(); //Get a reference to a container to use for the sample code, and create it if it does not exist. var container = blobClient.GetContainerReference("myContainer"); var sasConstraints = new SharedAccessBlobPolicy { SharedAccessExpiryTime = DateTime.UtcNow.AddYears(50), Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.List }; //Generate the shared access signature on the container, setting the constraints directly on the signature. var sasContainerToken = container.GetSharedAccessSignature(sasConstraints); Console.ReadLine(); }
BrentDaCodeM.. 5
不幸的是,我认为你对共享访问签名有一些误解.
共享访问签名(简单地说)是一个数字签名的权限单,用于访问一组资源.签名如果基于URL中的查询字符串参数包含的参数(区域,访问类型,开始/结束时间等等).然后,我们生成并附加"签名",这是这些参数的散列和存储帐户的"密钥".
因此,两个签名之间唯一真正的区别是其创建中使用的参数.
一旦生成签名,就无法撤销.但是,如果签名基于存储帐户访问策略(基本上是分配共享访问签名参数的快捷方式),则删除该策略时签名将无效.这是因为策略是与签名关联的参数,一旦删除该策略,就无法验证签名.
现在您可能认为可以为每个客户设置不同的策略.但是......可以与存储帐户关联的策略数量有限(我最后检查了5个).因此,这实际上无法扩展以支持多租户解决方案.
现在另一个关键点是您共享的代码中提到的"密钥"是WA存储帐户密钥.这些只有2个,它们是由系统为您生成的.绝不应与不需要对整个存储帐户拥有完全管理权限的任何人共享这些内容.您与客户真正分享的是我们之前讨论过的签名.
所有这些说,并且在不知道有关您的场景要求的更多细节的情况下,我建议您使用façade或Gatekeeper样式模式进行探索.使用façade,您可以使用一种服务来验证/授权请求,然后从存储中检索所请求的内容.此方法允许您将高速缓存等概念引入调用以及更复杂的请求类型的结果聚合.在这种情况下,网守模式也相当简单,产生更短的共享访问签名时间(小时/天而不是几周/几个月).用户将显示某种类型的凭据,然后您可以与您的数据库进行比较,以确定它们是否获得共享访问签名.
我希望这有帮助.:)