Космос БД секционированный доступ к базе данных - PullRequest
0 голосов
/ 24 июня 2018

Я внедряю мультитенантное приложение с использованием cosmosDB.Я использую ключи разделов для разделения данных нескольких пользователей.Следуя рекомендациям, я пытаюсь разрешить каждому арендатору иметь собственный токен доступа к базе данных.

Я создаю пользователя и разрешение и использую созданный токен для доступа к разделу.Но я получаю следующую ошибку:

Указанный ключ раздела либо не соответствует определению в коллекции, либо не соответствует значениям поля ключа раздела, указанным в документе.ActivityId: 1659037a-118a-4a2d-8615-bb807b717fa7, Microsoft.Azure.Documents.Common / 1.22.0.0, Windows / 10.0.17134 documentdb-netcore-sdk / 1.9.1

Мой код идетследующим образом:

Конструктор Инициирует клиента

public Projects (CosmosDbConfig cosmosConfig)
{
    config = cosmosConfig;
    client = new DocumentClient(new Uri(config.Endpoint), config.AuthKey);
    collectionUri = UriFactory.CreateDocumentCollectionUri(config.Database, config.Collection);
    config.AuthKey = GetUserToken().Result;;
    client = new DocumentClient(new Uri(config.Endpoint), config.AuthKey);
}

Функция get user создает пользователя и извлекает токен.Идентификаторы пользователей - это ключи разделов.

private async Task<string> GetUserToken()
{
        User user = null;
        try
        {
            try
            {
                user = await client.ReadUserAsync(UriFactory.CreateUserUri(config.Database, config.PartitionKey));

            var permission = await GetorCreatePermission(user, config.Collection, config.PartitionKey);
            return permission.Token;
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
        if (user == null)
        {
            user = new User
            {
                Id = config.PartitionKey
            };
            user = await client.CreateUserAsync(UriFactory.CreateDatabaseUri(config.Database), user);
            var permission = await GetorCreatePermission(user, config.Collection, config.PartitionKey);
            return permission.Token;
        }
        else
        {
            throw new Exception("");
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

Разрешения предоставляются для каждой коллекции и содержат имя коллекции в качестве идентификатора, поскольку идентификаторы уникальны для пользователя.

    private async Task<Permission> GetorCreatePermission(User user,
         string collection,
         string paritionKey)
    {
        var permDefinition = new Permission
        {
            Id = collection,
            PermissionMode = PermissionMode.All,
            ResourceLink = collectionUri.OriginalString,
            ResourcePartitionKey = new PartitionKey(paritionKey),
        };
        var perms = client.CreatePermissionQuery(user.PermissionsLink).AsEnumerable().ToList();
        var perm = perms.FirstOrDefault(x => x.Id == collection);
        if (perm != null)
        {
            return perm;
        }
        else
        {
            var result = await client.CreatePermissionAsync(user.SelfLink, permDefinition);
            perm = result.Resource;
            return perm;
        }

    }

Функция создания использует нового клиентаи это где ошибка происходит.

    public async Task<string> Create(Project p)
    {
        var result = await client.CreateDocumentAsync(collectionUri, p, new RequestOptions()
        { PartitionKey = new PartitionKey(config.PartitionKey),
        });
        var document = result.Resource;
        return document.Id;
    }

1 Ответ

0 голосов
/ 24 июня 2018

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

var docCollection = new DocumentCollection();
docCollection.Id = config.CollectionName;   
docCollection.PartitionKey.Paths.Add(string.Format("/{0}", config.PartitionKey );
collectionUri = UriFactory.CreateDocumentCollectionUri(config.Database, docCollection);
...