Cosmos DB,API Azure Tables,在概述刀片中为您提供了2个端点
(1)的一个例子是
https://myname.documents.azure.com/dbs/tempdb/colls
(2)的一个例子是
https://myname.table.cosmosdb.azure.com/FirstTestTable?$滤波器= PartitionKey%20当量%20'car '%20于是%20RowKey%20当量%20'124'
您可以使用此邮递员脚本中的预先申请代码在客户端上为(1)创建授权代码:https://github.com/MicrosoftCSA/documentdb-postman-collection/blob/master/DocumentDB.postman_collection.json
这会给你一个像这样的代码:
授权:输入%3Dmaster%26ver%3D1.0%26sig%3DavFQkBscU ...
这对于玩其余网址非常有用
对于(2)我能找到的唯一代码来生成一个可以在服务器端运行的代码并给你一个这样的代码:
授权:SharedKey myname:JXkSGZlcB1gX8Mjuu ...
我必须从Fiddler那里得到这个
我的问题
(i)您是否可以在客户端上为案例(2)生成代码,就像案例(1)
一样(ii)您能否安全地从客户端使用Cosmos DB?
答案 0 :(得分:1)
如果您访问Azure门户以获取GA Table API帐户,您将无法再看到文档端点。而是仅公布Azure表端点(例如,X.table.cosmosdb.azure.com)。所以我们将重点放在那上面。
当使用除.NET SDK的直接模式以外的任何东西时,我们现有的SDK在与X.table.cosmosdb.azure.com端点通信时都使用SharedKey身份验证方案。还有一个SharedKeyLight方案也应该有效。两者都记录在https://docs.microsoft.com/en-us/rest/api/storageservices/authentication-for-the-azure-storage-services中。请务必阅读Table Service上的相关章节。需要注意的是,SharedKey标头直接与其关联的请求相关联。所以基本上每个请求都需要一个唯一的头这对安全性很有用,因为这意味着泄漏的标头只能在有限的时间内用于重放特定的请求。它不能用于授权其他请求。但当然这正是你想要做的事情。
另一种选择是SharedKeyLight标头,它更容易实现,因为它只需要一个日期和一个URL。
但是我们没有外部化的代码库来真正帮助它们。
但是还有另一种解决方案对Fiddler或Postman这样的事情非常友好,即使用https://blogs.msdn.microsoft.com/windowsazurestorage/2012/06/12/introducing-table-sas-shared-access-signature-queue-sas-and-update-to-blob-sas/中定义的SAS URL。
至少有两种获取SAS令牌的方法。一种方法是自己生成一个。以下是一些示例代码:
var connectionString = "DefaultEndpointsProtocol=https;AccountName=tableaccount;AccountKey=X;TableEndpoint=https://tableaccount.table.cosmosdb.azure.com:443/;";
var tableName = "ATable";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference(tableName);
await table.CreateIfNotExistsAsync();
SharedAccessTablePolicy policy = new SharedAccessTablePolicy()
{
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1000),
Permissions = SharedAccessTablePermissions.Add
| SharedAccessTablePermissions.Query
| SharedAccessTablePermissions.Update
| SharedAccessTablePermissions.Delete
};
string sasToken = table.GetSharedAccessSignature(
policy, null, null, null, null, null);
这将返回创建SAS URL所需的URL的查询部分。
获取SAS URL的另一种无代码方式是转到https://azure.microsoft.com/en-us/features/storage-explorer/并下载Azure存储资源管理器。当您启动它时,它将显示"连接到Azure存储"对话。在那种情况下:
结果将是一个包含完整URL和查询字符串的对话框。
所以现在我们可以获取该URL(或者使用代码中的查询输出自己创建它)并创建一个fiddler请求:
GET https://tableaccount.table.cosmosdb.azure.com/ATable?se=2018-01-12T05%3A22%3A00Z&sp=raud&sv=2017-04-17&tn=atable&sig=X&$filter=PartitionKey%20eq%20'Foo'%20and%20RowKey%20eq%20'bar' HTTP/1.1
User-Agent: Fiddler
Host: tableaccount.table.cosmosdb.azure.com
Accept: application/json;odata=nometadata
DataServiceVersion: 3.0
为了使请求更有趣,我添加了$ filter操作。这是一个OData过滤器,可让我们探索内容。注意,顺便说一句,要使过滤器工作,需要Accept和DataServiceVersion标头。但是您可以使用基本URL(例如,没有filter参数)在特定表上进行任何REST API调用。
请注意,SAS令牌的范围限定为单个表。因此,更高级别的操作无法使用此SAS令牌。