Пропуск пользователя CosmosDB с ResourcePartitionKey не применяется

Я пытаюсь реализовать поведение, описанное в этом документе CosmosDB, с помощью дополнительных ограничений ResourcePartitionKey на разрешения пользователя, чтобы ограничить токен ресурса только доступом к документам, принадлежащим указанному ключу раздела, однако я не могу заставить его работать.

С помощью API REST SQL я не получаю ошибок с POST для создания объекта User Permission с парой ключей resourcepartitionkey, и как исходный возвращаемый объект, так и последующие GET также показывают "resourcepartitionkey", присутствующий при получении токена ресурса.

Используя маркер ресурса для соответствующей коллекции, указанной в разрешении, я могу перечислить все документы в коллекции. При использовании заголовка "x-ms-documentdb-partitionkey" я могу указать любой ключ parition, который мне нравится. Без заголовка "x-ms-documentdb-partitionkey" он просто возвращает всю коллекцию.

Коллекция является совершенно новой, неограниченной, 1000 RU с ключом раздела '/rpk'. Запрос на создание коллекции для коллекции показывает ключ раздела, настроенный следующим образом

"partitionKey": {
    "paths": [
        "\/rpk"
    ],
    "kind": "Hash"
} 

Ниже приведено разрешение пользователя, возвращаемое во время создания, с указанием "ключа_ресурса"

{
    "resource": "dbs/dbName/colls/collectionName/",
    "id": "read-collection",
    "resourcepartitionkey": "rpk1",
    "permissionMode": "read",
    "_rid": "lH9FACGGKwAhslfihB0pAA==",
    "_self": "dbs\/lH9FAA==\/users\/lH9FACGGKwA=\/permissions\/lH9FACGGKwAhslfihB0pAA==\/",
    "_etag": "\"0000ba07-0000-0000-0000-5b7418770000\"",
    "_ts": 1534335095,
    "_token": "type=resource&ver=1&sig=<resource token signature>"
}

Ниже приведен запрос документов с использованием вышеуказанного токена ресурса. Я ожидаю, что это не удастся из-за отсутствующего заголовка "x-ms-documentdb-partitionkey" для многораздельной коллекции, но он и успешно завершает работу и возвращает записи из всех ключей разделения в коллекции (только 2 в моем тестовом наборе данных)

GET https://accountname.documents.azure.com/dbs/dbName/colls/collectionName/docs HTTP/1.1
authorization: type%3dresource%26ver%3d1%26sig<resource token signature>
x-ms-version: 2017-02-22
x-ms-max-item-count: -1
x-ms-date: Wed, 15 Aug 2018 12:11:35 GMT
User-Agent: Mozilla/5.0 (Windows NT; Windows NT 10.0; en-AU) WindowsPowerShell/5.1.17134.165
Content-Type: application/json
Host: accountname.documents.azure.com

Тело ответа на вышеприведенный запрос, показывающее документы с ключами раздела rpk1 и rpk2, даже если пользовательское разрешение настроено на rpk1.

{
    "_rid": "lH9FAKbDh4c=",
    "Documents": [
        {
            "id": "blue",
            "rpk": "rpk1",
            "_rid": "lH9FAKbDh4cCAAAAAAAAAA==",
            "_self": "dbs\/lH9FAA==\/colls\/lH9FAKbDh4c=\/docs\/lH9FAKbDh4cCAAAAAAAAAA==\/",
            "_etag": "\"ec012ca1-0000-0000-0000-5b73ab440000\"",
            "_attachments": "attachments\/",
            "_ts": 1534307140
        },
        {
            "id": "red",
            "rpk": "rpk2",
            "_rid": "lH9FAKbDh4cDAAAAAAAAAA==",
            "_self": "dbs\/lH9FAA==\/colls\/lH9FAKbDh4c=\/docs\/lH9FAKbDh4cDAAAAAAAAAA==\/",
            "_etag": "\"ec012da1-0000-0000-0000-5b73ab580000\"",
            "_attachments": "attachments\/",
            "_ts": 1534307160
        }
    ],
    "_count": 2
}

Я предполагаю, что пропустил что-то очевидное, или использовал неверное значение для "resourcepartitionkey" в User Permission, но не могу определить, что именно. Любые мысли с благодарностью.

1 ответ

Решение

После многих часов проб и ошибок я наконец решил свою проблему, которая возникает во время создания разрешения пользователя POST.

Во-первых, хотя создание разрешения пользователя будет проверять имя "resourcePartitionKey", оно не проверяет чувствительность к регистру. При неправильной чувствительности возвращенный объект UserPermission имеет текущее значение, но не предоставляет никаких мер безопасности (опасная ситуация #1)

Во-вторых, входное значение не проверяется на наличие типа массив. Он снова принят и возвращен вам в объекте разрешения пользователя, но снова не обеспечивает контроль безопасности (опасная ситуация № 2)

Ниже приведен полный рабочий пример, где идентификатор разрешения называется "read-collection", а resourcePartitionKey настроен на "rpk1", наконец, демонстрирует ожидаемое поведение требования "x-ms-documentdb-partitionkey" для запроса и возвращает значения только из указанный ключ раздела.

POST https://accountname.documents.azure.com/dbs/dbName/users/userName/permissions HTTP/1.1
authorization: type%3dmaster%26ver%3d1.0%26sig<signature>
x-ms-version: 2017-02-22
x-ms-date: Thu, 16 Aug 2018 04:09:44 GMT
User-Agent: Mozilla/5.0 (Windows NT; Windows NT 10.0; en-AU) WindowsPowerShell/5.1.17134.165
Content-Type: application/json
Host: accountname.documents.azure.com
Content-Length: 215

{
    "resource":  "dbs/dbName/colls/collectionName/",
    "id":  "read-collection",
    "resourcePartitionKey":  [
                                 "rpk1"
                             ],
    "permissionMode":  "read"
} 

Если кто-то знает, где регистрировать DCR или ошибку для API-интерфейса SQL Rest CosmosDB, пожалуйста, дайте мне знать, так как без надлежащей проверки при создании разрешения ресурса токены ресурса могут распространяться среди клиентов с низким уровнем доверия, которые могут получить неожиданный полный доступ к данным сбора.

Другие вопросы по тегам