Permissions DocumentDB用户权限-按分区键?

Permissions DocumentDB用户权限-按分区键?,permissions,key,azure-cosmosdb,partition,Permissions,Key,Azure Cosmosdb,Partition,我的DocumentDb应用程序几乎具有多租户体系结构。我一开始就计划使用分区键,以确保如果它变得流行,整个东西不必重新设计。当前的体系结构需要单个异构集合。按租户收集体系结构不起作用 所有访问将包括租户id,以防止泄漏。那不是我关心的 我需要客户端只读访问,所以我计划让服务器根据每个用户的权限颁发资源令牌 但我在文档中注意到,每个用户每个资源只能有一个权限。我不想为每个文档创建权限。基本上,我希望每个分区键都有一个权限。这样,租户id就成为客户端读取的约束因素 基本上,客户端设备对集合中共享其

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

所有访问将包括租户id,以防止泄漏。那不是我关心的

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

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

基本上,客户端设备对集合中共享其分区密钥的所有文档具有只读访问权限

如果资源令牌被破坏,它只会持续一个小时,并且不会让任何人访问整个集合,只会访问租户的数据

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


TIA最后编写了一系列测试,看看我是否可以创建两个权限,每个权限都有不同的名称和不同的分区键,但是对于同一个用户和同一个集合上的相同读取权限。不行。第二个问题导致了冲突结果

因此,试图通过在单个集合中仅为租户的分区颁发资源令牌来保护租户的数据是行不通的

:(

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


我将通过后端运行它。没有人会获得任何密钥。

支持为每个资源(每个分区密钥)创建多个权限。下面是一个示例:

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") });
这个答案帮助了我:


使用海报提供的代码,我能够获得工作的分区权限。

旁注-请您添加一个指向说明这一点的文档的链接,DocumentDB团队应该对此进行更正。