Я читал статью Microsoft о ресурсной авторизации с помощью IAuthorizatinService, но она позволяет авторизовать только один ресурс. Например, у меня есть класс User и класс File. Файл имеет владельца и может быть опубликован c или нет, поэтому файл можно просмотреть, только если он опубликован c или пользователь является владельцем этого файла. Мне нужно отобразить список всех файлов для разных пользователей, поэтому каждый пользователь увидит все файлы publi c и все принадлежащие им файлы. В обработчике авторизации у меня есть это:
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
OwnerOrPublicRequirement requirement,
File resource)
{
if (resource.IsPublic || context.User.Identity?.Name == resource.Owner)
{
context.Succeed(requirement);
}
return Task.CompletedTask;
}
Затем в контроллере я должен был сделать так:
List<File> authorizedFiles = new List<File>();
foreach (var file in _dbContext.Files)
{
var result = await _authorizationService
.AuthorizeAsync(User, file, new OwnerOrPublicRequirement());
if (result.Success)
{
authorizedFiles.Add(file);
}
}
Но это выглядит ужасно, потому что мне нужно загрузить все файлы из БД и затем отфильтруйте их один за другим. Что делать, если у меня есть миллионы файлов, и большинство из них не являются ни publi c, которые принадлежат пользователю? Я не смогу загрузить их все и отфильтровать, как это из-за нехватки памяти. Я могу переписать его в запрос LINQ, и пусть БД выполнит всю работу:
var authorizedFiles = _dbContext.Files
.Select(f => f)
.Where(f.IsPublic || f.User.Identity?.Name == f.Owner)
.ToList();
Но тогда у меня будет два места с кодом, который делает то же самое, поэтому всякий раз, когда мне нужно изменить логи авторизации c Я должен исправить две разные части кода. Так каков будет лучший способ сделать это?