Я внедряю мультитенантное приложение с использованием 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;
}