DocumentDB用户权限 - 按分区键?

时间:2016-11-19 04:05:53

标签: permissions key azure-cosmosdb partition

我的DocumentDb应用程序几乎具有多租户架构。我计划在一开始就使用分区键,以确保如果它变得流行,整个事情就不必重新设计。当前的体系结构需要单个异构集合。每个租户架构的集合不起作用。

所有访问都包含租户ID,以防止泄漏。这不是我所关心的。

我需要客户端只读访问权限,因此我计划根据每个用户的权限让我的服务器发出资源令牌。

但我在文档中注意到每个资源每个用户只能拥有一个权限。我不想为每个文档创建权限。基本上我想要每个分区键的权限。这样,租户ID成为客户端读取的约束因素。

基本上,客户端设备只能读取集合中共享其分区密钥的所有文档。

如果资源令牌遭到入侵,它只会持续一个小时,并且不会让任何人访问整个集合,只有该租户的数据。

如果每个权限都有不同的分区密钥,我是否可以让一个DocumentDb数据库用户对同一个集合具有多个只读权限?

TIA

3 个答案:

答案 0 :(得分:4)

支持为每个资源创建多个权限(对于每个分区键)。这是一个例子:

User user = await client.CreateUserAsync(UriFactory.CreateDatabaseUri("SampleDatabase"), new User { Id = "NewUser" });
Permission permission = await client.CreatePermissionAsync(
    user.SelfLink, 
    new Permission
    {
        Id = "ReadA",
        PermissionMode = PermissionMode.Read,
        ResourcePartitionKey = new PartitionKey("Andersen"),
        ResourceLink = collection.SelfLink
    });

Permission permission2 = await client.CreatePermissionAsync(
    user.SelfLink,
    new Permission
    {
        Id = "ReadW",
        PermissionMode = PermissionMode.Read,
        ResourcePartitionKey = new PartitionKey("Wakefield"),
        ResourceLink = collection.SelfLink
    });

权限适用于具有相同分区键的所有文档。因此,当您使用具有权限的分区键访问文档时,DocumentDB会成功返回文档,但是使用另一个分区键,DocumentDB会返回授权错误:

DocumentClient restrictedClient1 = new DocumentClient(
   new Uri("https://FILLME:443/"), 
   permission.Token);

// Succeeds
await restrictedClient1.ReadDocumentAsync(
    UriFactory.CreateDocumentUri("SampleDatabase", "SampleCollection", "AndersenFamily"),
    new RequestOptions { PartitionKey = new PartitionKey("Andersen") });

// Fails
await restrictedClient1.ReadDocumentAsync(
    UriFactory.CreateDocumentUri("SampleDatabase", "SampleCollection", "WakefieldFamily"),
    new RequestOptions { PartitionKey = new PartitionKey("Wakefield") });

答案 1 :(得分:1)

这个答案帮助了我

Cosmos DB partitioned access to a database

使用发布者提供的代码,我可以获得工作的分区权限。

答案 2 :(得分:0)

最后,我写了一堆测试,看看我是否可以创建两个权限,每个权限都有不同的名称和不同的分区键,但对同一个用户和同一个集合的READ权限。不行。第二个导致了冲突结果。

因此,尝试通过仅在单个集合中为其分区发布资源令牌来保护租户的数据不起作用。

:(

唯一的选择是创建两个不同的集合,必要时复制数据。在这一点上,我不确定我对安全有多么偏执。

我要打桩并通过后端运行它。没有人得到任何钥匙。