如果您访问 GA 表 API 帐户的 Azure 门户,您将不会再看到文档端点。而是仅公布 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 中。确保您阅读了专门针对表服务的部分。需要注意的是 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 存储”对话框。在这种情况下:
- 选择“使用连接字符串或共享访问签名URI”并点击下一步
- 选择“使用连接字符串”并从 Azure 门户中为您的 Azure Cosmos DB 表 API 帐户粘贴连接字符串,然后单击下一步,然后在下一个对话框中单击连接
- 在左侧的资源管理器窗格中,在“存储帐户”下查找您的帐户(不是 Cosmos DB 帐户(预览版)),然后单击表,然后右键单击要探索的特定表。在右键单击对话框中,您将看到“获取共享访问签名”条目,单击该条目。
- 将显示一个名为“生成共享访问签名”的新对话框。不幸的是,一个抱怨“NotImplemented”的错误对话框也会如此,你可以忽略它。只需在错误对话框中单击“确定”即可。
- 现在您可以选择如何配置您的 SAS,我通常只使用默认值,因为这样可以提供最广泛的访问权限。现在点击创建。
结果将是一个包含完整 URL 和查询字符串的对话框。
所以现在我们可以获取该 URL(或使用代码中的查询输出自己创建它)并创建一个提琴手请求:
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 令牌。